2021-02-05
關鍵字:預置第三方APK
1、預置帶源碼的工程
1.1、APK
理論上可以在源碼任意位置存放你的APK工程,但一般都將它放在 ./vendor/xxx/apps 或 ./packages/apps 目錄下。
然后再以如下內容創建一個 Android.mk 文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
# apk的名稱 LOCAL_PACKAGE_NAME := GPIOAPI LOCAL_SRC_FILES := $(call all-subdir-java-files) \ src/com/unionman/gpioapi/IGPIOManager.aidl LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_ENABLED := disabled ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_PACKAGE_NAME) include $(BUILD_PACKAGE)
1.2、C程序
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := DTUServer LOCAL_SRC_FILES := \ DTUServer.c \ 485Listener.c \ GPIOListener.c \ messenger.c \ timer.c \ parser.c LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include LOCAL_CFLAGS += -DCONFIG_LOG_DEBUG ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE) include $(BUILD_EXECUTABLE)
2、預置無源碼的APK
2.1、預置為普通應用
普通系統應用即與用戶自行下載並安裝的APK完全一樣的,是用戶可隨意卸載且在卸載后即使是恢復出廠設置也不能恢復的應用。這種應用恢復出廠設置操作不僅不會恢復已卸載的應用,還會將沒有卸載的應用也一並清理掉。
預置這種應用有三種 Android.mk 編寫方式:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TsBrowser LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) LOCAL_CERTIFICATE := PRESIGNED ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE) include $(BUILD_PREBUILT)
這種方式的關鍵在 ALL_DEFAULT_INSTALLED_MODULES ,這一句使得在編譯大包時能夠將這個應用打包進系統鏡像中去。
第二種方式的 Android.mk 編寫方式如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TsBrowser LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT)
與第一種方式相比,少了 ALL_DEFAULT_INSTALLED_MODULES 語句。但是這種方式必須要在 ./device/<manufactor>/<product>/device.mk 文件中添加如下語句:
PRODUCT_PACKAGES += TsBrowser
只有添加了這條語句才能讓你預置的應用在編譯大包時一並打包進系統鏡像中去。
最后一種方式其實只有兩句話,它是直接利用 cp 命令來將要預置的應用拷貝到 out 目錄指定位置下以待打包進系統鏡像中的:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
$(shell mkdir -p $(TARGET_OUT_DATA_APPS) ) #直接利用拷貝命令來預置 $(shell cp -af $(LOCAL_PATH)/TsBrowser.apk $(TARGET_OUT_DATA_APPS))
2.2、預置為普通系統應用
系統應用,用戶不可卸載,安裝位置為 /system/app 。
其 Android.mk 內容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TsBrowser LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_PREBUILT_JNI_LIBS:= \ @lib/armeabi-v7a/libAnalyzeData.so \ @lib/armeabi-v7a/libAudioEngine.so \ ... @lib/armeabi-v7a/libWndVideos.so LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS) ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE) include $(BUILD_PREBUILT)
上面的 LOCAL_PREBUILT_JNI_LIBS 所描述的就是 APK 中的 so 庫的名稱。使用這種方式預置APK時,要先將APK中的所有庫文件提取出來以待編譯時自動預置這些庫文件。否則的話可能導致運行APK時報找不到對應的動態庫錯誤。
當然,這里同樣可以直接在編譯時使用 cp 命令來將 APK 拷貝至編譯結果 out 目錄下的 /system/app 目錄下,其 Android.mk 內容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(shell mkdir -p $(TARGET_OUT)/app ) #利用拷貝命令來預置 $(shell cp -af $(LOCAL_PATH)/TsBrowser.apk $(TARGET_OUT)/app)
使用這種直接拷貝的方式時應主動為 APK 簽個名,否則可能會有無法安裝的問題。同樣也得將所有的動態庫拷貝至 /system/lib 目錄下。
2.3、預置為私有系統應用
私有系統應用即安裝目錄為 /system/priv-app 的應用,這些應用在 Android 系統中作為等級最高的應用。 /system/app 下的應用仍能在設置--應用中看到安裝信息,但 /system/priv-app 下的則無法在常規應用中查看到它們的信息。
不過預置這種形式的應用與預置普通系統應用的基本一致,所不同的就是它多了一條 mk 語句:
LOCAL_PRIVILEGED_MODULE := true
3、預置普通文件
直接在編譯時通過 cp 命令拷貝至你希望它存在的目錄就可以了,任何文件都可以以這種方式來預置。
LOCAL_PATH := $(call my-dir) # ----------------------- script ---------------------------# include $(CLEAR_VARS) UM_FILES_PATH = $(LOCAL_PATH)/script UM_OUT = $(TARGET_OUT)/bin $(shell mkdir -p $(UM_OUT) ) define find_script_files $(shell find $(1) -type f -name "*.sh" -exec cp {} $(UM_OUT) \;) endef $(call find_script_files, $(UM_FILES_PATH) ) $(shell cp -af $(LOCAL_PATH)/xxx/my_file.file $(TARGET_OUT)) # -----------------------
4、循環拷貝預置文件
在編譯大包時將指定目錄下的所有指定類型文件預置進系統鏡像中,請直接參閱筆者的另一篇文章: