Android-HAL (四) AIDL

新增aidl接口

vendor/godv/hardware/interface/mytest/aidl/android/hardware/mytest/IMyTest.aidl

复制代码
package android.hardware.mytest;
import android.hardware.mytest.MyTestObj;
@VintfStability
interface IMyTest {
    MyTestObj test();
}

vendor/godv/hardware/interface/mytest/aidl/android/hardware/mytest/MyTest.aidl

复制代码
package android.hardware.mytest;
@VintfStability
parcelable MyTestObj {
    String key;
    int value;
}

vendor/godv/hardware/interface/mytest/aidl/Android.bp

backend 后端包含4种,c++ | java | ndk | rust 本文使用ndk 和 java,cpp置为false

复制代码
aidl_interface {
    name: "android.hardware.mytest",
    vendor_available: true,
    srcs: ["android/hardware/mytest/*.aidl"],
    stability: "vintf",
    backend: {
        cpp: {
            enabled: false,
        },
        java: {
            sdk_version: "module_current",
        },
        rust: {
            enabled: false,
        },
    },
}

mmm vendor/godv/hardware/interface/mytest/

报错

API dump for the current version of AIDL interface android.hardware.mytest does not exist.

Run the command "m android.hardware.mytest-update-api" or add "unstable: true" to the build rule for the interface if it does not need to be versioned

m android.hardware.mytest-update-api


编译中间文件

godv@godv-OptiPlex-7070:~/ass/godv/code/lineage/out/soong/.intermediates/vendor/godv/hardware/interface/mytest/aidl$ ls -la

total 36

drwxrwxr-x 9 godv godv 4096 12月 20 20:51 .

drwxrwxr-x 3 godv godv 4096 12月 20 20:34 ..

drwxrwxr-x 3 godv godv 4096 12月 20 20:50 android.hardware.mytest_interface

drwxrwxr-x 3 godv godv 4096 12月 20 20:51 android.hardware.mytest-V1-java

drwxrwxr-x 3 godv godv 4096 12月 20 20:34 android.hardware.mytest-V1-java-source

drwxrwxr-x 14 godv godv 4096 12月 20 20:51 android.hardware.mytest-V1-ndk

drwxrwxr-x 3 godv godv 4096 12月 20 20:34 android.hardware.mytest-V1-ndk-source

drwxrwxr-x 18 godv godv 4096 12月 20 20:51 android.hardware.mytest-V1-rust

drwxrwxr-x 3 godv godv 4096 12月 20 20:51 android.hardware.mytest-V1-rust-source

android.hardware.mytest-V1-ndk 代表aidl相关的库

android.hardware.mytest-V1-ndk-source 代表aidl相关的源文件 bn bp



新增服务

vendor/godv/hardware/interface/mytest/aidl/default/Android.bp

复制代码
cc_binary {
    name: "android.hardware.mytest-service",
    init_rc: ["android.hardware.mytest.rc"],
    vintf_fragments: ["mytest-default.xml"],
    vendor: true,
    srcs: [
        "MyTestImpl.cpp",
        "main.cpp",
    ],
    relative_install_path: "hw",
    shared_libs: [
        "libbase",
        "libbinder_ndk",
        "liblog",
        "libutils",
        "libcutils",
        "android.hardware.mytest-V1-ndk",
    ],
}

vendor/godv/hardware/interface/mytest/aidl/default/android.hardware.mytest.rc

复制代码
service vendor.mytest-default /system/bin/hw/android.hardware.mytest-service
    class hal
    user root
    group root

vendor/godv/hardware/interface/mytest/aidl/default/main.cpp

cpp 复制代码
#include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include "MyTestImpl.h"

using aidl::android::hardware::mytest::MyTestImpl;
using aidl::android::hardware::mytest::IMyTest;

int main(int, char* argv[]) {
    android::base::InitLogging(argv, android::base::KernelLogger);
    ABinderProcess_setThreadPoolMaxThreadCount(0);
    std::shared_ptr<IMyTest> service = ndk::SharedRefBase::make<MyTestImpl>();

    const std::string instance = std::string(IMyTest::descriptor) + "/default";
    auto status = AServiceManager_addService(service->asBinder().get(), instance.c_str());
    CHECK_EQ(status, STATUS_OK) << "Failed to add service " << instance << " " << status;
    LOG(INFO) << "IMyTest AIDL service running...";

    ABinderProcess_joinThreadPool();
    return EXIT_FAILURE;  // should not reach
}

vendor/godv/hardware/interface/mytest/aidl/default/mytest-default.xml

XML 复制代码
<manifest version="1.0" type="device">
    <hal format="aidl">
        <name>android.hardware.mytest</name>
        <version>1</version>
        <fqname>IMyTest/default</fqname>
    </hal>
</manifest>

vendor/godv/hardware/interface/mytest/aidl/default/MyTestImpl.cpp

cpp 复制代码
#define LOG_TAG "MyTestImpl"

#include "MyTestImpl.h"
#include <android-base/logging.h>

using ndk::ScopedAStatus;

namespace aidl {
namespace android {
namespace hardware {
namespace mytest {

ScopedAStatus MyTestImpl::test(MyTestObj* _aidl_return) {
    *_aidl_return = mTestObj;
    LOG(INFO) << "Computing shared secret";
    return ScopedAStatus::ok();
}

}  // namespace MyTestImpl
}  // namespace hardware
}  // namespace android
}  // namespace aidl

vendor/godv/hardware/interface/mytest/aidl/default/MyTestImpl.h

cpp 复制代码
#pragma once

#include "aidl/android/hardware/mytest/BnMyTest.h"

namespace aidl {
namespace android {
namespace hardware {
namespace mytest {
class MyTestImpl : public BnMyTest {
    MyTestObj mTestObj = {"test", 66};
    ::ndk::ScopedAStatus test(::aidl::android::hardware::mytest::MyTestObj* _aidl_return) override;
};

}  // namespace mytest
}  // namespace hardware
}  // namespace android
}  // namespace aidl
相关推荐
pengyu28 分钟前
【Kotlin 协程修仙录 · 大乘境 · 初阶】 | 跳出三界:协程在 KMP 与后端开发中的跨平台之道
android·kotlin
XiaoLeisj33 分钟前
Android Memory Profiler:堆内存指标、内存抖动与泄漏定位
android·性能优化·内存抖动·内存泄露·memory profiler
未来猫咪花35 分钟前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
古法安卓41 分钟前
Android-重启流程源码解析
android·java·android studio
协议的旁观者2 小时前
Android 高级逆向实战(一):对抗 360 企业加固,Native 抽取还原与 Activity 生命周期重建
android
mmsx4 小时前
osmdroid 屏幕坐标与测量坐标互转:中心点+比例尺仿射换算
android·源码·地图·osmdroid
00后程序员张4 小时前
Android证书绑定抓包失败?Android SSL Pinning绕过实战指南
android·网络协议·计算机网络·网络安全·adb·https·ssl
杉氧5 小时前
页面栈与路由:React Navigation 与 Expo Router 深度实践
android·前端·react native
XiaoLeisj5 小时前
Jetpack Compose 知识点
android·kotlin·android jetpack·compose
又见情义6 小时前
RK3568 Android 13开机时间优化-系统应用裁剪实践
android