ジャンル不定の日記です。

再度ファームウェア更新した

そこそこの環境になってたけど、いくつか修正したい点があったので、
再度 ONDA v719 3G 四核 のファーム更新した。

今回の目的は、
  1. /system が読み込み専用でマウントされる。(リマウントも無理)
  2. 前回最後adbでroot権限が使えない状態だったが、やっぱroot要る。
  3. ext4のSDを自動マウント。
  4. ext4のSD上にswapファイル。
  5. appとかdataをext4のSDに移せるようにする。
前回は/systemをrwにできなかったが、/init.rcでのroリマウントの箇所を修正すれば解決するんじゃないかと。
adbでのroot権限には、/default.propの修正以外に、/system/xbin(パスが通ってればどこでも良いのか?)にsuを置く必要があるようなんだが、
前回の最後に、それの確認のためにsuは入れなかった。
/systemの書き換えができないならroot権限不要かと思ったが、今回は/systemを書き換えできるようにするつもりだし、やっぱ欲しい。

ext4のSDについては、SDをext4のみでフォーマットしてしまうと、androidで破損したSDと警告がでてしまう。
それで前回は諦めてたんだが、SDを複数パーティションにして1つ目をfat32でフォーマットしておけば、一部ext4のSDが利用できる事がわかった。
というわけで、諦めていた、appとdataのSDへの移動と、SD上にswap領域の作成を!

って感じ。

結果を書くと、/systemの書き込みに関してはダメだった・・・
他は全部うまく行ったぽい。
SDへのアプリ移動もroot権限必要だし、一応adbでroot使える意味はあるかな。



boot.img の修正


boot.img のアンパック
$ ./unpack-MTK.pl boot.img
boot.img-ramdiskにramdisk、boot.img-kernel.imgにカーネルが展開される。
boot.img-ramdiskの方はファイルシステムに展開された状態になるので、そのまま編集できる。
unpack-MTK.plは公式ぽいところから拾ってきた。


/init.rc の修正
「mount different fs start」のセクションで/systemのmount処理をしていて、ファイルシステム別に書かれている。
mount ext4 /emmc@android /system wait commit=1,noauto_da_alloc
とマウントして変更を加えた後に、
mount ext4 /emmc@android /system noatime ro remount wait
とroでリマウントしている。
ので、リマウントの行をコメントアウト。
にしようと思ったんだが、EXT4のりマウントはnoatimeオプション付きでリマウントしているんで、そのほうが良さそうだからroをrwに変更にした。
EXT4のみの変更で良さそうだが、他のファイルシステム用と思われる記述はリマウントをコメントアウトした。

同じようにrootfsもrwでマウントして変更をした後にroでリマウントされているので、リマウントの行をコメントアウト。

結果的に、この方法で /system の書き換えは無理だった・・・


/default.prop の修正
ro.secure=1
を、
ro.secure=0
前回は、
ro.allow.mock.location=0
ro.debuggable=0
の行も1に変更したが、ro.secureを変えれば最初からroot権限になると思うのでro.secure以外は変えなかった。


SDカード上にswapファイルの作成
SDのパーティションを3分割してswapパーティションを作ることも考えたが、
swapファイルの有無で判別してswaponするのにファイルのほうが良いと思った。
というわけで、16GBのSDを1番目を4GBのfat32、残り全部をext4、ext4の最上位に1GBのswapファイル。
とした。
SDの準備は母艦でやった。

# dd if=/dev/zero of=swap bs=1048576 count=1024
# mkswap swap
# chmod 0600 swap
1GBのswapファイル作成。
パーミッションが初期状態の644だとswapon時に警告が出るようなので600に変更した。


/enableswap.sh の編集
前回は /system/bin/preinstall.sh を修正して起動時に swapon していたが、
/enableswap.sh も/init.rcから実行されてて、名前的にswapはこっちだし、起動時に一度しか実行されないようなのでこっちに書くことにした。
このスクリプトでext4のマウントも行う。

#!/bin/sh
echo 0 > /sys/block/zram0/disksize
/system/bin/tiny_mkswap /dev/block/zram0
/system/bin/tiny_swapon /dev/block/zram0
となっているが、
#!/bin/sh
/system/bin/busybox sysctl -w vm.swappiness=60

echo 268435456 > /sys/block/zram0/disksize
#/system/bin/tiny_mkswap /dev/block/zram0
#/system/bin/tiny_swapon /dev/block/zram0
/system/bin/busybox mkswap /dev/block/zram0
/system/bin/busybox swapon -p 100 /dev/block/zram0

if [ -e /dev/block/mmcblk1p2 ];then
    mkdir /storage/ext4sd
    mount -t ext4 -o noatime,noauto_da_alloc /dev/block/mmcblk1p2 /storage/ext4sd
fi

if [ -e /storage/ext4sd/swap ];then
    /system/bin/busybox swapon -p 10 /storage/ext4sd/swap
fi
に修正した。
tiny_mkswapとtiny_swaponの使い方がわからないので、busyboxのコマンドを使うように変更した。
swappinessが100になってるんで、sysctlで60に変更。60がlinuxの初期値らしい。
「echo 0」だとzramが0byteになりそうな気がするんだが、初期状態だと512MBほどzramになっているようだったんで、256MB(268435456byte)にした。
swapon時に-pオプションでPriority(優先度)を設定。(zram優先)
/dev/block/mmcblk1p2 がSDカードの第2パーティションだが、通常SDカードをパーティション分割することはないと思うので、第2パーティションがあれば /storage/ext4sd にext4でマウント。
マウントしたSDのext4にswapファイルがあればswapon。


boot.img のリパック
$ ./repack-MTK.pl -boot boot.img-kernel.img boot.img-ramdisk boot.img.new
で修正したboot.imgがboot.img.newに出来上がるので、元のboot.imgと交換してFlashToolで更新できる。
repack-MTK.plはunpack-MTK.plと一緒に拾ってきた。



system.img の修正


system.img のアンパック
$ simg2img system.img system.img.tmp
でsystem.img.tmpに普通のext4ディスクイメージが出てくる。
simg2imgはArch AURのext4_utilsパッケージでインストールした。
ext4_utilsパッケージはPKGBUILDがARM専用になってるんでx86_64に修正する必要があった。


system のマウント
$mkdir system
# mount -o loop system.img.tmp system
で普通にマウントできる。
root権限でマウントしたら修正はrootで。


/system/build.prop の修正
ro.product.locale.language=ja
ro.product.locale.region=JP
persist.sys.timezone=Asia/Tokyo
言語とタイムゾーンの3箇所


不要アプリの削除
前回は以下のアプリを削除していたが、
ONDA_AnZhi_V5_1_20140124.apk
ONDA_QQ_IME_v42.apk
ONDA_Tudou_v3.1_1223.apk
ONDA_WpsOffice_v59.apk
ONDA_iReader_V2720_20140106.apk
OndaHelp_20140415.apk
UCBrowser_V3.0.0.apk
game.apk
acount.apk
OperaService.apk

以下のアプリはPlayStoreからインストールできるGoogleアプリと思うので追加で削除。
Maps.apk
Talkback.apk
QuickSearchBox2.apk
VoiceSearchStub.apk
GoogleTTS.apk
GoogleEars.apk

以下のアプリは代替品がPlayStoreからインストールできると思うので削除
Calendar.apk
Calendar.odex
CalendarImporter.apk
CalendarImporter.odex
CalendarProvider.apk
CalendarProvider.odex
Email.apk
Email.odex
Exchange2.apk
Exchange2.odex
Browser.apk
Browser.odex
ChromeBookmarksSyncAdapter.apk
とした。
Browser.apkとか削除したらダメな気もしたが、無事起動できた。

まだ削除を試したいアプリがあるが、それら次に機会があれば試す。


su のインストール
# cp su system/xbin/su
# chmod 0755 system/xbin/su
前回入れないで試したが、やっぱsuがないとadbでroot権限が使えない。
/default.prop の修正と合わせてsuを入れるとadbでroot権限が使えるようになる。


system.img のリパック
make_ext4fs -l 652900440 system.img.new system
これもext4_utilsパッケージで入るコマンド。
-lオプションでイメージサイズを指定だが、元のsystem.imgと同じサイズにした。




で、修正したboot.imgとsystem.imgでファーム更新したわけだが、
先に書いたように/systemの書き込みは無理だった。
  • adbでのroot権限
  • ext4のSDを自動マウント
  • SD上のswapファイルでswapの自動有効化
はうまく行ったぽい。

起動後はアプリのSDカードへの移動を試したが、ext4のSDが/storage/ext4sdにマウントされるんで、
mkdir /storage/ext4sd/app
mkdir /storage/ext4sd/data
chmod 0755 /storage/ext4sd/data /storage/ext4sd/app
chown system:system /storage/ext4sd/data /storage/ext4sd/app
で領域を作成。

前は/data/appと/data/dataをまるごとリンクにしようとして失敗したが、今回はアプリ単位での移動にすることにした。
試しに2chmateをPlayStoreからインストールして、
cp -a /data/data/jp.co.airfront.android.a2chMate /storage/ext4sd/data/jp.co.airfront.android.a2chMate
rm -rf /data/data/jp.co.airfront.android.a2chMate
ln -s /storage/ext4sd/data/jp.co.airfront.android.a2chMate /data/data/jp.co.airfront.android.a2chMate

cp -a /data/app/jp.co.airfront.android.a2chMate-1.apk /storage/ext4sd/app/jp.co.airfront.android.a2chMate-1.apk
rm /data/app/jp.co.airfront.android.a2chMate-1.apk
ln -s /storage/ext4sd/app/jp.co.airfront.android.a2chMate-1.apk /data/app/jp.co.airfront.android.a2chMate-1.apk
で、SDに移動して起動できたぽい。
端末再起動しても平気だった。
シンボリックリンクの所有者がrootになっちゃうが、
標準のchownには-hオプションがなくリンクの所有者変更ができず、busyboxのchownでも「unknown user/group」言われて無理だったが、rootのままで平気ぽい。


/systemの書き込みができないのを解決したいが、他に問題無さそうなら当面はこれで。

あと、今回はいじってないが、やはりdhcpでのIPアドレス自動取得が無理で静的にしないとネットが使えない。
ネットワーク上にdhcpdが2つあるとかはないんで端末側の問題なはずだが、解決方法がわからない。

FMラジオの日本周波数への変更も今回はいじってないが、解決方法がわかれば・・・