Chinaunix首页 | 论坛 | 博客
  • 博客访问: 247689
  • 博文数量: 33
  • 博客积分: 246
  • 博客等级: 二等列兵
  • 技术积分: 918
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-31 16:37
文章分类

全部博文(33)

文章存档

2014年(4)

2013年(7)

2012年(22)

分类: Android平台

2014-02-11 15:51:32

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的库文件被访问的顺序,和散列函数相关.散列函数如下:

点击(此处)折叠或打开

  1. unsigned int ZipFileRO::computeHash(const char* str, int len)
  2. {
  3.     unsigned int hash = 0;


  4.     while (len--)
  5.         hash = hash * 31 + *str++;


  6.     return hash;
  7. }




  8. void ZipFileRO::addToHash(const char* str, int strLen, unsigned int hash)
  9. {
  10.     int ent = hash & (mHashTableSize-1);


  11.     /*
  12.      * We over-allocate the table, so we're guaranteed to find an empty slot.
  13.      */
  14.     while (mHashTable[ent].name != NULL)
  15.         ent = (ent + 1) & (mHashTableSize-1);


  16.     mHashTable[ent].name = str;
  17.     mHashTable[ent].nameLen = strLen;
  18. }


连接:
阅读(8780) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~