前言
此博客以Android10爲準,請注意在預裝應用根據不同平臺(MTK、展訊、瑞芯微),也是有所區別的,所以實際導入細節請你的平臺文檔爲準。此篇博客只講解原生AOSP的預裝應用。
將應用添加到系統中,編譯前只有2個目錄可以存放應用vendor/apps與packages/apps
這兩個目錄其實沒啥區別,甚至存放應用就沒有目錄的限制,理論你隨意創建一個文件夾都可以,因爲識別路徑的關鍵是PRODUCT_PACKAGES配置(這個後面會講到)。但是這不符合規則默契,所以我們還是得老老實實的放到上面2個目錄中。
vendor/apps目錄是廠商的客製化目錄,存放一些第三方廠商的配置文件、firmware以及動態庫等等,其中也包括了應用。vendor這個目錄在原生aosp裏是不存在的,它需要你自己創建。但是如果你是用MTK或者展訊、瑞芯微的這些廠商的aosp,那麼 vendor目錄他們早就創建好了。
packages/apps目錄,完全是Android原生的應用目錄,裏面包含了Email、Music、Gallery、Launcher3 等等系統應用,你也可以在這個目錄下添加自己的應用。
所以這邊推薦是將自己的應用放到vendor客製化目錄下,方便與原生的應用隔開管理。至於有些人擔心應用的是否可卸載、是否是系統級應用,這與在不在vendor或者packages等等無關。 有關係的是Android.mk文件的配置,所以這點無需苦惱。
所以下面的博客中將講解如何將應用添加到vendor/apps。不講解如何將應用添加到packages/apps目錄,因爲操作上與添加到vendor/apps沒區別,只是路徑不同。
上面是編譯前的目錄,這裏是編譯後的目錄,在配置Android.mk文件,可以將應用編譯到如下目標文件:
- /system/framework 用於存放資源型應用(系統框架)
- /system/app 用於存放系統應用,不能卸載
- /systme/priv-app Android4.4+ 新增,系統 [ 核心 ] 應用存放路徑(最高權限)
- /vendor/app 用於存放廠商應用,可以卸載,恢復出廠時恢復
- /data/app 用於存放用戶應用,可以卸載,恢復出廠時不能恢復
- /data/app-private Android4.4+ 新增,受 DRM 保護的應用存放路徑
注意事項
應用架構
因爲Android模擬器爲了在電腦上流暢運行所以大部分人會選擇x86_64架構,而實體機大部分是ARM架構, 所以在添加預裝應用前,請先判斷自己的app選擇了什麼架構,因爲架構不支持會導致應用無法安裝。而現在的大部分主流的應用都只支持ARM架構,如果你是用模擬器正在學習framework開發,這裏建議自己用Android studio編譯一個支持x86_64的應用。
將應用添加到data_無源碼_無法卸載
創建目錄
這裏的vendor目錄其實是需要你自己在aosp根目錄下創建的(原生的aosp不自帶這個目錄),你可以通過下面這個命令一次性創建好全部目錄。
mkdir -p vendor/apps
接下來進入這個目錄,創建一個你需要導入的應用目錄,用來存放.apk與.mk文件,如下我創建了一個叫Calligraphy的應用目錄
~/aosp/vendor/apps$ mkdir Calligraphy
配置apk與android.mk文件
將apk文件cp到你創建目錄下,並且創建Android.mk文件
$ touch Android.mk
在Android.mk 填入如下內容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := Calligraphy.apk
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_PREBUILT)
最後目錄下的2個文件
Android.mk的參數解釋
LOCAL_MODULE
用來指定模塊的名稱,該模塊名稱需要加入到PRODUCT_PACKAGES(加入這參數下面會說)
LOCAL_MODULE_TAGS
用來指定該app在編譯什麼樣子的版本的時候會被安裝到機器上;
- user: 指該模塊只在user版本下才編譯
- eng: 指該模塊只在eng版本下才編譯
- tests: 指該模塊只在tests版本下才編譯
- optional:指該模塊在所有版本下都編譯
LOCAL_MODULE_CLASS
在採用預裝這種形式的時候,該變量來指定預裝的模塊的類型,此處爲APPS;
LOCAL_CERTIFICATE
用於設置APK的簽名模式,一共有如下四種:
- media 使用media簽名文件簽名
- platform 使用平臺簽名文件簽名,也就是系統簽名
- shared使用shared簽名文件簽名
- PRESIGNED 如果文件已經簽過名,不需要重新簽名,則使用PRESIGNED
LOCAL_SRC_FILES
要預裝的APK源文件;
LOCAL_PROPRIETARY_MODULE
配置device.mk文件
這裏可以搜索下device.mk,會發現device.mk會有很多同名文件,如下圖:
首先,我們需要修改目標在build/make目錄下,所以把目標縮小到這些目錄下,其次你會發現這些目錄下也有很多device.mk,這是是與你需要編譯的cpu架構有關,與你的在編譯時選擇lunch有關。 我自己這邊是選擇編譯的是lunch 24 所對應的就是x86_64.
所以,我這邊是打開generice_x86_64目錄下的device.mk進行修改。增加需要編譯的apk目錄,如果是第一次配置,沒有PRODUCT_PACKAGES配置項,你需要自己添加上去,並且增加上面的應用目錄名稱,如下圖片:
執行編譯後,查看結果
在編譯後的out文件查看結果
刷機查看結果
在設置中查看
用adb查看結果
$ adb shell
my_device_01:/ # cd vendor/app/
my_device_01:/vendor/app # ls
BiliBili Bing Calligraphy
將應用添加到vendor_無源碼_無法卸載
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/app
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
end