• Android的自启动


    最近要用到这个,所以也花时间看看。

    从分层来说,安卓的自启动也分成三种,app的自启动,framework服务的自启动,HAL服务的自启动。现在简单说说这三种吧。当然,我主要关注的还是最后一种。。。

    一 App的自启动

    1 AndroidManifest.xml中修改

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    

    2 编写广播接收器

    1. public class BootCompletedReceiver extends BroadcastReceiver {
    2. @Override
    3. public void onReceive(Context context, Intent intent) {
    4. if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
    5. // 启动应用的主活动
    6. Intent activityIntent = new Intent(context, MainActivity.class);
    7. activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    8. context.startActivity(activityIntent);
    9. // 或者启动服务
    10. Intent serviceIntent = new Intent(context, MyService.class);
    11. context.startService(serviceIntent);
    12. }
    13. }
    14. }

    3 在AndroidManifest.xml中注册广播接收器

    1. <receiver android:name=".BootCompletedReceiver" android:enabled="true" android:exported="false">
    2. <intent-filter>
    3. <action android:name="android.intent.action.BOOT_COMPLETED" />
    4. <category android:name="android.intent.category.DEFAULT" />
    5. </intent-filter>
    6. </receiver>

    二 Framework的自启动

    基本上和app差不多,有一些细微修改。

    AndroidManifest.xml中定义是这样的。

    <service android:name=".MyService" android:enabled="true" android:exported="false" />
    

    在广播接收器中启动服务是这样的。

    1. @Override
    2. public void onReceive(Context context, Intent intent) {
    3. if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
    4. Intent serviceIntent = new Intent(context, MyService.class);
    5. context.startService(serviceIntent);
    6. }
    7. }

    Hal service的自启动

    1 增加service.rc

    1. service SampleService /system/bin/sampleservice
    2. class hal
    3. user system
    4. group system
    5. # 如果在rc⽂件中添加了 'class hal',即归类为hal服务,会在init的start hal阶段通过
    6. hwservice启动所有的hal服务。

    在Android.bp中增加这个rc文件。

    2 增加Selinux权限

    关于这部分,可以看看我之前写的:SEAndroid学习12 -- SELinux-CSDN博客

    关于这个部分,有两个部分,是一个系统的配置,一个是服务的配置。

    系统配置:

    在瑞芯微的平台,是这样获取路径的:get_build_var BOARD_SEPOLICY_DIRS

    hwservice.te

    type vnd_nxpnfc_hwservice, hwservice_manager_type;

    hwservice_contexts

    1. vendor.nxp.nxpnfc::INxpNfc (对照manifest中增加的instance,别写错)
    2. u:object_r:vnd_nxpnfc_hwservice:s0

    file_contexts

    /vendor/bin/hw/vendor\.nxp\.nxpnfc@1\.0-service u:object_r:nxpnfc_hal_exec:s0

    服务配置:

    fileservice.te

    1. type nxpnfc_hal, domain;
    2. type nxpnfc_hal_exec, exec_type, vendor_file_type, file_type;
    3. init_daemon_domain(nxpnfc_hal)
    4. add_hwservice(nfc, vnd_nxpnfc_hwservice) # 如果是通过nfc进程启动新加的服务,才需要添

    具体可以参考这个:android 实现一个开机自启动的service_android开机自启动service-CSDN博客

    下周会具体做部分工作,到时候再更新把。。。

    参考:

    Rockchip_Developer_Guide_Android_SELinux(Sepolicy)_CN.pdf

  • 相关阅读:
    VUE结合elementui实现分页器列表
    基于SSM的家政服务网站
    STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
    Linux内存管理(二十六):shrink_list
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java教学管理系统upz69
    Python 的运算符和语句(条件、循环、异常)基本使用指南
    Java多线程篇(12)——ForkJoinPool
    PAA介绍
    谷粒学苑项目前台界面 (一)
    .NET Core MongoDB数据仓储和工作单元模式实操
  • 原文地址:https://blog.csdn.net/fanged/article/details/139720021