1. 程式人生 > >Android5.1 內建第三方APK及Android.mk檔案編寫(以在amlogic5.1公版系統內建百度輸入法為例)

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。