安卓系统预置应用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)
相关文章
相关标签/搜索