仰天大笑出门去,我辈岂是蓬蒿人。这篇文章主要讲述[Android][Framework] 添加系统服务相关的知识,希望能为你提供帮助。
新博客地址
http://wossoneri.github.io/2018/09/15/[android][Framework]create-system-service/
做系统开发,有时候需要自己定义一些接口供App使用, 同时为了方便维护管理,就会需要自己建立一个服务,把新的功能集中在一起。下面就是新建一个系统服务的基本步骤。
- 【[Android][Framework] 添加系统服务】添加接口
frameworks/base/core/java/android/app/IDemoManager.aidl
package android.app; interface IDemoManager { int getCpuTemperature(); }
- 添加服务,实现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 } }
- 添加对应的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; } }
- 添加aidl到Makefile src
frameworks/base/Android.mk
LOCAL_SRC_FILES +=core/java/android/app/IDemoManager.aidl
- 添加DEMO_SERVICE常量
frameworks/base/core/java/android/content/Context.java
public static final String DEMO_SERVICE = " demo" ;
- 注册系统服务
frameworks/base/core/java/android/app/SystemServiceRegistry.java
registerService(Context.ORISLINK_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)); }});
- 开机启动服务
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); }
- 编译源码,因为添加了接口,所以需要
make update-api
更新接口。然后再整编刷机。
- service list 查看服务,不存在,这是因为selinux权限没加。
- 添加sepolicy权限
type demo_service, system_api_service, system_server_service, service_manager_type;
device/qcom/sepolicy/msm8937/service_contexts
demou:object_r:demo_service:s0
- 重新编译代码,使用下面测试代码验证
import android.app.DemoManager; DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE); Log.d(TAG, " Current temperature is " + om.getCpuTemperature());
最终log打印出100,服务添加完成。
推荐阅读
- Android跨进程通信Messenger
- Android 美团Robust热更新 使用入门
- Android源码中final关键字的用法及final,finally,finalize的区别
- 安卓开发(Java)中关于final关键字与线程安全性
- Android7.0文件访问权限
- Android 关于 CountDownTimer onTick() 倒计时不准确问题源码分析
- Android原生开发,view标签导致RecyleView Adapter 中报错的奇葩问题
- Android Activity生命周期及启动模式
- Android7.0 API变更