预装APP

(1)若内置为可卸载的APK,可以无需解压出lib直接编译就可以

具体参考http://blog.csdn.net/a462533587/article/details/46380795

(2)若内置为system APP,上述blog也有两种方式:

方法一:

如下例,在Android.mk中添加并配置变量(注意路径对应):

LOCAL_PREBUILT_JNI_LIBS = \
@lib/armeabi-v7a/libcryptox.so \
@lib/armeabi-v7a/libfb.so

注意前面的 @符号,@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录;

/build/core/install_jni_libs_internal.mk

 

   ifdef my_prebuilt_jni_libs
    # Files like @lib/<abi>/libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk;
    # Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree.
    my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \
        $(filter @%, $(my_prebuilt_jni_libs)))

此处有对@lib的使用说明

方法二:解压出so

   78ifdef my_prebuilt_jni_libs
    79# Files like @lib/<abi>/libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk;
    80# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree.
    81my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \
    82    $(filter @%, $(my_prebuilt_jni_libs)))

当so较多可以遍历每个so,使用如下语句

###清空临时变量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))

但是我尝试了方法一未成功,方法二可以,但是麻烦。当这类APK比较多时就很繁琐,有没有其他方法呢?

带so的APK在编译过程中会先解压缩如

out/target/product/msm8953_64/obj/APPS/LauncherB_intermediates/uncompressedlibs/lib/armeabi/libfacialproc_jni.so

intermediates := $(call local-intermediates-dir)这条语句就可以代替out/target/product/msm8953_64/obj/APPS/LauncherB_intermediates

然后再遍历这个目录下所有so,就可以copy到与编译后的APK同级目录下了

终极解决方案:

经过反复研究系统预编译APK的流程,终于实现不解压APK而在编译过程中自动解压Copy,Android.mk添加代码如下

  

  PRIVATE_EMBEDDED_JNI_LIBS := 'lib/*.so'
    JNI_LIBS :=
    $(foreach FILE,$(shell if unzip -l $(LOCAL_PATH)/$(LOCAL_SRC_FILES) $(PRIVATE_EMBEDDED_JNI_LIBS) > /dev/null ; then \
            rm -rf $(LOCAL_PATH)/uncompressedlibs && \
            mkdir $(LOCAL_PATH)/uncompressedlibs; \
            unzip $(LOCAL_PATH)/$(LOCAL_SRC_FILES) $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(LOCAL_PATH)/uncompressedlibs > /dev/null && \
            find $(LOCAL_PATH)/uncompressedlibs -name *.so; \
        fi),$(eval JNI_LIBS += $(FILE)))
    $(info echo $(JNI_LIBS))
    LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))

超级解决方案,自动判断加载哪种架构的库

   

 APK_LibList :=
    $(subst $(LOCAL_PATH)/uncompressedlibs,,\
        $(foreach FILE,$(shell unzip -l $(LOCAL_PATH)/$(LOCAL_SRC_FILES) 'lib/*.so'|grep 'arm'),$(eval APK_LibList += $(FILE))))
        
     
    #$(info $(APK_LibList))
     
    ARM64_LIB := $(findstring arm64-v8a,$(APK_LibList))
    ARMV7A_LIB := $(findstring armeabi-v7a,$(APK_LibList))
    ARM_LIB := $(findstring armeabi,$(APK_LibList))
     
     
    ARCH_LIB := $(if $(TARGET_ARCH),$(if $(ARM64_LIB),$(ARM64_LIB),$(if $(ARMV7A_LIB),$(ARMV7A_LIB),$(ARM_LIB))),$(if $(ARMV7A_LIB),$(ARMV7A_LIB),$(ARM_LIB)))
     
    TARGET_BIT := $(if $(findstring arm64,$(ARCH_LIB)),64,32)
    $(info $(ARCH_LIB) $(TARGET_BIT))
    PRIVATE_EMBEDDED_JNI_LIBS := 'lib/$(ARCH_LIB)/*.so'    
    JNI_LIBS :=
    $(foreach FILE,$(shell if unzip -l $(LOCAL_PATH)/$(LOCAL_SRC_FILES) $(PRIVATE_EMBEDDED_JNI_LIBS) > /dev/null ; then \
            rm -rf $(LOCAL_PATH)/uncompressedlibs && \
            mkdir $(LOCAL_PATH)/uncompressedlibs; \
            unzip $(LOCAL_PATH)/$(LOCAL_SRC_FILES) $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(LOCAL_PATH)/uncompressedlibs > /dev/null && \
            find $(LOCAL_PATH)/uncompressedlibs -name *.so; \
        fi),$(eval JNI_LIBS += $(FILE)))
     
    LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))
     
    LOCAL_MULTILIB := $(TARGET_BIT)


---------------------
作者:lvjiong353
来源:CSDN
原文:https://blog.csdn.net/u013463707/article/details/75050910
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值