android 源码framework中加入自定义服务

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

在android_7.1.1/frameworks/base/core/java/android/os/目录下建立ISelfManagerService.aidl文件。代码如下:

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

编译 ISelfManagerService.aidl 文件

在android_7.1.1/frameworks/base/Android.mk文件的LOCAL_SRC_FILES中添加自定义ISelfManager.aidl文件,可以看到这里有很多aidl文件。

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

        ...
然后使用命令mmm frameworks/base,此时会自动根据aidl文件生成对应的stub接口

mmm frameworks/base
 
 

 
 
添加远端实现代码 SelfManagerService.java
这里,我们没有特殊的需求就放在android_7.1.1/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 ISelfManagerService.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.java,  即客户端代理类
在android_7.1.1/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";
 
    ISelfManagerService mSelfManager;
 
    public SelfManager(Context ctx,ISelfManagerService 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);
    }
}

 
定义SELF_SERVICE服务名

在Context文件中,添加我们自定义的SelfService服务的名字 ---- self  ,  代码如下:

public static final String SELF_SERVICE = "self";
 
 
 
系统服务(SystemServer.java)中添加自定义服务SelfManagerService
 

我们知道wifi_service, location_service, window_service都必须添加到SystemServer中。SystemServer.java文件在以下目录。

frameworks/base/services/java/com/android/server/SystemServer.java

在SystemServer中添加自定义的SelfManagerService服务,服务名字用前面在Context中定义的SELF_SERVICE代替,代码如下:

private void startOtherServices() {
    ....
 
    ServiceManager.addService(Context.SELF_SERVICE, new SelfManagerService());
    ....
}

 

在SystemServiceRegistry.java中注册服务

在以下文件android_7.1.1/frameworks/base/core/java/android/app/SystemServiceRegistry.java中静态注册自定义SelfManagerService服务。代码如下:

Log.e("SelfManager", "----------------- before register selfManager service-------");
registerService(Context.SELF_SERVICE, SelfManager.class,
           new CachedServiceFetcher() {
                @Override
                public SelfManager createService(ContextImpl ctx) {
                    IBinder b = ServiceManager.getService(Context.SELF_SERVICE);
                    ISelfManager service = ISelfManager.Stub.asInterface(b);
            Log.e("SelfManager", "%%%%%%%%%%% SelfManager NEW %%%%%%%%%%%%%%");
                        return new SelfManager(ctx,service);
                    }});
 
Log.e("SelfManager", "++++++++++++++++++++ end register selfManager service-------");

 

更新sepolicy配置
 

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

不同版本不同厂商sepolicy文件位置不同,android7.1.1源码的位置在android_7.1.1/system/sepolicy/目录下面。

更新service.te文件
 

更新android_7.1.1/system/sepolicy/service.te文件,在里面找写代码,如下:

type self_service, system_api_service, system_server_service, service_manager_type;
 

注意这里写的self_service。 当前目录下另外一个文件service_contexts中添加的代码必须用这个字符串,代码如下:

self                                      u:object_r:self_service:s0
 

PS:前面写的self就是Context.java重定义的服务名SELF_SERVICE的内容。后面的self_service是前面service.te文件中定义的那个名字。

更新API
需要更新当前系统的API,执行如下命令:

make update-api -j4
 

完成之后会生成自己添加的服务的API。可以在android_7.1.1/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;
  }
 

编译代码
执行如下命令编译代码,更新system.img文件。

make -j8

验证SelfManagerService服务是否添加成功
 

在android studio IDE中新建一个工程TestSelfService。 获取SelfService服务,调用其函数,看是否正常。

由于用到的SelfManager类在android sdk中不存在,为了正常编译打包,可自定义一个module,新建一个SelfManager文件,内容如下:

package android.app;
 
 
public class SelfManager {
    public int selfAddNumber(int numberFirst, int numberSecond){
        return 0;
    }
 
    public String selfAddString(String originalStr){
        return null;
    }
 
}
 

不用写具体的函数实现,只要写空函数就行。打包成SelfManager-release.jar包,供工程使用。

打包时使用provided或compileOnly 只参与编译,不参与打包命令。打包成apk文件。测试代码如下:

package com.ts.sk.testselfservice;
 
import android.app.SelfManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
 
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = "SelfService";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.tv_tip).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                testSelfService();
            }
        });
    }
 
    private void testSelfService() {
        try {
            SelfManager sm = (SelfManager) getSystemService("self");
            if(sm == null) {
                Log.e(TAG, "self manager service is null....");
                return;
            }
            Log.d(TAG, "self manager before called....");
 
            int ret = sm.selfAddNumber(3, 4);
            Log.d(TAG, "self manager add num is:" + ret);
 
            String ret2 = sm.selfAddString("hello self service");
            Log.d(TAG, "self manager add String is:" + ret2);
 
        }catch (Exception e){
            Log.e(TAG, "self manager invoke method get exception, msg:" + e.getMessage());
        }
    }
}

你可能感兴趣的:(android,java,android,studio)