我是靠谱客的博主 笑点低巨人,这篇文章主要介绍Android5.1 Framework分析----如何在SystemServer中添加系统服务,现在分享给大家,希望可以做个参考。

本文以mtk android5.1为研究对象。

 

Android的系统服务都是托管给ServiceManager管理的,我们可以自定义一个自己的服务,并将其添加到ServiceManager中,本文以添加一个Tts语音服务为例,供应用层调用。

1、首先,在frameworks/base/core/java/android/app中新建一个aidl文件 ITtsManager.aidl,内容如下:

 

复制代码
1
2
3
4
5
package android.app; interface ITtsManager { int speak(String message, String from); int stop(); }


2、将此aidl文件加入编译列表frameworks/base/Android.mk:

 

 

复制代码
1
2
3
4
LOCAL_SRC_FILES += .... core/java/android/app/ITtsManager.aidl ....


3、在frameworks/base/services/core/java/com/android/server/tts路径下(路径可以自己改变)新建一个TtsManagerService.java类,该类继承了TtsManager.Stub,

 

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.android.server.tts; import android.content.Context; import android.speech.tts.TtsEngines; import android.speech.tts.TextToSpeech; import android.os.Handler; import android.util.Log; import android.app.ITtsManager; public final class TtsManagerService extends ITtsManager.Stub { private static final String TAG = "TtsManagerService"; final Context mContext; private final TextToSpeech mTts; public TtsManagerService(Context context) { Log.d(TAG, "Tts init complete"); } @Override public int speak(String message, String from) { //TODO: return 0; } @Override public int stop() {<pre name="code" class="java"> //TODO: return 0;

}}

 

复制代码
1
 


4、还得在frameworks/base/core/java/android/app创建一个管理器类TtsManager.java,

 

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package android.os; import android.content.Context; public class TtsManager { final ITtsManager mService; final Context mContext; public TtsManager(Context context, ITtsManager service) { mContext = context; mService = service; } public int speak(String message, String from) { try { return mService.speak(message, from); } catch (RemoteException e) { e.printStackTrace(); return -1; } } public int stop() { try { return mService.stop(); } catch (RemoteException e) { e.printStackTrace(); return -1; } } }


5、为了让应用层可以使用getSystemService接口获得服务,现在需要在ContextImpl.java的static代码块将TtsManager创建起来,

 

复制代码
1
2
3
4
5
6
7
8
9
10
/// M: comment @{ add TtsManagerService by Lee if ("1".equals(SystemProperties.get("ro.qxt.tts.support"))) { registerService("qxttts", new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService("qxttts"); //注意:qxttts 是服务名称 return new TtsManager(ctx, ITtsManager.Stub.asInterface(b)); } }); } /// @}


6、现在可以将这个服务加入到ServiceManager中了,

 

 

复制代码
1
2
3
4
5
6
7
try { Slog.i(TAG, "Tts Manager"); ServiceManager.addService("qxttts", new TtsManagerService(context)); //服务名称qxttts与上面对应 } catch (Throwable e) { Slog.e(TAG, "Failure starting Tts Manager", e); }

 

7、然后你可以在某个app的activity上获得这个服务,

 

复制代码
1
((TtsManager)getSystemService("qxttts")).speak("测试用语", "activity");


编译(先用update-api命令更新sdk),将相应模块push到手机上。。。

 

现在你可能会出现app启动报错的提示。。错误类似于speak方法处出现空指针,这是服务没起来,出现类似如下错误,

 

复制代码
1
2
ServiceManager( 232): add_service('qxttts',45) uid=1000 - PERMISSION DENIED

这是因为SELinux Policy限制,新加一个系统服务,你得先在device/mediatek/common/sepolicy/service_contexts注册你的服务,

 

 

复制代码
1
2
3
4
#Lee add begin qxttts u:object_r:system_server_service:s0 #Lee add end

此处是vendor自己加的文件,android原生的服务在external/sepolicy/service_contexts中注册,external/sepolicy/service.te定义了各种类型如system_server_service。

 

 

重新编译,可以验证了。。。

 

欢迎关注"东哥笔迹"

待续,有不对的地方,请指正。

 

最后

以上就是笑点低巨人最近收集整理的关于Android5.1 Framework分析----如何在SystemServer中添加系统服务的全部内容,更多相关Android5.1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部