关于 apk 的 native 库加载 32bit/64bit 选择

之前跟的项目, 那些号称64位 CPU的主控, 跑的软件全是 32位的; 我仍然很清楚的记得, 当年 CEO 在给大家讲解财报,描述技术蓝图的时候, 宣称 64bit 软件的运行效率其实远不如预期, 因为所有的代码要备两份存储, 代码可能要两次加载过程, cache 利用率不高,软件修改量却很大...    好吧, 以这位 CEO 后来所表现出来的 RP, 他的话应该是一个字也不能信的, 我们所知道的就是 8核64bit 瞬间普及, 而公司那些4核A5,  4核A7 的主控还在蹂躏着程序猿们的血泪, 却让他们不好意思提及产出;



一声叹息, 上面那段话, 一些相关的名词都少了个“前”字; // MAGIC1. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/



回到正题, 在 64bit 主控上面, 进程是如何确定 native 库是用 32bit 还是 64bit ?
比如 mediaserver, Android.mk 中就是 LOCAL_32_BIT_ONLY := true , 这是 google 自己加的:   // MAGIC2. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

commit af783aa91f7a279153fb8bab8d0d6b9f737996e9
Author: Glenn Kasten <[email protected]>
Date:   Sun Mar 2 19:48:19 2014 -0800
    mediaserver and associated services are 32-bit only
    also 32-bit only command-line apps

可能是 mediaserver 也会涉及太多的 HAL 部分, 比如 audio/camera, 而 HAL 这种底层的模块使用 64bit 会有风险;   // MAGIC3. DO NOT TOUCH.  BY 冗戈微言   http://blog.csdn.net/leonxu_sjtu/

native 进程好说,就看 Android.mk 了, 那 apk 呢?  网上搜搜相关的文章, 可以一个判断依据是看 apk 内置的 native 库是放在 lib 目录还是 lib64 目录, 比如 http://blog.csdn.net/jscese/article/details/47101815
这里我想说的是另外一点: 此时, jni 库是使用 LOCAL_REQUIRED_MODULES 还是 LOCAL_JNI_SHARED_LIBRARIES 就比较要紧:
---- LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk; 放在 apk/lib/目录下
---- LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
  // MAGIC4. DO NOT TOUCH.  BY 冗戈微言
只有 LOCAL_JNI_SHARED_LIBRARIES 才会产生内置库,才会 link /system/lib/ 或者 /system/lib64/ 下的 so 到 apk 中;
如果 Android.mk 中再加上 LOCAL_MULTILIB := 32  就可以指定只 link 32bit so 了;   // MAGIC5. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

android 第一次启动时, 会读取 apk 的信息, 保存到 /data/system/packages.xml, 从此以后每次启动就通过读这个 xml 来判断走 32bit 加载还是 64bit 加载;   // MAGIC6. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

所以如果原先的 Camera2.apk 是 64bit, 然后通过改 Android.mk 改为 32bit 的 apk, 替换到 /system/app/, 还是无法得到预期效果的, 痛苦的领悟 !

如果不想重烧 image, 就只能手动的 mkdir /system/app/lib/arm/ 目录, 然后删除 /data/system/packages.xml 再重启, 尼玛!// MAGIC7. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

似乎每次当我想保留环境,不重烧 image, 试图通过替换 apk / so 来达到修改目的时, 都会有一个一个坑在不远处等着...   权当记录一下这个脚印吧; // MAGIC8. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/




猜你喜欢

转载自blog.csdn.net/leonxu_sjtu/article/details/70212943