客戶需求:需要在Android系統預安裝一個或者若干個apk,客戶可以選擇自行卸載并且卸載后系統再次啟動并不會再次自動安裝。
考慮到需要批量安裝應用,我這里考慮到使用靈活的shell腳本。shell腳本可以通過修改init.rc令其可以在開機時運行啟動,同時可以加入限制相應的判斷條件讓其在首次只run一次,這里命名shell腳本為install_apk.sh。以下是init.rc的配置啟動服務,通過添加如下聲明可以讓Android系統在啟動時運行install_apk.sh#install apk
android下載安裝apk,service install_apk /system/bin/install_apk.sh
class main
oneshot
安卓編譯打包?接下來我們來看install_apk.sh的實現,這里設計shell腳本的功能主要是實現安裝指定目錄下的apk,并且只運行一次,我們直接看腳本代碼。#!/system/bin/sh
installed_mode=`/system/bin/getprop "persist.sys.apk.installed"`
if [ "$installed_mode" != "DONE" ]; then
編寫apk。DIR="/system/usr/app"
DATA_DIR="/data/app"
cd $DIR
安卓shell工具。for apk in $(ls $DIR)
do
busybox cp $DIR/$apk $DATA_DIR
chmod 777 $DATA_DIR/$apk
done
fi
/system/bin/setprop persist.sys.apk.installed DONE
腳本的功能是劃分以下兩個部分
1、查詢/system/usr/app下的全部apk,通過copy到/data/app和修改其權限實現apk的安裝,
2、通過系統屬性persist.sys.apk.installed賦值給installed_mode變量,判斷應用是否已經安裝運行
這里可以查詢關于shell腳本的for使用方法進行優化,避免重復操作,之前少量apk的時候我是這樣寫的,如下busybox cp /system/usr/app/OfficeSuite.apk data/app
busybox cp /system/usr/app/ES.apk data/app
chmod 777 data/app/OfficeSuite.apk
chmod 777 data/app/ES.apk
如果預裝的apk多起來就很麻煩,你需要反復地修改你的腳本,真的是不堪其擾,因此使用for來處理。
當然在此之前,你還需要做的是把相關的apk在系統編譯時拷貝到/system/usr/app目錄下,常規做法是使用在device.mk文件中使用PRODUCT_COPY_FILES拷貝,但是考慮有可能會有很多個apk,我遇到有的客戶需要預裝10個應用,所以還是采取一勞永逸的辦法,批量拷貝,在對應的產品目錄下新建一個目錄,我這里命名為preinstallApk,將相關的apk拷貝到該目錄下,具體mk實現如下。define all-data-files-under
$(patsubst ./%,%, \
$(shell cd $(LOCAL_PATH)/$(1) ; \
find ./ -maxdepth 1? -name "*.apk" -and -not -name ".*") \
)
endef
COPY_APK_TARGET := $(call all-data-files-under,preinstallApk)
PRODUCT_COPY_FILES += $(foreach apkName, $(COPY_APK_TARGET), \
$(addprefix $(LOCAL_PATH)/preinstallApk/, $(apkName)):$(addprefix system/usr/app/, $(apkName)))
同理,shell腳本也是可以通過PRODUCT_COPY_FILES操作拷貝進系統,你可以選擇在device.mk或者preinstall.mk目錄添加以下定義PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/install_apk.sh:system/bin/install_apk.sh
至此,Android預裝apk可以完成了。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态