当前位置:   article > 正文

Android 预置SO库、apk_android bp 预置应用规则so库

android bp 预置应用规则so库

对于64位系统的编译规则,可参考:http://source.android.com/source/64-bit-builds.html


关键点:

  • JAVA编译不分32bit和64bit(APK,JAR)
  • 可执行文件,默认编译64位
  • 动态库和静态库,默认同时编译32bit和64bit版本
  • 通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译
  • JAVA加载JNI库(so文件)的规则:
    如果APP需要加载的所有so都是32bit,则使用32bit方式加载so库;如果APP需要加载的so库中只要有一个so是64bit的,则必须以64bit方式加载so库;不能同时加载32bit和64bit的so库。

实际工程中,我们通常会遇到下面这样的场景:
A. APK有源码,SO库有源码 - 应用及so库我们都能自己编译出来
B. APK有源码,SO库没有源码 - 我们开发的应用使用了第三方的so库,如ScanService
C. APK和SO库都没有源码 - 预置第三方的应用(应用中包括so库)

对于场景A:

只要我们编译默认对应的APP和SO库(32bit+64bit)即可。
此种场景最为普通,本文不做详细讲解。

对于场景B:

如果APK需要加载的库里面有64bit的,则需要全部的库都使用64bit。
如果APK调用的第三方so库中有32bit的,则:要么让第三方提供64bit版本的so库,要么强制使所以的so库都使用32bit版本

对于场景C:

使用特定的预置规则即可。


场景A范例:

  • APK的编译规则不需要设置LOCAL_MULTILIB
  • SO库的编译规则也不需要设置LOCAL_MULTILIB
    所以,SO库就会同时编译出32bit和64bit版本,APK按照64bit方式调用so库

场景B范例:

  • APK的编译规则需要设置LOCAL_MULTILIB
  • SO库的编译规则需要指定64bit或32bit(本地编译或预置的都需要)
  • 需要显示声明APK的JNI库
    如:
  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_CERTIFICATE := platform
  5. LOCAL_SRC_FILES := $(call all-subdir-java-files)
  6. LOCAL_JAVA_LIBRARIES := odm conscrypt sp
  7. LOCAL_PACKAGE_NAME := PosService
  8. # to support on 64-bit system
  9. LOCAL_JNI_SHARED_LIBRARIES := \
  10. libmiscjni \
  11. libttyjni \
  12. libIAL \
  13. libSDL \
  14. libbarcodereader \
  15. libHsmKil \
  16. libHHPScanInterface \
  17. libHSMDecoderAPI
  18. LOCAL_MULTILIB := 32
  19. include $(BUILD_PACKAGE)


其中某个本地编译so的规则:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES := \
  4. com_odm_tty.cpp
  5. LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
  6. LOCAL_SHARED_LIBRARIES := \
  7. libcutils \
  8. libutils
  9. LOCAL_PRELINK_MODULE := false
  10. LOCAL_MODULE_TAGS := optional
  11. LOCAL_MODULE := libttyjni
  12. LOCAL_MULTILIB := 32
  13. include $(BUILD_SHARED_LIBRARY)

某个第三方so的规则:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_MODULE_CLASS := SHARED_LIBRARIES
  5. LOCAL_MODULE_SUFFIX := .so
  6. LOCAL_MODULE := libHHPScanInterface
  7. LOCAL_SRC_FILES := $(LOCAL_MODULE).so
  8. LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
  9. LOCAL_MULTILIB := 32
  10. include $(BUILD_PREBUILT)

场景C范例:

  • APK使用典型的预置应用规则
  • SO库不需要写预置规则
  • 需要显示声明APK调用的SO库
    如:
  1. LOCAL_PATH := $(my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := BaiduIME
  4. LOCAL_MODULE_TAGS := optional
  5. LOCAL_SRC_FILES := baidu_input_for_xiaomiV5.apk
  6. LOCAL_MODULE_CLASS := APPS
  7. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  8. LOCAL_CERTIFICATE := PRESIGNED
  9. LOCAL_MULTILIB := 32
  10. LOCAL_PREBUILT_JNI_LIBS := \
  11. @lib/armeabi/libBDVoiceRecognitionClient_V1.so \
  12. @lib/armeabi/libchiperencoder_v1_2_1.so \
  13. @lib/armeabi/librabjni-1.so \
  14. @lib/armeabi/libshare_v2.so
  15. include $(BUILD_PREBUILT)


原文地址

http://blog.csdn.net/diaoxuesong/article/details/51121646



一、将无源码的 APK 和它 依赖的库预置进系统,此apk可以升级

---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
#预置aliuyi.apk

include $(CLEAR_VARS)
LOCAL_MODULE := wwwa.apk 
LOCAL_SRC_FILES := aliuyi.apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
include $(BUILD_PREBUILT)

#方法一:预置so等资源文件
include $(CLEAR_VARS)
LOCAL_MODULE := wanghai.so
LOCAL_SRC_FILES := wanghai.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib/
include $(BUILD_PREBUILT)

#方法二:预置so等资源文件
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_LIBS := sdfapk.so sdffff.so
include $(BUILD_MULTI_PREBUILT)

#方法三:
预置so等资源文件,在Android.mk里 添加 这样一句,注意:这样的方式 如果路径不存在,这条指令 执行 失败,但 不会 报错!
$(shell cp -rf $(LOCAL_PATH)/libs/*.so $(TARGET_OUT)/lib)

 
---------- cut here ------------------
解释:

LOCAL_MODULE 指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建如果 是在编译整个Android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,

LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建

LOCAL_SRC_FILES 指定 源apk

LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;

LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC

注意:若是被预置的apk里有so库,需要将从Test.apk的 so库拷贝到 out/target/product/xxx/system/lib/目录下,若无 so 库,则去掉此步;

方法一 只能针对 一个文件,方法二 可以 针对多个文件,但 只能 把 文件 拷贝到 system/lib/ 下,
android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号