一、/build/make/tools/buildinfo.sh
echo "persist.sys.first_run=true" //设置是否启动app的变量
二、/vendor/nxp/tools/tools.mk //将当前路径system_shell.sh脚本文件放到android文件系统system/bin/中
CUR_PATH := vendor/nxp/tools
$(CUR_PATH)/sh/system_shell.sh:system/bin/system_shell.sh \
三、/device/nxp/imx8m/evk_8mp/sepolicy/file_contexts
/system/bin/system_shell.sh u:object_r:shell_exec:s0
/device/nxp/imx8m/evk_8mp/init.rc、、 init.rc进程启动时候, init.rc是init进程启动的配置脚本
//定义system_shell.sh脚本为system_shell服务,设置属性关闭服务之后不自动重启
service system_shell /system/bin/system_shell.sh
class main
user root
group root system
seclabel u:r:shell:s0
disabled
oneshot
seclabel <seclabel>
/*
在启动Service前将seclabel设置为seclabel. 主要用于在rootfs上启动的service,比如ueventd, adbd.
在系统分区上运行的service有自己的SELinux安全策略,如果不设置,默认使用init的安全策略.
为Service指定class名字. 同一个class名字的Service会被一起启动或退出,默认值是"default",第二个name可以不设置,用于service组.
group <groupname> [ <groupname>\* ]
在启动Service前将group改为第一个groupname,第一个groupname是必须有的,
默认值为root(或许默认值是无),第二个groupname可以不设置,用于追加组(通过setgroups).
oneshot选项表示该服务只启动一次,而如果没有oneshot选项,这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动
disabled 表示禁用服务,此服务开机时不会自动启动,但是可以在应用程序中手动启动它。
*/
四、/vendor/nxp/tools/sh/startApp.sh
#!/system/bin/sh
echo "run startapp server ....... " > /dev/kmsg
# start page
startActivity=com.sf.module.edms/com.dzh.EntryActivity //启动的dzh app包名
# round check delay time
checkAppProcessTimeDelay=1
i=1
while [ i -gt 0 ] //greater than 大于0
do
am start ${startActivity} //启动
i=$(($i-1))
sleep $checkAppProcessTimeDelay
done
三、/vendor/nxp/tools/sh/system_shell.sh
#!/system/bin/sh
/system/bin/startApp.sh &
五、/packages/apps/Settings/src/com/android/settings/BootReceiver.java
public class BootReceiver extends BroadcastReceiver{
String action = arg1.getAction();
if(action.equals(Intent.ACTION_BOOT_COMPLETED))//收到系统开机完成广播
{
}
//通过设置系统属性ctl.start将自动启动系统system_shell服务,从而进一步触发系统调用system/bin/startApp.sh脚本完成启动dzh.app
SystemProperties.set("ctl.start", "system_shell");
}
}
}
总结精华:
1、收到ACTION_BOOT_COMPLETED广播执行am start ${startActivity} 启动dzh.app。
到此本次话题启动dzh.app结束啦!