Android5.1 内置第三方APK及Android.mk文件编写(以在amlogic5.1公版系统内置百度输入法为例)
Android.mk文件用来向编译系统描述如何编译你的源代码。在编译整个工程的情况下,系统所找到的所有的Android.mk将会先存入subdir_makefiles变量中,随后一次性一次性include进整个编译文件中。
示例 Android.mk内容:
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := baidushurufa
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libar-emotion.so \
@lib/armeabi/libBaiduSpeechSDK.so \
@lib/armeabi/libbdEASRAndroid.so \
@lib/armeabi/libbdinput_gif_v1_0_10.so \
@lib/armeabi/libchiperencoder_v1_2_1.so \
@lib/armeabi/libface_detector.so \
@lib/armeabi/libface-jni.so \
@lib/armeabi/libffmpeg.so \
@lib/armeabi/libgnustl_shared.so \
@lib/armeabi/libjnicrash.so \
@lib/armeabi/libsimeji_ime.so \
@lib/armeabi/libturbonet.so \
@lib/armeabi/libvad.dnn.so \
@lib/armeabi/libyoga.so
include $(BUILD_PREBUILT)
语法讲解:
LOCAL_PATH := $(my-dir)
一般情况下Android.mk和需要编译的源文件在同一目录下,将LOCAL_PATH变量定义成本文件所在目录路径。
include $(CLEAR_VARS)
CLEAR_VARS的定义在build/core/clear_vars.mk中,它清除了上百个除LOCAL_PATH外的变量,因而LOCAL_PATH通常被认为是一个编译模块的开始标志。
LOCAL_MODULE := baidushurufa
LOCAL_MODULE 必须定义,以表示Android.mk中的每一个模块,名字必须唯一,不能包含空格。
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_CLASS 标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中。
LOCAL_SRC_FILES := $(LOCAL_MODULE)
$(COMMON_ANDROID_PACKAGE_SUFFIX))
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码,这里将模块打包为apk包
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_CERTIFICATE指apk的签名,可以有:
media 使用media签名文件签名
platform 使用平台签名文件签名
shared 使用shared签名文件签名
PRESIGNED 如果文件已经签过名,不需要重新签名,则使用PRESIGNED。
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS 是指定在什么版下才会编译这个Android.mk
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
LOCAL_DEX_PREOPT := false
这个变量设置为false可以使整个系统使用提前优化的时候,某个app不使用提前优化。在Android.mk中给该变量赋值为false,则编译生成的文件没有oat文件,也就意味着没有被提前优化。
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件
LOCAL_PREBUILT_JNI_LIBS:
提取so文件编译生成动态库
include $(BUILD_PREBUILT)
BUILD_PREBUILT :该模块已经预先编译
它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。
BUILD_STATIC_LIBRARY :编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE :编译为Native C可执行程序
BUILD_SHARED_LIBRARY :是Build System提供的一个变量,指向一个GNU Makefile Script。
NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。
在device\amlogic\common\core_amlogic.mk中的PRODUCT_PACKAGE添加LOCAL_MODULE。
这样就将一个百度输入法内置到系统中了,如果想要让系统默认使用此输入法,需要修改Settings参数可以参考另一篇https://blog.csdn.net/qq_33826580/article/details/80854636
上一篇: 字节对齐
下一篇: SQL日期和时间函数实例讲解