定义 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());
}
}
}