作为一名在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,谢谢合作!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐