内置带so的APK为系统APK方法

(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 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

/build/core/install_jni_libs_internal.mk

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)))

此处有对@lib的使用说明

方法二:解压出so

LOCAL_PREBUILT_JNI_LIBS = \
lib/armeabi-v7a/libcryptox.so \
lib/armeabi-v7a/libfb.so 
当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))
  • 1
  • 2
  • 3

但是我尝试了方法一未成功,方法二可以,但是麻烦。当这类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)

猜你喜欢

转载自blog.csdn.net/u013463707/article/details/75050910
apk