在Android系统中,为我们提供了很多的系统服务,比如AMS,PMS等,今天参考系统里其他服务的实现,在Android N原生代码中添加自己定制的服务,想想都满激动的

##准备工作##
在正式开始之前,需要知道下面两点以及满足下面条件:
###前提条件###

Android原生代码,可以通过make全编通过,编译完成之后,可以通过emulator命令启动out目录下生成的image文件,需要注意在执行emulator命令之前,需要执行source build/envsetup.sh构建环境,以及lunch选择产品

###如何调用系统服务###

// 比如WindowManagerService的使用WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

###系统服务的注册流程###

其实跟着上面的context.getSystemService代码,就可以知道系统服务的注册流程,实际上ContextImpl也是通过SystemServiceRegistry.getSystemService来获取具体的服务,这些系统服务都是在SystemServiceRegistry的static静态代码块中进行注册的

static {.....        registerService(Context.ACCOUNT_SERVICE, AccountManager.class,                new CachedServiceFetcher() {            @Override            public AccountManager createService(ContextImpl ctx) {                IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);                IAccountManager service = IAccountManager.Stub.asInterface(b);                return new AccountManager(ctx, service);            }});        registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,                new CachedServiceFetcher() {            @Override            public ActivityManager createService(ContextImpl ctx) {                return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());            }});.....}

具体可以参考Android中getSystemService流程

下面就是照葫芦画瓢的步骤
##定义ISelfManager.aidl文件

系统里面很多的aidl文件定义在/frameworks/base/core/java/android/os下,所以我们需要做的就是参考其他的aidl,照样子写一个简单的ISelfManager.aidl

/frameworks/basecore/java/android/os/ISelfManager.aidl

package android.os;interface ISelfManager {    int selfAddNumber(int numberFirst, int numberSecond);    String selfAddString(String originalStr);}

##更新Android.mk文件
在frameworks/base/Android.mk文件的LOCAL_SRC_FILES中系统添加了很多aidl文件,我们需要添加自己定义的ISelfManager.aidl文件

LOCAL_SRC_FILES += \core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \        .....        core/java/android/os/ISelfManager.aidl \

然后使用mmm frameworks/base,此时会自动根据aidl文件生成对应的stub接口,其实这里没有生成也没有关系,我们可以自己将该文件添加到Android studio中,让ADT自动生成也可以,这里主要是方便后面编写实现类,没有太多的实际意义。

##添加远端实现SelfManagerService.java
我们都知道像系统里的服务都是放在frameworks/base/services/core/java/com/android/server目录下的,比如:

  1. ActivityManagerService.java
    frameworks/base/services/core/java/com/android/server/am

  2. WindowManagerService.java
    frameworks/base/services/core/java/com/android/server/wm

这里,我们没有特殊的需求就放在frameworks/base/services/core/java/com/android/server里

SelfManagerService.java

package com.android.server;import android.util.Log;import android.os.ISelfManager;public class SelfManagerService extends ISelfManager.Stub {    private static final String TAG = "SelfManagerService";        public int selfAddNumber(int numberFirst, int numberSecond) {        Log.d(TAG,"I WILL CALCULATE IT numberFirst is:"+numberFirst+"  numberSecond is :"+numberSecond);return numberFirst + numberSecond;    }    public String selfAddString(String originalStr) {Log.d(TAG,"I will add a string to originalStr previous....");        return "previous lalala "+originalStr;    }}

##创建对应的SelfManager
/frameworks/base/core/java/android/app/SelfManager.java

package android.app;import android.util.Log;import android.os.ISelfManager;import android.content.Context;import android.os.RemoteException;public class SelfManager {    private static String TAG = "SelfManager";    ISelfManager mSelfManager;    public SelfManager(Context ctx,ISelfManager selfManager) {        mSelfManager = selfManager;    }    public int selfAddNumber(int numberFirst, int numberSecond) throws RemoteException {        Log.d(TAG,"SelfManager  selfAddNumber ......... ");        return mSelfManager.selfAddNumber(numberFirst,numberSecond);    }    public String selfAddString(String originalStr) throws RemoteException {Log.d(TAG,"SelfManager  selfAddString .........");        return mSelfManager.selfAddString(originalStr);    }}

##管理和注册SelfManagerService##
在开始之前,已经分析系统Service的注册流程,需要分别在SystemServer.java和SystemServiceRegistry.java中修改

  • 在SystemServer.java中将SelfManagerService添加到ServiceManager中管理,这里我添加到了startOtherServices方法中
private void startOtherServices() {    ....    ServiceManager.addService("selfservice", new SelfManagerService());    ....}
  • 在SystemServiceRegistry.java中注册我们的SelfManagerService服务
import android.os.ISelfManager;static {    ....    registerService("selfservice", SelfManager.class,                new CachedServiceFetcher() {                    @Override                    public SelfManager createService(ContextImpl ctx) {                        IBinder b = ServiceManager.getService("selfservice");                        ISelfManager service = ISelfManager.Stub.asInterface(b);                        return new SelfManager(ctx,service);                }});    ....}

这里的"selfservice",一般来说需要在Context.java中声明,然后在这里引用,比如系统中的其他服务调用时候的应用,都是在Context.java中定义的,比如
亲测可用Android原生代码添加系统服务_第1张图片

这一步,别忘记引包就行.

##更新sepolicy配置##
另外还需要更新sepolicy的配置,否则即使编译通过也是不会生效的。

###更新service.te文件###
service.te主要用来定义我们自己服务的类型,在/system/sepolicy/service.te目录下,不同厂商的定制可能导致该路径不同在该文件中已经定义了很多service类型,只需要照着画就行了。

type wifi_service, app_api_service, system_server_service, service_manager_type;// 参照 wifi_service的定义添加自己的定义就行了type self_service, system_api_service, system_server_service, service_manager_type;

###更新service_contexts文件###

selfservice     u:object_r:self_service:s0

现在万事已经具备了.全编就可以了,需要注意, 在全编之前,需要更新当前系统的API
执行make update-api -j4,完成之后会生成自己添加的服务的API

/frameworks/base/api/current.txt

public class SelfManager {    ctor public SelfManager(android.content.Context, android.os.ISelfManager);    method public int selfAddNumber(int, int) throws android.os.RemoteException;    method public java.lang.String selfAddString(java.lang.String) throws android.os.RemoteException;}

完成之后,执行make命令全编就可以了

##验证SelfManagerService##
自己独立编写一个应用,然后参照packages/apps/中的其他模块实现Android.mk,或者基于系统已有的应用来测试,这里我是在Mms中添加的

import android.app.SelfManager;import android.os.RemoteException;        try {            SelfManager selfManager = (SelfManager) getSystemService("selfservice");            int addResult = selfManager.selfAddNumber(3,4);            Log.d("Servicehahatest","result is :"+addResult);            String strResult = selfManager.selfAddString("HELLO WORLD...");            Log.d("Servicehahatest","result is :"+strResult);        } catch(RemoteException e) {    Log.d("Servicehahatest","RemoteException happend .....e is :"+e.toString());        }

此时运行效果如下:
这里写图片描述

OK,到此为止,在Android N中添加系统服务就完成了。

欢 迎 关 注 我 的 公 众 号 “编程大全”

专注技术分享,包括Java,python,AI人工智能,Android分享,不定期更新学习视频

更多相关文章

  1. Android 自定义下拉列表
  2. 【Android教程】Android用户系统管理
  3. 我对android系统一些看法
  4. VisionMobile:移动平台生态系统冲突报告(七)Chapter C:Android(上)
  5. Android 音乐播放器的实现(一)自定义按钮的实现
  6. 为android开放类增加自定义成员方法[转]
  7. Android安卓系统提示应用程序未安装的解决方法
  8. Android十岁了,它是如何逆袭成全球最多人用的手机系统的?
  9. Android10.0 系统解析(02)——搭建Android源代码编译调试环境

随机推荐

  1. android如何让webview里的资源访问本地缓
  2. android自动更新升级APP
  3. Android(安卓)来电翻转静音实现源码
  4. android 获取设备真实ip地址
  5. anroid 7.1添加自定义api服务
  6. Android圆角自定义View
  7. Android调试工具 —— TraceView [整理]
  8. Writing code that captures videos on A
  9. Android中使用HttpURLConnection和HttpCl
  10. android 5.0之后利用Intent传递Serializa