前面的博客里面有提到Android系统预装第三方apk的方法:
里面提到
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi/libcwatchdog.so \
@lib/armeabi/libmp3lame.so \
@lib/armeabi/libttsnotemsc.so \
@lib/armeabi/libopustoolvn.so
前面的 @符号,@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录;
但是项目中实际编译的时候遇到并没有将apk中的so抽离出来,拷贝到对应编译后的apk目录,导致系统首次开机启动速度很慢,后来改用了下面的方法二,可以实现系统首次开机快速启动,具体原因未知,现做记录以备日后有时间重新分析原因:
方法一 不从apk中解压lib库而直接添加
如下例,在Android.mk中添加并配置变量(注意路径对应):
LOCAL_PREBUILT_JNI_LIBS = \
@lib/armeabi-v7a/libcryptox.so \
@lib/armeabi-v7a/libfb.so
注意前面的 @符号,@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录;
方法二 手动解压lib文件到当前apk的编译目录并添加
先解压当前apk内的lib文件夹到当前apk编译目录,同方法一在Android.mk中添加并配置变量(注意路径对应),如下例:
LOCAL_PREBUILT_JNI_LIBS = \
lib/armeabi-v7a/libcryptox.so \
lib/armeabi-v7a/libfb.so
若当前apk包含的lib库文件数量比较多时,上述代码可以通过修改为如下代码进行优化,优化的思路是用递归搜索来替代手工对lib库文件进行添加:
###清空临时变量JNI_LIBS
JNI_LIBS :=
###当前目录递归搜索
$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/ -name *.so), $(eval JNI_LIBS += $(FILE)))
###获取搜索文件目录集(相对目录)
LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))