简述aidl
的用途
aidl(Android interface definition language)
用于进程间的通信。
而aidl
作用就是来弥补这个缺陷,实现方法在不同项目的共享。
增加Frameworks
代码
首先我们需设计好暴露给APP
端的API
接口,这里我们采用aidl
的机制实现
frameworks/base/core/java/android/os/IFMService.aidl
package android.os;
interface IFMService {
int getADC();
int getFreq();
void setFreq(int freq);
void searchNextorPreFreq(int enable);
void setNextorPreFreq(int enable);
void enableMute(int enable);
int getIsMute();
void startAutoSearch();
}
回到frameworks/base
目录,编写编译规则,生成Stub
接口文件
frameworks/base/Android.mk
在LOCAL_SRC_FILES += \
中添加:
core/java/android/os/IFMService.aidl \
需要先编译生成java
文件:mmm frameworks/base
frameworks/base/core/java/android/os/IHQFMService.aidl:3 interface IFMService should be declared in a file called android/os/IFMService.aidl.
AIDL
规定,文件名必须和interface XXX
名字相同,否则会报上面错误。
frameworks/base/services/java/com/android/server/FMService.java
这个文件中,我们把函数调用传递到了JNI
package com.android.server;
import android.content.Context;
import android.os.IFMService;
import android.util.Slog;
2步:实现AIDL
文件生成的JAVA
接口Stub
public class FMService extends IFMService.Stub {
private static final String TAG = "LedService";
public int getADC(){
return getADC_native();
}
public int getFreq(){
return getFreq_native();
}
public void setFreq(int freq){
setFreq_native(freq);
return ;
}
public LedService() {
native_ledOpen();
}
private static native int getADC_native();
private static native int getFreq_native();
private static native void setFreq_native(int freq);
最后在Frameworks
中我们需要启动我们的FMservice
进入frameworks/base/services/java/com/android/server
目录,在SystemServer.java
文件中添加
Slog.i(TAG, "FM Service");
ServiceManager.addService("fm5767", new FMService());
1.6.编译service
(若修改了service
的实现方法可模块编译service
模块)
进入frameworks/base/services/java
,使用命令mm
进行编译,在out
目录下的system/frameworks
下生成services.jar
,使用adb
直接cp
到板子上重启即可生效