文章目录
简单记录一下在Framework中新增一个服务接口,方便应用调用,类似于获取AudioManager一样。
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Android P
面我们一步一步进行创建,我这里以创建一个XMediaManager为例。
Context新增服务名
参考系统服务的定义,
在Context.java中定义一个唯一的服务名。
\frameworks\base\core\java\android\content\Context.java
添加如下内容,具体位置随意。
这里放在AUDIO_SERVICE定义的附近。
public static final String X_MEDIA_SERVICE = "x_media";
创建IMedia.aidl
在创建AIDL文件前,需要创建存放的目录。
参考Android创建接口的规则,我们在创建自己的目录(新增\biumall\media)
\frameworks\base\core\java\android\biumall\media
这样包名就是
android.biumall.media
在目录中创建IMedia.aidl
//IXMedia.aidl package android.biumall.media;  interface IXMedia{ void setPath(String path); String getPath(); }
暂时功能简单点。创建了,就需要添加编译。
添加编译
在
\frameworks\base\
目录下,找到Android.bp
Android P开始都放bp了,之前的版本放mk
java_library { name: "framework", srcs: [ //略 //末尾添加我们新增的IXMedia.aidl "core/java/android/biumall/media/IXMedia.aidl", ], //略 }
创建XMediaService
为了方便管理和查询,放在同一个目录中
//XMediaService.java
package android.biumall.media;
import android.os.RemoteException;
public class XMediaService extends IXMedia.Stub {
    private String mPath = "XMediaService";
    @Override
    public void setPath(String path) throws RemoteException {
        mPath = path;
    }
    @Override
    public String getPath() throws RemoteException {
        return mPath;
    }
}
创建XMediaManager
//XMediaManager.java
package android.biumall.media;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.content.Context;
public class XMediaManager {
    private IXMedia iXMedia;
    public XMediaManager() {
        iXMedia = IXMedia.Stub.asInterface(ServiceManager.getService(Context.X_MEDIA_SERVICE));
    }
    public void setPath(String path) {
        try {
            iXMedia.setPath(path);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    public String getPath() {
        try {
            return iXMedia.getPath();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return "";
    }
}
注册服务
\frameworks\base\core\java\android\app\SystemServiceRegistry.java
注册XMediaManager。应用中可以通过getSystemService()获取XMediaManager对象。
//导入包名
import android.biumall.media.XMediaManager;
//参考AUDIO_SERVICE,放在这附近即可
registerService(Context.X_MEDIA_SERVICE, XMediaManager.class,
        new CachedServiceFetcher<XMediaManager>() {
    @Override
    public XMediaManager createService(ContextImpl ctx) throws ServiceNotFoundException {
        return new XMediaManager();
    }});
启动服务
服务的启动在SystemServer.java中,
\frameworks\base\services\java\com\android\server\SystemServer.java
这里启动服务分三步:
- 引导服务 
- 核心服务 
- 其他服务 
自己新增的服务放[其他服务]中,具体位置如下。
//导入包名
import android.biumall.media.XMediaService;
//找到startOtherServices在systemReady()语块的最末尾添加即可
private void startOtherServices() {
 	//略
 	try{
        ServiceManager.addService(Context.X_MEDIA_SERVICE,  new XMediaService());
    }catch(Throwable e){
        Slog.e(TAG, "Failure starting XMediaService", e);
    }
}
SEPolicy权限修改
由于我当前平台不改下面的配置,也是可以正常访问。这部分暂时没有严重。
我们在Context.java中添加
public static final String X_MEDIA_SERVICE = "x_media";
下面两个文件修改需要用到。
service.te
device\mediatek\mt2712\sepolicy\plat_public
新增内容如下
type x_media_service,system_api_service, system_server_service, service_manager_type;
这里只需要添加替换成为自己的X_MEDIA_SERVICE即可。
服务名 :x_media_service类型 :system_api_service, system_server_service, service_manager_type
service_contexts
\device\mediatek\mt2712\sepolicy\plat_private
新增内容如下
x_media u:object_r:x_media_service:s0
x_media_service服务设置类型为: u:object_r:demo_service:s0
x_media是对应Context.java新增的服务名值
x_media_service为在 service.te 定义的类型, 必须一一对应,否则无效!!!!
update-api
上新增了,接口和变量值,还需要update-api
//源码目录 source ./build/envsetup.sh lunch make update-api
更新完之后,可单独编译更新部分或完整编译。
参考文章
- 《》 
- 《 
