Android系統開發 Android10_添加預裝應用

前言

  此博客以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

LOCAL_PRIVILEGED_MODULE 決定了其編譯後的在ROM中的安裝位置: 如果不設置或者設爲false,安裝位置爲system/app; 如果設置爲true,安裝位置爲system/priv-app。

配置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

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