将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目录下
# 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
同样不同厂家位置不同
/vendor/bin/install_preapk.sh u:object_r:install_preapk_exec:s0
\device\mediatek\版型\fusion\sepolicy\install_preapk.te
这个文件是新增的
# 需要为新增的进程增加域、执行权限
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 错误来补充权限即可
allow system_server mstar_system_prop:file getattr;
记得末尾加分号,最后第一次升级后会自动安装需要预制的应用了