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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章