1、 撰寫一個(gè)aidl文件,定義服務(wù)的接口,將在編譯過(guò)程中通過(guò)aidl工具生成對(duì)應(yīng)的java接口。一般系統(tǒng)服務(wù)的aidl文件都放在framework\base\core\java\android\os目錄中。
以我所寫的IMyTool.aidl為例。在.aidl中定義自己需要加入的方法,編寫規(guī)則和java接口差不多,這里不多說(shuō)。
2、 將aidl文件名添加到frameworks\base\目錄下的Android.mk編譯腳本文件中。
如:
LOCAL_SRC_FILES += \
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl\
…\
core/java/android/os/IMyTool.aidl\
…
IMyTool.aidl即我加進(jìn)去的aidl文件,加入后才能在make過(guò)程中編譯到,否則將在后面的SystemServer添加系統(tǒng)服務(wù)時(shí)會(huì)報(bào)錯(cuò)提示找不到對(duì)應(yīng)類。
3、 編寫真正工作的服務(wù)類,繼承IMyTool.Stub類(AIDL文件名.Stub,aidl生成的接口中的內(nèi)部類,是一個(gè)Binder)。
服務(wù)類一般都放在framework\base\services\java\com\android\server目錄中。
例如:
public class MyToolService extends IMyTool.Stub {
實(shí)現(xiàn)IMyTool.aidl中定義的接口。
}
4、 將自定義服務(wù)注冊(cè)到SystemServer,使得開(kāi)機(jī)過(guò)程中被添加。
在framework\base\services\java\com\android\server目錄中的SystemServer中啟動(dòng)服務(wù)代碼處加入:
try {
Slog.i(TAG, "MyToolService");
ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context));// MyToolService構(gòu)造函數(shù)自己定義,一般都會(huì)用到Context
} catch(Throwable e) {
Slog.e(TAG, "Failure startingMyToolService", e);
}
上面代碼中Context.MY_TOOL_SERVICE是自己在Context類中定義的常量,也就是給服務(wù)定義的名字,使用常量方便獲取服務(wù),而不需要記住注冊(cè)服務(wù)時(shí)用的名字,且想換名字時(shí)只需改一個(gè)常量的值。
5、 由于在工程中添加了自己定義的類及常量,系統(tǒng)的api沒(méi)有更新,因此需要先在工程中make clean然后make update-api,執(zhí)行完后會(huì)發(fā)現(xiàn)frameworks\base\api\current.xml文件中多出自己定義的一些東西。current.xml這個(gè)文件包含了所有系統(tǒng)所有能被應(yīng)用層使用的類及其方法等。
之后再使用make編出來(lái)的固件及jar包就能包含自定義的接口。
編譯后如何使用:
將編出來(lái)的jar包通過(guò)lib方式導(dǎo)入工程。jar包位置:out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
調(diào)用以下代碼獲取自定義服務(wù):
IMyTool myTool = IMyTool.Stub.asInterface(ServiceManager.getService(MY_TOOL_SERVICE));
MY_TOOL_SERVICE即在Context中定義的常量。獲取到myTool后就可以調(diào)用在aidl文件中定義的接口了。
聯(lián)系客服