最近产品测试需要安装一个录音app,自带本地底层库。由于客户的要求,不希望修改system的东西,所以要做成一个第三方程序。
使用NDK编译了libs,将这些库打包进APK里有两种方法Android.mk和eclipse(接下来会转载相关文章),使用压缩文件管理器可以看见APK里已经打包了lib/armeabi/libxxx.so.
然后我很不好的习惯将它放入了/system/app下,程序运行时总是出错找不到so库,一查看 /data/data/包名/lib 下没有发现打包好的so库!
看了PackageManagerService.java才知道:
/* Note: We don't want to unpack the native binaries for
* system applications, unless they have been updated
* (the binaries are already under /system/lib).
* Also, don't unpack libs for apps on the external card
* since they should have their libraries in the ASEC
* container already.
*
* In other words, we're going to unpack the binaries
* only for non-system apps and system app upgrades.
*/
还有几点tips:
1、在Manifest文件里面添加android:sharedUserId="android.uid.system"以及Android.mk里添加LOCAL_CERTIFICATE := platform。这样编译出来的apk和系统应用同一个进程ID,可以共享系统应用数据。
威盛平台签名:java -Xmx2048m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 old.apk new.apk
2、PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。 我们都是直接将app放到/system/app或/data/app下即可,系统会自动安装。使用adb install默认都是装到/data/app下的,SD卡里面的程序手动安装也是如此。
3、手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。