apk在安装的过程中,armeabi和armeabi-v7a的选择,在Android 4.0.1 to 4.0.3的版本中,都存在问题.
google bug:
安装apk时,根据手机中 /system/build.prop文件中的
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
这两个属性,从Java层传递到native层。
然后,NativeLibraryHelper.cpp中的函数,根据apk中的“文件名”来决定拷贝哪些libs到手机里面。
譬如:
lib/armeabi/libtest.so
lib/armeabi-v7a/libtest.so
程序是根据这个路径名中包含的 armeabi/armeabi-v7a,与CPU_ABI和CPU_ABI2做字符串比较,确定要拷贝的库的。
问题代码:
code:
行数: 319-329
对armeabi和armeabi-v7a的判断后,并没有做任何处理.就执行后面的拷贝操作.所以,armeabi和armeabi-v7a的库,谁后拷贝,就会覆盖前面的.
而armeabi和armeabi-v7a在for循环中的先后顺序,和com_android_internal_content_NativeLibraryHelper.cpp 278行的zipFile.open操作里面建立的一个Hash表相关.
在建立hash表后,拷贝操作是顺序访问hash表的.所以,armeabi和armeabi-v7a的库文件被访问的顺序,和散列函数相关.散列函数如下:
-
unsigned int ZipFileRO::computeHash(const char* str, int len)
-
{
-
unsigned int hash = 0;
-
-
-
while (len--)
-
hash = hash * 31 + *str++;
-
-
-
return hash;
-
}
-
-
-
-
-
void ZipFileRO::addToHash(const char* str, int strLen, unsigned int hash)
-
{
-
int ent = hash & (mHashTableSize-1);
-
-
-
/*
-
* We over-allocate the table, so we're guaranteed to find an empty slot.
-
*/
-
while (mHashTable[ent].name != NULL)
-
ent = (ent + 1) & (mHashTableSize-1);
-
-
-
mHashTable[ent].name = str;
-
mHashTable[ent].nameLen = strLen;
-
}
连接:
阅读(8780) | 评论(0) | 转发(0) |