Framework搭桥记:让App与Hal层浪漫牵手,笑对Hal调用!
本文以幽默风格讲解了在Android 13.0系统中实现App、Framework和Hal三层联调的方法。重点介绍了三个关键组件:定义服务接口的ITestService.aidl、实现具体服务的TestService.java和注册服务的SystemServer.java。文章详细说明了通过AIDL定义接口、在Service中调用Hal层JNI方法,以及在SystemServer中注册服务的具体步
作为一名在Android新系统开发领域摸爬滚打多年的“嫩油条”,今天咱就来唠唠怎么在13.0系统里,把App、Framework、Hal这三层给撮合到一块儿。别看它们平时各干各的,只要路子对,让App直接调起Hal层接口,那都不是事儿!
前面咱已经让Hal层亮出了接口,JNI层也搭好了桥,接下来就剩临门一脚——在Framework层当个“月老”,把服务安排得明明白白。放心,这回咱不扯那些虚头巴脑的理论,直接上干货,保准让你笑着搞定代码!
核心“演员”表
要想这出“牵线大戏”演得漂亮,下面这几位核心角儿得先亮相:
-
ITestService.aidl(位于frameworks/base/core/java/android/app/):负责定义服务接口,相当于“相亲合约”。 -
TestService.java(位于frameworks/base/services/core/java/com/android/server/):实现具体服务,是真正的“红娘”。 -
SystemServer.java(位于frameworks/base/services/java/com/android/server/):系统服务大总管,负责把“红娘”请进门。
幕后花絮:Hal层那点事儿
Hal层(硬件抽象层)说白了就是个“翻译官”,躲在用户空间里,一边瞒着App硬件底层的那些小秘密,一边又给上层提供统一的硬件服务。Android为啥把它放用户空间?还不是为了哄好各大厂商——让人家把核心算法安安稳稳藏在Hal层,内核层只管粗活累活。这下你们懂了吧?
HIDL(Hal接口定义语言)就跟AIDL是亲戚,一个负责定义Framework和Hal之间的接口,一个负责App和服务之间的接口,都是Android世界里的“协议狂魔”。
开工:三步搞定Framework层
1. 先立个“相亲合约”(AIDL)
在 ITestService.aidl 里定义个简单的加法接口,方便后续传情达意:
aidl
package android.app;
interface ITestService {
int add(int a, int b);
}
2. 请来“红娘”本尊(TestService)
TestService.java 继承自 ITestService.Stub,实现接口并在JNI层调用Hal:
java
public class TestService extends ITestService.Stub {
public TestService() {
Log.d("TestService", "启动成功,Hal层我来啦!");
nativeInit(); // 初始化Hal连接
}
@Override
public int add(int a, int b) {
Log.d("TestService", "收到App调戏:a=" + a + ", b=" + b);
return nativeAdd(a, b); // 调用JNI方法,直奔Hal层
}
private static native void nativeInit();
private static native int nativeAdd(int a, int b);
}
3. 大总管注册服务(SystemServer)
在 SystemServer.java 的 startOtherServices() 方法里添一笔,把TestService塞进系统服务列表:
java
try {
traceBeginAndSlog("TestService");
ServiceManager.addService("test", new TestService()); // 注册名为"test"的服务
traceEnd();
} catch (Exception e) {
e.printStackTrace(); // 万一崩了,至少留个遗言
}
权限这东西,该低头时就低头
SELinux这保安头子可不是吃素的,不给他打点好了,啥服务都别想跑!赶紧在 service.te 和 service_contexts 里加个权限:
diff
# service.te 里追加 + type test_service, system_api_service, system_server_service, service_manager_type; # service_contexts 里加一行 + test u:object_r:test_service:s0
记住:开机抓selinux报错是必备技能,缺啥补啥,别硬刚!
总结:链子通了,啥都好说
至此,Framework层圆满完成任务!系统启动时自动初始化TestService,Hal层模块也被打开,App只要拿到ITestService接口,就能一路直通Hal层。下回咱就讲App怎么调这个服务——保证比你想象中还简单!
转载请注明出处https://blog.csdn.net/qq_15950325/article/details/151874539,谢谢合作!
更多推荐



所有评论(0)