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
相关推荐
Android技术之家3 小时前
2026 Android开发五大趋势:AI原生、多端融合、生态重构
android·重构·ai-native
龚礼鹏3 小时前
图像显示框架七——createSurface的流程(基于Android 15源码分析)
android
聆风吟º3 小时前
【Spring Boot 报错已解决】Spring Boot项目启动报错 “Main method not found“ 的全面分析与解决方案
android·spring boot·后端
Rysxt_4 小时前
Kotlin前景深度分析:市场占有、技术优势与未来展望
android·开发语言·kotlin
莫白媛4 小时前
Android开发之Kotlin 在 Android 开发中的全面指南
android·开发语言·kotlin
broadview_java14 小时前
使用 ConstraintLayout 构建自适应界面
android
wy31362282117 小时前
android——开发中的常见Bug汇总与解决方案(闪退)
android·bug
小小测试开发18 小时前
实战派SQL性能优化:从语法层面攻克项目中的性能瓶颈
android·sql·性能优化
QuantumLeap丶19 小时前
《Flutter全栈开发实战指南:从零到高级》- 26 -持续集成与部署
android·flutter·ios