前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Android][Framework] 添加系统服务

[Android][Framework] 添加系统服务

作者头像
wOw
发布2020-01-20 16:49:00
1K0
发布2020-01-20 16:49:00
举报
文章被收录于专栏:wOw的Android小站wOw的Android小站

做系统开发,有时候需要自己定义一些接口供App使用, 同时为了方便维护管理,就会需要自己建立一个服务,把新的功能集中在一起。下面就是新建一个系统服务的基本步骤。

  1. 添加接口 frameworks/base/core/java/android/app/IDemoManager.aidl package android.app; interface IDemoManager { int getCpuTemperature(); }
  2. 添加服务,实现aidl文件定义的接口 frameworks/base/services/core/java/com/android/server/DemoManagerService.java package com.android.server; import android.app.IDemoManager; import android.content.Context; import android.util.Slog; public class DemoManagerService extends IDemoManager.Stub { private Context mContext; public DemoManagerService(Context context) { mContext = context; Slog.d("Demo", "Construct"); } @Override public int getCpuTemperature() { return 100; // Test code } }
  3. 添加对应的Manager frameworks/base/core/java/android/app/DemoManager.java package android.app; import android.content.Context; import android.os.RemoteException; import android.util.Slog; public class DemoManager { Context mContext; IDemoManager mService; public DemoManager(Context context, IDemoManager service) { mContext = context; mService = service; } public int getCpuTemperature() { if (mService != null) { try { return mService.getCpuTemperature(); } catch (RemoteException e) { Slog.e("Demo", "RemoteException " + e); } } return -1; } }
  4. 添加aidl到Makefile src frameworks/base/Android.mk LOCAL_SRC_FILES += \ core/java/android/app/IDemoManager.aidl \
  5. 添加DEMO_SERVICE常量 frameworks/base/core/java/android/content/Context.java public static final String DEMO_SERVICE = "demo";
  6. 注册系统服务 frameworks/base/core/java/android/app/SystemServiceRegistry.java registerService(Context.DEMO_SERVICE, DemoManager.class, new CachedServiceFetcher<DemoManager>() { @Override public DemoManager createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(Context.DEMO_SERVICE); return new DemoManager(ctx, IDemoManager.Stub.asInterface(b)); }});
  7. 开机启动服务 frameworks/base/services/java/com/android/server/SystemServer.java try { ServiceManager.addService(Context.DEMO_SERVICE, new DemoManagerService(context)); } catch (Throwable e) { Slog.e("Demo", "Failed to start Demo Service " + e); }
  8. 编译源码,因为添加了接口,所以需要 make update-api 更新接口。然后再整编刷机。
  9. service list 查看服务,不存在,这是因为selinux权限没加。
  10. 添加sepolicy权限 device/qcom/sepolicy/msm8937/service.te type demo_service, system_api_service, system_server_service, service_manager_type; device/qcom/sepolicy/msm8937/service_contexts demo u:object_r:demo_service:s0
  11. 重新编译代码,使用下面测试代码验证 import android.app.DemoManager; DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE); Log.d(TAG, "Current temperature is " + om.getCpuTemperature()); 最终log打印出100,服务添加完成。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档