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

内部ストレージの拡張とか

ONDA v719 3G 四核 いじってきて、
内部ストレージ(/data)はシンボリックリンクでSDにリンクすれば消費しないようにできるのだが、
USBストレージ(/storage/sdcard0)にサイズの大きいキャッシュやデータを置くアプリがあり、fatなのでシンボリックリンクも使えず、長期で使ってるといずれ尽きそう。
というわけで対策のためにまたファームのカスタマイズした。
/dataは少なくても対応できるのだが、USBストレージの領域をSDにしようと思うので、本体NANDが空くから、元が1GBしか無い/dataの拡張もやった。

今回の最大の目的であるUSBストレージ関連は、
USBストレージ: /storage/sdcard0 → /storage/sdcard1
SDカード: /storage/sdcard1 → /storage/sdcard2
に移動して、/storage/sdcard0はシンボリックリンクにしようと思ったんだが、
マウントポイントの作成タイミングだと思うんだが、うまく行かなくて断念。
代わりに、
/storage/sdcard0 ←→ /storage/sdcard1
と入れ替えた。

今回のカスタマイズでパーティションサイズを変更したが、
system.img 700MB → 600MB
cache.img +100MB
userdata.img 1023MB → 6GB
に変更した。
system.imgから中華アプリ削って縮小できるので、その分をcacheに。
userdata.imgの増加分、fat(USBストレージ)が減る。


boot.imgの修正

アンパック
$ ./unpack-MTK.pl boot.img
詳細は前回の記事を参照してください。

/default.prop
ro.secure=0
前回と同じなので今回は修正していません。
公式ファームはro.secure=1ですが、adbでroot権限を使うために変更。

/init.rc
#    mount rootfs rootfs / ro remount
229行目付近をコメントアウト。
前回は/systemへの書き込みを目論んで/systemのroリマウントをコメントアウトしたがダメだったので、今回は一度全部戻したんだが、
rootfsのroリマウントをコメントアウトしないと、スワップの有効化等で使うスクリプトが失敗したんで、rootfsのroリマウントをコメントアウトしておいたほうが良いみたい。
まあ、rootfsはシェルでリマウント可能だが。
/systemはkernelでプロテクトかかってるのかね・・・

/enableswap.sh
#!/bin/sh
/system/bin/busybox sysctl -w vm.swappiness=80

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 /dev/block/mmcblk1p2 /storage/ext4sd
fi

if [ -e /storage/ext4sd/swap ];then
    /system/bin/busybox swapon -p 10 /storage/ext4sd/swap
fi
SDカード絡みが失敗したので前回とほぼ同じですが、
vm.swappiness=60だとほとんどスワップ使ってくれなかったんで80に変えてみました。
あと、ext4のマウントに前回はnoauto_da_allocオプションをつけていたが、遅いんで外した。

リパック
$ ./repack-MTK.pl -boot boot.img-kernel.img boot.img-ramdisk boot.img.new



system.img の修正

アンパックとマウント
$ simg2img system.img system.img.tmp
$ mkdir system
# mount -o loop system.img.tmp system
これも前回と同じなんで、詳細は前回の記事を参照してください。


/system/build.prop
ro.product.locale.language=ja
ro.product.locale.region=JP
persist.sys.timezone=Asia/Tokyo
前回と同じなので、今回はいじってない。

不要アプリの削除
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
Maps.apk
Talkback.apk
QuickSearchBox2.apk
VoiceSearchStub.apk
GoogleTTS.apk
GoogleEars.apk
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
前回までに上記のシステムアプリを消していたが、今回は、
OndaLauncher_v2.13_build114_1024.600_3g.apk
oem.apk
を消して、代わりに、
com.teslacoilsw.launcher-1.apk
を入れた。
OndaLauncherの代わりにNovaを。
oem.apkはOperaなんとかって中華アプリが消えたと思う。
他に、標準キーボードとGoogle日本語入力を入れ替えようと思ったんだが、Google日本語入力が動作しなかったので諦めた。
SDカードのほうでトラブってたんで、それが原因かもしれない。

suのインストール
# cp su system/xbin/su
# chmod 0755 system/xbin/su
これは前回と同じなので今回はやってない。
PATHが通ってる場所なら良いんだと思うが、suがないと /default.propをいじってもadbでroot権限が使えない。

/system/etc/vold.fstab
dev_mount sdcard /storage/sdcard1 emmc@fat /devices/platform/goldfish_mmc.0 /devices/platform/mtk-msdc.0/mmc_host
dev_mount sdcard2 /storage/sdcard0 auto /devices/platform/goldfish_mmc.1 /devices/platform/mtk-msdc.1/mmc_host
このファイルの設定でUSBストレージとSDカードがマウントされる。
/storage/sdcard1と/storage/sdcard2にマウントしようと思ったんだが、
マウントポイントの作成タイミングだと思うが、
/storage/sdcard2のマウントが出来なかった。
しかたないので、0と1を入れ替えて、SDカードが1番目の領域になるようにした。

リパック
make_ext4fs -s -l  629145600 system.img.new system
前回は-sオプション無しでリパックしたが、-sオプションを使うと、未使用部分を省略したイメージが出来上がるので-sした方が良い。
最初に書いたが、サイズは公式ファームが700MBなんだが、600MBにした。



cache.imgの修正

$ simg2img cache.img cache.img.tmp
$ mkdir cache
# mount -o loop cache.img.tmp cache
# make_ext4fs -s -l  236978176 cache.img.new cache
アンパックしてリパック時にサイズ変更するだけ。
やり方はsystem.imgと同じ。
system.imgを100MB減らした分増やした。



userdata.imgの修正

$ simg2img userdata.img userdata.img.tmp
$ mkdir userdata
# mount -o loop userdata.img.tmp userdata
# rm -rf userdata/app/*
# rm -rf userdata/extra/*
# make_ext4fs -s -l  6442450944 userdata.img.new userdata
端末起動後にいじれるから、こちらもサイズ変更だけでいいんだが、
せっかく修正するんで、ついでに中華アプリと中華データを消した。
サイズは1023MBから6GBに変更。



MT6582_Android_scatter.txtの修正

サイズ変更をしたので書き込み位置とサイズを変更しないといけない。
イメージの順番は、system → cache → userdata → fat となっている。
fat領域は空き領域がフォーマットされるだけみたいなんでイメージは無い。

systemを減らした分、次のcacheが増えて、それ以降に影響しないので、
- partition_index: SYS16
  partition_name: ANDROID
  file_name: system.img
  is_download: true
  type: YAFFS_IMG
  linear_start_addr: 0x5180000
  physical_start_addr: 0x3d80000
  partition_size: 0x25800000
  region: EMMC_USER
  storage: HW_STORAGE_EMMC
  boundary_check: true
  is_reserved: false
  operation_type: UPDATE
  reserve: 0x00

- partition_index: SYS17
  partition_name: CACHE
  file_name: cache.img
  is_download: true
  type: YAFFS_IMG
  linear_start_addr: 0x2A980000
  physical_start_addr: 0x29580000
  partition_size: 0xE200000
  region: EMMC_USER
  storage: HW_STORAGE_EMMC
  boundary_check: true
  is_reserved: false
  operation_type: UPDATE
  reserve: 0x00
こんな感じに変更した。
リパック時に指定したイメージサイズのbyte数を16進にした値で、アドレスとサイズ。
systemの位置は変わらないので、systemのlinear_start_addrとphysical_start_addrにpartition_sizeを足した値がcacheのlinear_start_addrとphysical_start_addrになる。

- partition_index: SYS18
  partition_name: USRDATA
  file_name: userdata.img
  is_download: true
  type: YAFFS_IMG
  linear_start_addr: 0x38b80000
  physical_start_addr: 0x37780000
  partition_size: 0x180000000
  region: EMMC_USER
  storage: HW_STORAGE_EMMC
  boundary_check: true
  is_reserved: false
  operation_type: UPDATE
  reserve: 0x00

- partition_index: SYS19
  partition_name: FAT
  file_name: NONE
  is_download: false
  type: NONE
  linear_start_addr: 0x1B8B80000
  physical_start_addr: 0x1B7780000
  partition_size: 0x0
  region: EMMC_USER
  storage: HW_STORAGE_EMMC
  boundary_check: true
  is_reserved: false
  operation_type: INVISIBLE
  reserve: 0x00
userdataも開始位置は変わらない。
fatは開始位置だけでサイズは指定しなくていいみたい。




これでファーム更新しちゃったんだが、EBR1とEBR2を編集しないと正常に起動しないらしい。


EBR1とEBR2の修正

理解しにくかったが、開始位置とサイズの書いてある箇所をバイナリエディタで修正する。

000001C0: 00 00 83 00 00 00 00 E8 01 00 00 E0 15 00 00 00
000001D0: 00 00 83 00 00 00 00 C8 17 00 00 F0 03 00 00 00
000001E0: 00 00 83 00 00 00 00 B8 1B 00 00 00 20 00 00 00
000001F0: 00 00 05 00 00 00 00 94 01 00 FF FF FF FF 55 AA
元のEBR1が↑のようになっているんだが、
赤い部分がsystemの開始位置で青い部分がサイズ。
1行下がcache、2行下がuserdata。

元のファームのsystemのサイズがbyte単位で0x2bc00000だが、ここで書き込むのはセクタ単位(512byte単位)なんだが、
16進でそのまま計算する場合、「0x2bc00000/0x200=0x15E000」で計算できる。
0x15E000を後ろから1byteずつ計4byteの値で 00 E0 15 00 となる。

開始位置もセクタが後ろから1byteずつの4byteなんで、開始位置は 00 01 E8 00 。
開始位置にサイズを足すと「0x0001E800+0x15E000=0x17C800」
次の行の値になりますね。

今回のサイズ変更は、
system : 15e000 → 12c000
cache : 03f000 → 071000
userdata : 200000 → c00000
なんで、
000001C0: 00 00 83 00 00 00 00 E8 01 00 00 C0 12 00 00 00
000001D0: 00 00 83 00 00 00 00 A8 14 00 00 10 07 00 00 00
000001E0: 00 00 83 00 00 00 00 B8 1B 00 00 00 C0 00 00 00
000001F0: 00 00 05 00 00 00 00 94 01 00 FF FF FF FF 55 AA
systemのサイズ、cacheの位置とサイズ、userdataのサイズを変更。

EBR2の方はよくわかんないが修正の必要がある。
000001C0: 00 00 83 00 00 00 00 E8 01 00 00 E0 15 00 00 00
000001D0: 00 00 83 00 00 00 00 C8 17 00 00 F0 03 00 00 00
000001E0: 00 00 83 00 00 00 00 B8 1B 00 00 00 20 00 00 00
000001F0: 00 00 05 00 00 00 00 94 01 00 FF FF FF FF 55 AA
↑は元のEBR1だが、
赤 = 0x001BB800
青 = 0x00200000
緑 = 0x00019400
↓EBR2
000001C0: 00 00 83 00 00 00 00 24 3A 00 FF 47 C4 FF 00 00
桃 = 赤 + 青 - 緑 = 0x001BB800 + 0x00200000 - 0x00019400 = 0x3A2400
紫 = 0xFFFFFFFF - ( 赤 + 青 ) = 0xFFFFFFFF - ( 0x001BB800 + 0x00200000 ) = 0xFFC447FF
で計算できるらしい。

今回は青が 0x00200000 → 0x00c00000 に変更なんで、
桃 = 赤 + 青 - 緑 = 0x001BB800 + 0x00C00000 - 0x00019400 = 0xDA2400
紫 = 0xFFFFFFFF - ( 赤 + 青 ) = 0xFFFFFFFF - ( 0x001BB800 + 0x00C00000 ) = 0xFF2447FF
000001C0: 00 00 83 00 00 00 00 24 DA 00 FF 47 24 FF 00 00
となる。




これで焼いたら動いた。
SDカードは、第1パーティションが8000MBのfat32、第2パーティションが残り全部でext4でext4内に1GBのスワップファイル。
に変更した。


adb shell df
Filesystem Size Used Free Blksize
/dev 485M 52K 485M 4096
/mnt/secure 485M 0K 485M 4096
/mnt/asec 485M 0K 485M 4096
/mnt/obb 485M 0K 485M 4096
/system 591M 504M 86M 4096
/data 5G 132M 5G 4096
/cache 222M 4M 218M 4096
/protect_f 8M 4M 4M 4096
/protect_s 8M 4M 4M 4096
/mnt/cd-rom 1M 1M 0K 2048
/storage/ext4sd 7G 1G 5G 4096
/storage/sdcard0 7G 16K 7G 4096
/mnt/secure/asec 7G 16K 7G 4096
/storage/sdcard1 324M 16K 324M 16384

adb shell busybox free -m
            total         used         free       shared      buffers
Mem:           970          457          512            0           15
-/+ buffers:                442          528
Swap:         1279            0         1279

↑こんな感じに。


後は前回と同じく、
adb shell cp -a /data/app /storage/ext4sd/app
adb shell rm -rf /data/app
adb shell ln -s /storage/ext4sd/app /data/app
adb shell cp -a /data/app-lib /storage/ext4sd/app-lib
adb shell rm -rf /data/app-lib
adb shell ln -s /storage/ext4sd/app-lib /data/app-lib
adb shell cp -a /data/dalvik-cache /storage/ext4sd/dalvik-cache
adb shell rm -rf /data/dalvik-cache
adb shell ln -s /storage/ext4sd/dalvik-cache /data/dalvik-cache
で/dataのアプリをext4のSDにコピーしてリンクしようと思う。


本当はUSBストレージの位置を後から変更できる感じに作りたかったが、
USBストレージとSDカードの入れ替えは出来たので、
USBストレージが2GBほど増えたし、もし足りなくなってもSD変更すれば対応できるようになった。