AndroidでアプリがDL出来ない問題を解決する

USBストレージまたはSDカードにインストールできませんでしたと出る問題、
最近2回も聞かれたので、もしかしたら需要があるのでは?ということで、今回は3つの原因を紹介します。

●ケース1

多分、一番遭遇率の高いケース。
SDカード内にゴミファイルができることが原因らしいです。
カード内の、.android_secure/smdl2tmp1.asecを削除すると解消できるらしい、これはググるとよく出てきます。

●ケース2

正常にカーネルモジュールが読み込めてないことが原因。
これは私が遭遇したケースですが、カーネルモジュールを全てramdisk内に包含し、init.target.rc内で
/system/lib/modulesにsymlinkした所発生しました。

しかし、symlinkの記述よりも上に

insmod /system/lib/modules/moc_platform_mod.ko
insmod /system/lib/modules/moc_crypto.ko
insmod /system/lib/modules/dm-crypt.ko

という記述がありました。これではsymlinkしたカーネルモジュールではなく、元々の/systemパーティションに入っている
モジュールが読み込まれてしまうため、読み込みに失敗します。単純な記述ミスということです。

●ケース3

これも、insmodに関する問題。多分カスタムROMとかで起こりそうなケースです。
今回のケースではsymlinkは行わず、/system/lib/modulesに正しいカーネルモジュールを配置したにも関わらず、
有料アプリが購入できなくなるケースです。

まず、init.target.rcを見ると、

insmod /system/lib/modules/moc_platform_mod.ko
insmod /system/lib/modules/moc_crypto.ko
insmod /system/lib/modules/dm-crypt.ko

とありますから、取り敢えず手動でモジュールを読み込んでみます。

# insmod /system/lib/modules/dm-crypt.so
insmod: init_module ‘/system/lib/modules/dm-crypt.ko’ failed (No such file or directory)

エラーが返って来ました。dmesgで詳細を確認します。

# dmesg
<4>[ 194.422829] c0 3974 dm_crypt: Unknown symbol CreateAESCtx (err 0)
<4>[ 194.422920] c0 3974 dm_crypt: Unknown symbol SHA256_completeDigest (err 0)
<4>[ 194.422951] c0 3974 dm_crypt: Unknown symbol DoAESECB (err 0)
<4>[ 194.423042] c0 3974 dm_crypt: Unknown symbol DeleteAESXTSCtx (err 0)
……

Unknown symbolと言われているので、何かが足りていないのでしょう。
まずは読み込めるモジュールから、順番に読み込んでいきましょう。

# insmod /system/lib/modules/moc_platform_mod.ko.3.4.10
# insmod /system/lib/modules/moc_crypto.ko.3.4.10
# insmod /system/lib/modules/dm-crypt.ko

今度は、エラーなしで読み込みできました。
この状態だと有料アプリも問題なくダウンロードできます。

さて、ここで気づいたでしょうか。init.target.rcがinsmodしているファイル名と手動でinsmodしたファイル名が違います。
そもそも、moc_platform_mod.koやmoc_crypto.koなどというファイルは存在しません。

# ls -l /system/lib/modules|busybox grep moc
-rw-r–r– root root 489247 2008-08-01 21:00 moc_crypto.ko.3.4.10
-rw-r–r– root root 40 2008-08-01 21:00 moc_crypto.ko.sig.3.4.10
-rw-r–r– root root 6400 2008-08-01 21:00 moc_platform_mod.ko.3.4.10

これでは、init.targer.rc内でinsmodできるわけがありません。では、純正ROMではどうなっているでしょうか?

# ls -l /system/lib/modules|busybox grep moc
lrwxrwxrwx root root 2013-07-10 14:58 moc_crypto.ko -> moc_crypto.ko.3.4.10
-rw-r–r– root root 489247 2013-04-20 17:03 moc_crypto.ko.3.4.10
-rw-r–r– root root 40 2013-04-20 17:03 moc_crypto.ko.sig.3.4.10
lrwxrwxrwx root root 2013-07-10 14:58 moc_platform_mod.ko -> moc_platform_mod.ko.3.4.10
-rw-r–r– root root 6400 2013-04-20 17:03 moc_platform_mod.ko.3.4.10

純正ROMでは、このようにシンボリックリンクを張っていることが分かります。
カスタムROMに移植する際に、シンボリックリンクが抜け落ちたのでしょう。

# cd /system/lib/modules
# ln -s moc_crypto.ko.3.4.10 moc_crypto.ko
# ln -s moc_platform_mod.ko.3.4.10 moc_platform_mod.ko

としてシンボリックリンクを張ってやり、再起動すれば解決できていると思います。

lsmodの結果からも、それが分かります。

$ lsmod
bcmdhd 542183 0 – Live 0x00000000
dm_crypt 14647 2 – Live 0x00000000 (O)
moc_crypto 398114 1 dm_crypt, Live 0x00000000 (PO)
moc_platform_mod 1919 1 moc_crypto, Live 0x00000000 (O)
texfat 128158 0 – Live 0x00000000 (PO)

ケース2とケース3はHTCのinit.target.rcの場合なので、他メーカーの場合は事情が異なるかもしれません。
長々と書いてしまいましたが、(有料)アプリがダウンロードできなくなる問題は、
ググると出てくるsmdl2tmp1.asecの問題だけでなく、カーネルモジュールのロードに失敗している可能性がある
ということが分かっていただけたら、と思います。

[`evernote` not found]

  1. コメントはまだありません。

  1. トラックバックはまだありません。