LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。
include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
LOCAL_MODULE:当前模块的名称(具有唯一性)(无源码);
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
LOCAL_PACKAGE_NAME:当前APK应用的名称(具有唯一性)(有源码);
LOCAL_MODULE_TAGS:当前模块所包含的标签,可以包含多标签,可能值为debgu,eng,user,development或optional(默认值)
- user: 指该模块只在user版本下才编译
- eng: 指该模块只在eng版本下才编译
- tests: 指该模块只在tests版本下才编译
- optional:指该模块在所有版本下都编译
LOCAL_MODULE_PATH:表示模块编译结果将要存放的目录
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/vendor/app/
#编译到/vendor/app/目录下
#$(TARGET_OUT)/app:/system/app目录下
LOCAL_PRIVILEGED_MODULE :
= true 表示app应用在目录/system/priv-app/下
= false 表示app应用在目录/system/app/下(默认)
LOCAL_SRC_FILES:当前模块包含的所有源码文件;
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。
LOCAL_SRC_FILES := $(call all-java-files-under, src)————有源码
LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%,%,$(shell find $(LOCAL_PATH) -name "*.apk"))————无源码
LOCAL_C_INCLUDES:C/C++所需的头文件路径;
LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库名;
LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库名;
LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库;
LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库;
LOCAL_CERTIFICATE:签署当前应用的证书名称,比如platform
PRESIGNED————使用apk原生的签名
platform————使用平台签名
LOCAL_BUILT_MODULE
表示编译链接后的目标文件(文件路径+文件名)
LOCAL_BUILT_MODULE_STEM
表示编译链接后的目标文件的文件名,带后缀
LOCAL_OVERRIDES_PACKAGES := AlarmClock
使 AlarmClock不会加入到编译系统中,不会生成 AlarmClock.apk。
LOCAL_DEX_PREOPT := false
不需要在编译过程中做odex优化
include $(BUILD_PACKAGE)
BUILD_PACKAGE:编译打包成APK文件
BUILD_STATIC_LIBRARY:用它来编译生成C\C++静态库(打包成.a文件)
BUILD_SHARED_LIBRARY :指向一个 GNU Makefile 脚本(应该就是在 build/core目录下的 shared_library.mk),用它来编译生成共享库(动态链接库.so)
BUILD_EXECUTABLE:编译C/C++应用程序
include $(call all-makefiles-under,$(LOCAL_PATH))
加载当前目录下的所有makefile文件,all-makefiles-under会返回一个位于当前'my-dir'路径的子目录中的所有Android.mk的列表
不编译apk:在mk文件头部加ifeq (0,1),尾部加endif
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := 工程名称
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
#不从apk中解压lib库而直接添加。注意前面的 @符号,@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v7a/libcryptox.so \
@lib/armeabi-v7a/libfb.so
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%,%,$(shell find $(LOCAL_PATH) -name "*.apk"))
include $(BUILD_PREBUILT)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_MODULE_TAGS := optional
LOCAL_PACKAGE_NAME := Sample
LOCAL_STATIC_JAVA_LIBRARIES := \
dui \
okio \
okhttp123
LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-design \
android-support-transition \
android-support-v13 \
android-support-v4 \
android-support-v7-appcompat \
android-support-v7-cardview \
android-support-v7-recyclerview
LOCAL_CERTIFICATE := platform
LOCAL_NO_CLUSTER_PACKAGE := true
LOCAL_PREBUILT_JNI_LIBS := \
jniLibs/armeabi/libca.so \
jniLibs/armeabi/libduidns.so \
jniLibs/armeabi/libduiutils.so \
jniLibs/armeabi/libnr.so
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
dui:/libs/DUI-lite-SDK-for-Android-1.2.2.jar \
okhttp123:/libs/okhttp-3.12.0.jar \
okio:/libs/okio-1.13.0.jar
include $(BUILD_MULTI_PREBUILT)
include $(call all-makefiles-under,$(LOCAL_PATH))
编译出来的apk运行出现如下错误:
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: FATAL EXCEPTION: main
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: Process: com.aispeech.sample, PID: 2224
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: "/system/priv-app/Sample/lib/arm/libca.so" is 64-bit instead of 32-bit
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: at java.lang.System.loadLibrary(System.java:1657)
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: at com.aispeech.auth.Auth.<clinit>(SourceFile:67)
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: at com.aispeech.auth.Auth.c(SourceFile:300)
05-08 16:31:45.973314 2224 2224 E AndroidRuntime: at com.aispeech.DUILiteSDK.isAuthorized(SourceFile:179)
mk文件中我放置了32bit以及64bit的所有so库,然后匹配的到了64bit的so库,机器却是32bit的。
关于查看机器bit,在build.prop中:
32bit:
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.cpu.abilist=armeabi-v7a,armeabi
ro.product.cpu.abilist32=armeabi-v7a,armeabi
ro.product.cpu.abilist64=
64bit:
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.cpu.abilist=armeabi-v7a,armeabi
ro.product.cpu.abilist32=armeabi-v7a,armeabi
ro.product.cpu.abilist64=arm64-v8a
关于查看编译后的apk中lib库bit:
取出so库,执行“file so库名称”