安卓系統預置應用apk的幾種方式

工做背景:根據客戶的需求須要在系統中集成一些apk,而且對集成的要求不一樣,有些須要集成後不能卸載,有些須要集成後能夠卸載。要求不一樣,實現的方法也不一樣。目前遇到的幾種需求以下:android

A)在安卓系統中預置能夠卸載的應用apk,手動能夠卸載,恢復出廠設置時,系統會從新安裝這些應用apkapp

實現方法:測試

一、在device/XXXX/x6818下面創建preinstall文件夾,在該文件夾內建立init.preload.sh文件:spa

#!/system/bin/sh # ln preload apks if [ ! -f "/data/app/exist" ]; then echo "preloading application ..." 
for FILE in `ls /system/preload`;do ln -s /system/preload/$FILE/$FILE.apk /data/app/preload_$FILE.apk done sync echo "completed!" > /data/app/exist chmod 777 /data/app/exist sync fi

(一、首先會判斷標識(即/data/app/exist這個節點)是否存在,若是存在則不執行連接命令,若是不存在,則執行Linux命令link,把預裝應用安裝包連接到data/app下。注:在終端設備第一次開機前不在data分區設置標識。code

二、在data分區添加標識。
三、掃描data分區的連接文件,根據連接文件實際掃描到預裝應用安裝包。開機過程當中,Package Manager Service會分別掃描system分區和data 分區的應用程序目錄,根據應用程序所在分區爲其設置相應屬性。掃描完後,根據應用程序的相應屬性將其安裝到終端設備。
四、終端設備非第一次開機時,直接獲取終端設備第一次開機時創建的連接文件。開機時,仍會執行init.preload.sh腳本,因爲已添加標識,所以當判斷出存在標識時,則不執行連接命令。
五、恢復出廠設置會刪除data分區的數據,也就是連接文件和標識都將被刪除。)orm

二、在preinstall文件夾內建立Android.mk文件:blog

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := init.preload.sh LOCAL_MODULE_TAGS := optional eng LOCAL_MODULE_CLASS := ETC LOCAL_SRC_FILES := init.preload.sh include $(BUILD_PREBUILT) include $(LOCAL_PATH)/preload/preload.mk

三、在preinstall文件夾內建立preload文件夾,在該文件夾下建立preload.mk文件:ip

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := meiweibudengdai LOCAL_SRC_FILES := meiweibudengdai/meiweibudengdai.apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := PRESIGNED LOCAL_DEX_PREOPT := false LOCAL_MODULE_SUFFIX := .apk LOCAL_MODULE_PATH := $(TARGET_OUT)/preload include $(BUILD_PREBUILT)

注:LOCAL_CERTIFICATE:= PRESIGNED指用軟件自帶的簽名。對應的LOCAL_CERTIFICATE:= platforms 是指用android源碼中的platform對其進行簽名源碼

LOCAL_CERTIFICATE指簽名方式,若是是platform,表明簽名成系統軟件, 若是仍是PRESIGND,表示用的是apk本來的簽名。it

四、在preload文件夾內建立應用程序文件夾***,將應用程序***.apk放在應用程序文件夾***內

五、修改device/XXXX/init.x6818.rc文件,定義在init.x6818.rc中的服務preload-sh,其做用是執行init.preload.sh腳本。代碼以下:

service preload-sh /system/bin/sh /system/etc/init.preload.sh class main user root oneshot

(此文件格式由安卓初始化語言定義,service爲關鍵字用來聲明一個Service:

 preload-sh表明Service的名字,
 /system/bin/sh表明所要執行的服務的路徑,
 /system/etc/init.preload.sh表明傳給服務的參數,
 class爲服務制定一個類別,該Service屬於main類別,
 user執行服務前切換到用戶root,該Service屬於root用戶,
 oneshot表明服務只啓動一次,一旦關閉就不能再啓動)

六、修改device/XXXX/x6818.mk文件,增長代碼: 

PRODUCT_PACKAGES += init.preload.sh PRODUCT_PACKAGES += \ ***

目錄結構以下:

device/XXXX/init.x6818.rc
device/XXXX/x6818.mk
device/XXXX/preinstall/init.preload.sh
device/XXXX/preinstall/Android.mk
device/XXXX/preinstall/preload/prelod.mk
device/XXXX/preinstall/preload/***/***.apk

注:該方法預裝apk跟手動安裝相同,無需預先導入lib庫中的.so文件

 

B)在安卓系統中預置不可卸載的應用apk,實現方法:
一、在vendor/XXXX/apps目錄下創建app文件夾,在該文件夾內建立應用程序文件夾***,將應用程序***.apk放在應用程序文件夾***內
二、在vendor/XXXX/apps目錄下創建Android.mk文件,增長代碼:

LOCAL_PATH   :=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := *** LOCAL_SRC_FILES := app/***/***.apk LOCAL_MODULE_PATH := $(TARGET_OUT_APPS) LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_OWNER := XXXX LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := &&& LOCAL_SRC_FILES := app/&&&/&&&.apk LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app/ LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_OWNER := XXXX LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT)

(注:1)默認預置apk到system/app/目錄,LOCAL_MODULE_PATH:= $(TARGET_OUT_APPS) 普通系統apk,不可卸載

        2)LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) 放在該目錄下的apk能夠卸載,卸載後,恢復出廠設置時,應用不會恢復
        3)LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app/ 放在該目錄下的apk能夠得到系統權限,系統核心apk,不可卸載(或者加入一句:  LOCAL_CERTIFICATE:= PRESIGNED)。
        4)?LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app, 預置APK使得用戶能夠卸載,而且恢復出廠設置時可以恢復?自測試無論用啊)
 
對於包含lib庫文件的apk,還須要根據預置目標路徑,在mk腳本文件中作不一樣的處理:
狀況一:對於預置到data/app目錄下的apk,包括可恢復和不可恢復(即上面的三、4狀況)能夠不用手動添加lib庫,apk在首次運行時,會自動將吱聲的lib庫抽取安裝到自身的根目錄。
狀況二:對於預置到system/app/和system/priv-app目錄下面的apk(即上面的一、2狀況)由於在android系統中。system分區是不容許應用執行寫操做的,所以須要在Android.mk腳本中進行配置,手動添加lib庫文件到編譯環境,以便lib庫文件在編譯以後拷貝到對應編譯後的apk目錄下,不然apk執行時會由於找不到lib庫而報錯。方法爲:手動解壓取出lib文件中的庫文件到當前apk的編譯目錄,在Android.mk中添加並配置變量(注意路徑對應):PRODUCT_COPY_FILES += \ vendor/9tripod/apps/app/itms/lib/libbsdiffjni.so:system/lib/libbsdiffjni.so

三、在vendor/XXXX/apps目錄下創建nxapps.mk文件,增長代碼

PRODUCT_PACKAGES += \ *** PRODUCT_COPY_FILES += \ vendor/XXXX/apps/app/***/lib/###1.so:system/priv-app/***/lib/arm/###1.so\ vendor/XXXX/apps/app/***/lib/###2.so:system/priv-app/***/lib/arm/###2.so

(注:須要在該文件中預先導入lib庫中的.so文件) 

 
四、在device/XXXX/x6818/device.mk文件,增長代碼,這樣安卓系統就會編譯nxapp.mk文件:

$(call inherit-product-if-exists, vendor/XXXX/apps/nxapps.mk)
相關文章
相關標籤/搜索