目录
前言
简单记录一下在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
更新完之后,可单独编译更新部分或完整编译。
参考文章
-
《》
-
《