手動でやっていると、新しい ファームウェア が出た時に面倒になったり、なにか入れ忘れたりするから、スクリプトに覚えさせて 何度でも再現できるようにしているわけだ。
このスクリプトを 新たに作りなおして公開することにした。
- http://nmj.sumomo.ne.jp/my_cfw/mkcfw-n7b-2.1.zip (最新)
- Dalvik Turbo VM -- Fruit Slice などが動かないため、デフォルトから外した。
- YouTube.apk , Vending.apk -- osakanataro 氏 CFW 10/18 日版を ベースに。(sys_app に置いた)
- mips 版 su(3.0.1) + Tasselhof-RootScript版 Superuser.apk (一応動く模様)
- nicoWnnG の更新方法を変更。
- osakanataro 氏版 busybox を とりあえず xbin/unzip として置いた。
- VpnService.apk など不要そう システムアプリをアンインストール (/system/app-removed に移動)
主な変更点: - Dalvik Turbo VM -- Fruit Slice などが動かないため、デフォルトから外した。
- http://nmj.sumomo.ne.jp/my_cfw/mkcfw-n7b-2.0.zip
- 下記の mount の問題に対応したスクリプト : mkcfw-2.0a.sh
ものはこれ。Linux マシンを誰もが持っているわけではないので、今回 実機でも動かせるように作りなおした。そのかわり Linux でやる場合には busybox のインストールが必要になる。
実機での動作確認はまだなのだが、近い環境ではテストした。たぶん動くはず。
これを使って、10/29 版の ファームウェアから CFW を作ると osakanataro 氏の nicoWnnG と RootKit が入り、入れ忘れた TurboFly3D も入る。あと heapsize も 40m になる。また、想定外の変更は入らないことも確認した。
11/08 版に対しても、同じ変更内容の CFW は生成できた。(動作確認はまだ)
使い方は、(動くのならば) CFW を入れた 実機の方が簡単。
SDカードに解凍して、そこに オリジナルの system.img を置く
adb で 解凍したディレクトリ にある スクリプトを実行する。
これだけで、system-out.img/userdata-out.img というファイルが出来あがる。新しい ファームウェアだと 添付されている boot.img と合わせて ファームウェアを書き込めば OK 。( recovery.cpio.img を取り出し忘れたのだが、古いので代用できる )
たとえ(CFW の生成が)動かないとしても、所詮はスクリプトなので、多少の知識がある人ならば自分で直せるだろう。
env というファイルに いくつかの設定があるので、いくつかのパターンで CFW が作れる。これでより多くの人に試してもらって、次の CFW を仕上げたいと思う。興味がある人は是非試して欲しい。
README も入れておいたので、読んでおいて欲しい。
追記: ようやく実機で試せたのだが、
mount: cannot setup loop device: No such file or directory
cannot mount
というエラーが出た。これは、/dev/loop0 とかがないため。しかも umount しても自動では 開放してくれないので、次々と loop デバイスを使ってくれる。
mknod /dev/loop0 b 7 0
mknod /dev/loop1 b 7 1
mknod /dev/loop2 b 7 2
mknod /dev/loop3 b 7 3
mknod /dev/loop4 b 7 4
mknod /dev/loop5 b 7 5
mknod /dev/loop6 b 7 6
こうやって作らないとダメだった。
losetup -d /dev/loop0
losetup -d /dev/loop1
losetup -d /dev/loop2
losetup -d /dev/loop3
losetup -d /dev/loop4
losetup -d /dev/loop5
losetup -d /dev/loop6
終わったら、とりあえずこれやって開放しないとダメ。(busy でエラーになるのが出るかも、でも他のアプリなので気にしない。)
あと REDME.txt にも書いたが、busybox sh で起動する。
以上の対策で作れることは確認。で、次 ...
11/08 版で試したが、一応立ち上がって来た。言語の設定を直したので、端から日本語になっている。(とは言え多言語対応ではなかった。一回 英語にしたら MoreLocale2 のお世話になることに。)
とりあえず、動かないらしい TurboFly3D を試したが、やっぱりダメ。ただ 強制終了ではなく、突然終了している。メモリは関係なさそう。heap 40m にしても レポートと変わらない感じ。
カメラの collor effect というのを試したが問題なさそうな気が。
Superuser はよく分からない。使えるアプリもいまのところ持ってないし。
とりあえず、対策は必要なものの、実機だけで動くものは作れることは確認できた。
スクリプトについてのメモ
実行環境
このスクリプトは、実機 / Linux マシン / qemu-user 環境 の 3 つで動かすことができる。
ただし、環境の差異は env という設定ファイルで行っている。これについて
REPLACE_DIR=/system # for self environment
REPLACE_DIR=`pwd`/../system #
#BASE_DAT_FILE=$REPLACE_DIR/userdata.img
BASE_DAT_FILE=`pwd`/userdata-v65-20111111.img
IN_NIB_FILE=`pwd`/RK43A_60BWFRT_RAMOSV65_20110817_1.bin
IN_SYS_FILE=`pwd`/system.img
IN_DAT_FILE= # extract automatically from system.img
OUT_SYS_FILE=`pwd`/system-out.img
OUT_DAT_FILE=`pwd`/userdata-out.img
これは、一番最後に作った V65Pro 用の設定の例
- REPLACE_DIR
CFW 11/11 版の system.img を mount または展開したディレクトリ。実機なら /system だが、Linux マシンの場合 は、mkcfw-xx を展開したディレクトリの横に system を 展開していることを想定している。
CFW では、フォントやら システムアプリやらいろいろコピーしているので、ここからまずコピーする。 - BASE_DAT_FILE
CFW の userdata.img の指定。novo7basic 用なら userdata.img をコピーしているので、$REPLACE_DIR/userdata.img で良いのだが、v65pro 用だとコピーしてなかったので、別途指定が必要。
これ自体がベースで、ベースファームウェアからいくつかのファイルをコピーするような動作になっている。、 - IN_NIB_FILE
ベースファームウェアの指定で、A3 / V65Pro 用のみにある。ここから専用のコマンド split_nib を使って system.img を取り出している。
$IN_NIB_FILE が存在しないと system.img を使おうとする。 - IN_SYS_FILE
ベースファームウェアの指定(2) 。 - IN_DAT_FILE
これはベースファームウェアの userdata.img の指定なのだが、system.img から取り出すようにしているので、無指定にする。 - OUT_SYS_FILE, OUT_DAT_FILE
生成する CFW のファイル名の指定。変更してもかまわない - PATH=/system/bin:/system/xbin:$PATH
上の例に出さないが PATH を変更しているところもある。これは、後述の qemu-user 環境用。他の環境でも効いてしまうが、影響がないことを期待している。
qemu-user 環境
- ファイル・ツリー の構築。
たぶん CFW の system.img を TOP/system にマウントするだけで良いと思うのだが、boot.img から 取り出した ramdisk を TOP に展開している。
ramdisk のイメージは、 src に置いた split_bootimg.c を使って 取り出し、
# zcat boot.img-ramdisk.gz | cpio -id
で展開。
その上で、qemu-user-for-x86_64.tgz を展開する - chroot
# chroot /system/bin/busybox sh
こんな感じで、その環境に入る。
これは何かというと ... 実機と同じ ファイル・ツリーを Linux マシンに構築して、それを chroot して動かすという エミュレーションの環境。
設定について
APPLY_TURBO_VM=yes
APPLY_LARGE_HEAP=no
APPLY_EXTERNAL_BROWSER=yes
APPLY_ROOTKIT=yes
CLEANUP=yes
これは、最後に作った V65Pro 用の設定。
- APPLY_TURBO_VM
- APPLY_LARGE_HEAP
- APPLY_EXTERNAL_BROWSER
- APPLY_ROOTKIT
- CLEANUP
mkcfw-a3-2.1.zip のテスト (Ronzi A3)
- 2011/11/11 版 の CFW をインストール
- SDCARD に mkcfw を展開
- そこに、zImage_rz_60_a3_20110511.bin と userdata-a3-20111111.img をコピー
- system-init.img.gz を 11/11 版 を作ったときのものに差し替え
別途作った CFW が動かなかったので、入れ替えてみた。が、どうも関係なさそう。 - env の REPLACE_DIR 書き換え
- mkcfw に cd して busybox sh mkcfw.sh で実行
実行結果:
# busybox sh mkcfw.sh
busybox sh mkcfw.sh
========= modes
SELF=yes (ARCH=mips)
APPLY_TURBO_VM=yes
APPLY_LARGE_HEAP=no
APPLY_EXTERNAL_BROWSER=yes
APPLY_ROOTKIT=yes
========= files testing and mounting
REPLACE_DIR=/systemis OK
BASE_DAT_FILE=/mnt/sdcard1/mkcfw-a3-2.1/userdata-a3-20111111.img-- existant
Original Firmware : /mnt/sdcard1/mkcfw-a3-2.1/zImage_rz_60_a3_20110511.bin-- extracting
writing mbr-xboot.bin 842 KBytes
writing boot.img 2678 KBytes
writing recovery.img 2984 KBytes
writing system.img 210905 KBytes
writing userdata.img 67312 KBytes
writing cache.bin 30724 KBytes
writing vfat.bin 8 KBytes
ro.build.version.incremental=eng.android.20110503.162254
using large system.img -- mount OK -- copying -- done
===== building /mnt/sdcard1/mkcfw-a3-2.1/userdata-out.img
replacing out/lib/mips/*.so
removing nicoWnnG
appending nicoWnnG-2011.1115.1-mips.apk
== appling rootkit (apps)
copying rootcheck
copying rootexplorer
== done rootkit
filling zero
== done userdata
===== building /mnt/sdcard1/mkcfw-a3-2.1/system-out.img
changing build.prop
#ro.sf.lcd_density=240
dalvik.vm.heapsize=24m
copying framework and some libs
removing PinyinIME
removing Provision
removing Phone
removing VpnServices
replacing AppWidgetPicker
replacing Gmail
replacing GoogleBackupTransport
replacing GoogleCalendarSyncAdapter
replacing GoogleContactsSyncAdapter
replacing GoogleFeedback
replacing GooglePartnerSetup
replacing Maps
replacing MarketUpdater
replacing NetworkLocation
replacing OneTimeInitializer
replacing QuickSearchBox
replacing Talk
replacing YouTube
replacing kickback
replacing soundback
replacing GoogleServicesFramework
replacing Vending
replacing IngenicScreenCalibration
replacing Launcher2
replacing SeeJoPlayer
replacing Browser
replacing HTMLViewer
replacing LatinIME
replacing SpareParts
replacing DroidSansJapanese.ttf
== appling turbo vm
copying libdvm.so-turbo
replacing libdvm.so
== done turbo vm
copying new userdata.img
== appling rootkit
copying su
copying Superuser.apk
== done rootkit
filling zero
done
#
動作確認:
- Superuser.apk
Root Check
- Superuser 2.3.6.3 -- OK
- /system/bin/su がない が OK
- user/group 0.0 の確認 OK
- busybox v1.15.2 -- OK
Root Explorer
- /system の remount できず。(n7b は何故か最初から rw)
Screen Shot It
- rootの権限は許可したが 、動かない。
rootの権限がないと言われる。
mkcfw-v65-2.1.zip のテスト (Ramos V65pro)
- V65Pro は、adb が動かないみたいなので、Ronzi A3 で代用
- SDCARD に mkcfw を展開
- そこに、RK43A_60BWFRT_RAMOSV65_20110817_1.bin と system-v65-20111111.img,userdata-v65-20111111.img をコピー
- SDCARD に system ディレクトリを作成し system-v65-20111111.img を mount 。
mknod /dev/loop0 b 7 0
mknod /dev/loop1 b 7 1
mknod /dev/loop2 b 7 2
mknod /dev/loop3 b 7 3
mknod /dev/loop4 b 7 4
mknod /dev/loop5 b 7 5
mknod /dev/loop6 b 7 6
mount -t ext4 -o loop mkcfw-v65-2.1/system-v65-20111111.img system - env の REPLACE_DIR は無変更
- mkcfw に cd して busybox sh mkcfw.sh で実行
- 終わったら umount /mnt/sdcard1/system を必ずする。
動作確認:- Superuser.apk
Root Check
- Superuser 2.3.6.3
- /system/bin/su がない -- NG?
- busybox v1.15.2 -- OK
-
-rwsr-sr-x root root 25976 2011-11-23 23:45 su
-rwsr-sr-x root root 113920 2011-08-09 13:29 su-bak
Ronzi A3 と同じにしているのに、何故動作が違うのだろう?
あと adb が動かないのも不便。なんとかしたいものだが ...
Root Explorer
-
Screen Shot It
- - Media Player
実は、ライブラリとか 2組み入っている。jz4760b と jz4760 の 2 つのディレクトリがあるものは、jz4760 を削除。system/lib の libomx*.so と libopencore* は、jz4760b にもあるので削除。
こうやって inode 数を稼いでいる。
で、動作確認してみたら 予想どおり動いた。
- Superuser.apk
以下設計メモ(初期)
スクリプトを書くにしても、どういうコマンドがどういうオプションで使えるかについては、Android 実機 の環境はけっこうクセがある。busybox 自体、標準的とは言えないし、Android の toolbox はさらに簡略化されている。
ls など 両方にあるものもあり、busybox ls としなければ困る場合もある。
さらに、この CFW ではスクリプトを書きやすいように busybox からのリンクを作っている。
というわけで コマンドなどについて整理が必要。
あと、もともと この CFW は Linux 上のスクリプトで作っているが、busybox にもないものがある。また、付け足しなどしていて、けっこうひどくなっている。再設計しないと まずいことになりそうだ。
まずは、どうやって作っているかについて整理しよう。
- system.img
もともとは、
# dd if=/dev/zero of=system-out.img bs=1024k count=256
# losetup /dev/loop6 system-out.img
# mkfs.ext4 -N 1024 -b 1024 /dev/loop6
# losetup -d /dev/loop6
こんな感じで手動で作ったのだった。
で、出来たものを
custom_files/system-init.img.gz
gzip で圧縮しておいて、
# gzip -d < custom_files/system-init.img.gz > system-out.img
# mount system-out.img out_sys -o loop
# tar -C n7b_sys -cf - . | \
# tar -C out_sys -xpf -
こんな風にしていたのだった。
ここで最初の問題- busybox tar を使わないといけないにしても -p オプションがない。
- cpio に変えるか。-- cpio はリンクしているからそのまま使える。にしても -p 相当をちゃんとやってくれるのか? 要確認
- mount も 2 つある。これは、使われているという点で、toolbox の方が良いかも。
# mount -o loop -t ext4 system-out.img out_sys
mount もこんな風にしなければならないし、カレントディレクトリ で問題ないか要チェック。
- busybox tar を使わないといけないにしても -p オプションがない。
- userdata.img
実をいうと、userdata.img は、V65Pro の userdata.img を持ってきて、中味を全部 delete して使っている。
やはり、とりあえず全コピー。これで 準備しておいて、次の段階に移る。
今回はどうするか ... というと サイズが大きくなった userdata.img が /system にあるので、それを使う。とにかく mkfs できないのだ。... となると、どこからか取ってこないといけない。
こうやって、元の system.img / userdata.img と system-out.img / userdata-out.img の 4 つを mount する。 - userdata-out.img の作成
まずは、app 以下を全部削除。AngryBirds をシステムからコピーして、
custom_files/lib/local.prop
を -p オプション付きで コピー。cp は busybox の cp がリンクされている。
次に osakanataro 氏の /data.data を tar ファイルで 持っていたものを解凍
さて、今回はどうするか。userdata.img をコピーし、削除しないなら ファイルは残っている。新たに外から持ち込むこともできるし、動いているマシンのデータを取り出すこともできる。... いったいどれが良いのか?
次、コピーすべきアプリは、custom_files/app に置いておいたものをコピーしている。
これも もともと あるものだ。
... 結局 コピーした userdata.img をまず使い、それをモディファイしていく やりかたの方が良さそう。
あと、turbofly3d は、オリジナルの userdata.img にあるはずだから 忘れずにコピーしないと。 - system-out.img
ちょっと端折る。- 基本は、custom_files/sys_app にあるものを app にコピー。
- その上で tar ファイルで持っている 10/24 版の システム アプリを解凍
- あと、いくつかの app の ファイルを削除
- custom_files/lib/libdvm.so を -p 付きでコピー
- custom_files/fonts にあるファイルを fonts にコピー
- custom_files/sys_patch/*.patch を patch コマンドで当てる。
- xbin/ に busybox へのリンクを作成
BUSYBOX_LINKS="awk basename bunzip2 bzcat bzip2 chroot cp cpio diff \
dirname du echo ed egrep expr getopt gunzip head hexdump hostname \
less losetup mknod od patch printf pwd script sed sort swapoff \
swapon tail tar touch uname unzip vi wc"
今回はすでに /system/app などに入っている。そのかわり何をコピーするのかの リストを作らないといけない。
パッチは、元ファイルがない。これは外から持ち込まないと。 - 基本は、custom_files/sys_app にあるものを app にコピー。
- 最後に dd コマンドを使って、/dev/zero から フルになるまで書き、削除。
これは、圧縮が効くようにするため。
以下ただのメモ
環境変数
/init.rc で設定されているもの
init.rc: export PATH /sbin:/system/sbin:/system/bin:/system/xbin
init.rc: export ANDROID_ROOT /system
init.rc: export ANDROID_ASSETS /system/app
init.rc: export ANDROID_DATA /data
init.rc: export EXTERNAL_STORAGE /mnt/flash
init.rc: export EXTERNAL_FLASH_STORAGE /mnt/sdcard
init.rc: export EXTERNAL_UDISK_STORAGE /mnt/udisk
mount の仕方
init.rc: mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000
init.rc: mount rootfs rootfs / ro remount
init.rc: mount tmpfs none /mnt/tmpfs nosuid nodev size=1m
init.rc: mount ext4 /dev/block/mmcblk0p1 /system
init.rc: mount ext4 /dev/block/mmcblk0p1 /system ro remount
init.rc: mount ext4 /dev/block/mmcblk0p2 /data nosuid nodev
init.rc: mount ext4 /dev/block/mmcblk0p3 /cache nosuid nodev
mount の仕方2
disk_preparing.sh:/system/bin/mount -t ext4 /dev/block/mmcblk0p2 /data
disk_preparing.sh:/system/bin/mount -o loop -t ext4 /system/userdata.img /sdcard
disk_preparing.sh:/system/bin/umount /data
disk_preparing.sh:/system/bin/umount /sdcard
Options:
-a Same as -dpR
-d,-P Preserve links
-H,-L Dereference all symlinks (default)
-p Preserve file attributes if possible
-f Force overwrite
-i Prompt before overwrite
-R,-r Recurse directories
-l,-s Create (sym)links
# tar
BusyBox v1.15.2 (2009-10-22 17:27:43 CST) multi-call binary
Usage: tar -[czjaZxtvO] [-X FILE] [-f TARFILE] [-C DIR] [FILE(s)]...
Create, extract, or list files from a tar file
Options:
c Create
x Extract
t List
Archive format selection:
z Filter the archive through gzip
j Filter the archive through bzip2
a Filter the archive through lzma
Z Filter the archive through compress
File selection:
f Name of TARFILE or "-" for stdin
O Extract to stdout
exclude File to exclude
X File with names to exclude
C Change to directory DIR before operation
v Verbose
dirname `pwd`
basename `pwd`
# chown root.root boot.img
# chown 1000.1000 boot.img
# rm
rm [-rR]
# type rm
rm is a tracked alias for /system/bin/rm
# busybox rm
BusyBox v1.15.2 (2009-10-22 17:27:43 CST) multi-call binary
Usage: rm [OPTIONS] FILE...
Remove (unlink) the FILE(s). Use '--' to
indicate that all following arguments are non-options.
Options:
-i Always prompt before removing
-f Never prompt
-r,-R Remove directories recursively
#
# cpio
BusyBox v1.15.2 (2009-10-22 17:27:43 CST) multi-call binary
Usage: cpio -[tiopdmvu] [-F FILE] [-H newc]
Extract or list files from a cpio archive, or create a cpio archive
Main operation mode:
-t List
-i Extract
-o Create
-p Passthrough
Options:
-d Make leading directories
-m Preserve mtime
-v Verbose
-u Overwrite
-F Input file
-H Define format
mount -r -o loop -t ext4 /system/userdata.img /mnt/out_dat
というのは、HTCやXperiaなどのAndroid携帯のカスタマイズのあたりの動向を見ると、初期段階では、こういったスクリプトものが多いのですが、それがうまく実行できない向きが多く出てきたりするので、結局はイメージ全体配布が主流となる、といった感じで・・・
自サーバの容量圧迫については、 http://www.multiupload.com/ などを使って外部に出しちゃえば、あまり気にしなくてもすみます。
ユーザ登録すれば、ダウンロード回数の確認とかもできます。
それによると、ronziA3_20111024.zipは40回、Novo7Basic_android2.2_20111029.7zは68回ダウンロードされたようです。
CFWをビルドするマシンとして、だれもがもっているコイツ(novo7) を使おうという話なのです。
今の環境をカスタマイズするわけではありません。まぁLinux で作るのが普通でそれもできるようにはしますが。
http://blog.osakana.net/archives/1347
ところで、A3/V65Pro 用のも作っておこうと思いますが、1つになっているファームウェアを指定できるようにしたいと思っています。
というわけで、split_nib のバイナリもお願いできませんでしょうか。
あと、こちらからも
http://nmj.sumomo.ne.jp/my_cfw/
ここに Linux x86_64 用の qemu-user 環境のバイナリを置いておきます。boot.img からの / + system.img を展開したところに これを展開すると chroot できるようになります。
(最初に binfmt_misc の初期設定が必要ですが、スクリプトも入れてあります。)
確認用に使ってみてください。
http://blog.osakana.net/sw/work/mkbootimg.zip
http://blog.osakana.net/sw/work/mkbootfs.zip
http://blog.osakana.net/sw/work/split_nib.zip
su,busybox は動きますが。
あと FAT だと実行権を付けられないようです。
実行している環境を変えるのは嫌なので、tmpfs で mount されている /dev/bin に置いて PATH を通すことにしました。
ただ、busybox を置き換えたら busybox のチェックが OK だったのが、NG になります。関係ないですが。
うっかりstaticし忘れてました。
URL同じで再アップしました。
busyboxについては、まぁ、元々入っているのとコンパイルオプションが違うはずなので、そこらへんの違いなんでしょうね
バージョンチェックでも入れてるのかな
http://nmj.sumomo.ne.jp/my_cfw/mkcfw-a3-2.1.zip
におきました >> osakanataro 氏
一応 予定どおりに生成できているかは、11/11 版と diff -ru して確認しています。
あと、この中の src に 新版の split_nib.c と 新規作成した split_bootimg.c を置いてあります。
元の split_nib.c は、メモリの消費がひどく実機ではまず動かないことに気がついたので修正。split_bootimg.c は、簡易なものですが 実機で perl は動かないので ついでに作っています。
ちなみに、バイナリも一応。これは NDK ではなく、作成中の開発環境で作ったもの。static リンクなら これでも動くようです。(確認は qemu-user 環境)
昨日、dalvik turboの新revが出ました。
dalvik_turbo_mips_froyo_205583_20111110.zip
具体的に何が変わったのか明記されていないのが難点ですが・・・
あと、Jz4760B ですが Set Top box 見つけました。いくつか前の記事に追記しています。
いくつかの中華pad向けにCyanogenModを作って遊んでいたのですが、novo7 basicあげるから遊んでみない?と言われてしまいました。
あまり暇はないのですが ;) 本当に届くなら遊んでみようかと思います。その時はまたお邪魔するかと思います。
失礼しました。
http://v.youku.com/v_show/id_XMzI3ODAwMDgw.html
ClockworkMod作ってみました。
標準のリカバリ用のupdate.zipが作れないかも試したのですが、invalid signatureとかなんとかでダメでした。
CWMならそんな問題はないので、ROMのカスタマイズにも役に立つのではと思います。
ご入用でしたら、ご相談ください。