将apk预制到系统中,如果在不改变apk签名的情况下预置,编译后可以看到out 目录下确实是有这个apk,但是系统跑起来后会因为签名校验不过,导致这个apk自动被系统删除,需要将apk的签名改为系统签名,编译后大部分可以正常运行(网飞、小薇直播部分版本预制无法使用,手动安装就可以),但是一般apk都有在线升级的功能,一旦apk有新版本了会因为apk签名被改变导致升级不了,再加上部分apk预制后无法使用的问题,所以想找一个第一次开机时手动安装应用

编写安装脚本

#!/system/bin/sh

installed_mode=`getprop "persist.sys.apk.installed"`

if [ "$installed_mode" == "1" ]; then
	exit
fi

echo '============= start install apk ============='
DIR="/system/usr/app/"
filelist=`ls $DIR`
for apk in $filelist 
do
	if [ -f $DIR$apk ]; then
        pm install -r $DIR$apk
    fi
done
`setprop "persist.sys.apk.installed" "1"`
echo '============= end install apk ============='

脚本很简单,pm命令安装是不会弹出安装界面的,注意此脚本要在PackageManagerService起来后调用,否则无法安装,编写完成后最好先放到系统中手动运行,看看是否能正常运行

在开机rc文件中启动脚本服务

\device\厂商名\版型\init.版型.rc # 注意:不同厂家位置不同,一般在device目录下

android 预装app 恢复出厂可还原 安卓软件恢复初始状态_android

# start install Prefabrication apk
service install_preapk /vendor/bin/install_preapk.sh	# service 服务名称 运行脚本位置
    class main		#
    user root		#用户属性
    group root		#所属组
    disabled		#即通过class不能启动,只能start screencap 这种name的方式启动
    oneshot			#只运行一次
    seclabel u:r:install_preapk:s0 #这句是为加selinux权限添加的,android5.1以后不加则无法启动该服务

on property:dev.bootcomplete=1  	# 触发条件,当检测到dev.bootcomplete属性值更改为1的时候执行,即开机完成后
    chmod 0755 /vendor/bin/install_preapk.sh
    start install_preapk			#开启服务

添加SELinux权限

如果不加上面的 seclabel u:r:install_preapk:s0 这句话,也是可以编译通过的,但是服务不会启动,日志会显示无权限 service not start,报错信息忘截图了,seclabel u:r:install_preapk:s0 中的install_preapk 就是自己定义的权限文件

\device\mediatek\版型\fusion\sepolicy\file_contexts 同样不同厂家位置不同

android 预装app 恢复出厂可还原 安卓软件恢复初始状态_新版本_02

/vendor/bin/install_preapk.sh                           u:object_r:install_preapk_exec:s0
\device\mediatek\版型\fusion\sepolicy\install_preapk.te 这个文件是新增的

android 预装app 恢复出厂可还原 安卓软件恢复初始状态_正常运行_03

# 需要为新增的进程增加域、执行权限
type install_preapk, domain;	
type install_preapk_exec, vendor_file_type, exec_type, file_type;

# 调试;本进程所需权限均许可
#permissive install_preapk;

# 启用这个域
init_daemon_domain(install_preapk)

# 添加域权限
allow system_server mstar_system_prop:file getattr;
allow vendor_init install_preapk_exec:file setattr;
allow shell install_preapk_exec:file { read open entrypoint };

如果不增加权限会爆出 avc 错误,根据 acv 错误来补充权限即可

android 预装app 恢复出厂可还原 安卓软件恢复初始状态_正常运行_04


android 预装app 恢复出厂可还原 安卓软件恢复初始状态_正常运行_05

allow system_server mstar_system_prop:file getattr;

记得末尾加分号,最后第一次升级后会自动安装需要预制的应用了