某些APK程序无法安装,比如愤怒的小鸟,武士2,把程序拷贝到内部存储上安装,在线安装,adb install都不行。
调试记录:
使用adb install安装时的logcat信息如下:
- E/Vold ( 1040): Sucess allocating memory
- [ 145.485462] device-mapper: table: 254:0: crypt: Error allocating crypto tfm
- [ 145.486817] device-mapper: ioctl: error adding target to table
- E/Vold ( 1040): Error loading mapping table (No such file or directory)
- E/Vold ( 1040): ASEC device mapping failed (No such file or directory)
E/Vold ( 1040): Sucess allocating memory
[ 145.485462] device-mapper: table: 254:0: crypt: Error allocating crypto tfm
[ 145.486817] device-mapper: ioctl: error adding target to table
E/Vold ( 1040): Error loading mapping table (No such file or directory)
E/Vold ( 1040): ASEC device mapping failed (No such file or directory)
发现是kernel先出错了,然后导致vold出错,查找出错的地方,就到了kernel/drivers/dm这里,发现代码并没有什么问题。因为是某些APK无法安装,有些可以安装,所以比较两者的logcat差异,发现可以安装的APK不会走vold/devmapper这里,安装失败的就会走devmapper,devmapper在vold里是一个设备映射机制,这种机制的作用简单来说就是给用户提供简单方便而又丰富的存储管理接口,在这种机制以及相关工具的帮助下,用户能够方便的自定义存储资源管理策略。所以初步怀疑是APK安装路径的问题,找到一个简单的APK源码,修改AndroidManifest.xml:
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.Drawing"
- android:installLocation="preferExternal"
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.Drawing"
android:installLocation="preferExternal"
安装位置为auto,internalOnly,用adb install均成功安装。安装位置设置为preferExternal,安装不成功。问题出在preferExternal这里,可能是要安装到外部TF卡,那插上TF卡,安装依旧失败,无从下手了。判断和APK安装路径无关。因为V310是仿照TC4添加的代码,找来TC4的机器验证没有此问题,OK,比较代码,device/init.smdkv310.rc有个地方不同,修改,试验,依旧失败,那就不是device和framework层的问题,OK,比较kernel代码,dm的代码并没有特别的不同,怀疑可能是某些modules没有编译进来,google此方面的问题,发现如下信息:
- It looks like your kernel is missing device mapper support:
- CONFIG_BLK_DEV_DM, (depends on CONFIG_MD)
- Also enable DM_CRYPT, DM_UEVENT and CRYPTO_TWOFISH (needed by asec).
- 在kernel的config中加上一些项目
- CONFIG_MD=y
- CONFIG_BLK_DEV_DM=y
- CONFIG_DM_DEBUG=y
- CONFIG_DM_CRYPT=y
- CONFIG_DM_UEVENT=y
- CONFIG_CRYPTO_AEAD=y
- CONFIG_CRYPTO_AUTHENC=y
- CONFIG_CRYPTO_CBC=y
- CONFIG_CRYPTO_PCBC=y
- CONFIG_CRYPTO_HMAC=y
- CONFIG_CRYPTO_MD5=y
- CONFIG_CRYPTO_DES=y
- CONFIG_CRYPTO_TWOFISH=y
- CONFIG_CRYPTO_TWOFISH_COMMON=y
It looks like your kernel is missing device mapper support:
CONFIG_BLK_DEV_DM, (depends on CONFIG_MD)
Also enable DM_CRYPT, DM_UEVENT and CRYPTO_TWOFISH (needed by asec).
在kernel的config中加上一些项目
CONFIG_MD=y
CONFIG_BLK_DEV_DM=y
CONFIG_DM_DEBUG=y
CONFIG_DM_CRYPT=y
CONFIG_DM_UEVENT=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AUTHENC=y
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
比较TC4和V310的.config后,发现关于CONFIG_CRYPTO的几个选项不同,对照TC4,make menuconfig -> Cryptographic API ->打开ECB support, 打开AES cipher algorithms,打开Twofish cipher algorithm,重新编译kernel,OK,问题解决。