Android-aidl初窥

本文详细介绍AIDL在Android中的应用,从创建AIDL文件、服务端Binder接口定义到客户端跨进程调用流程,实现字符串数据传递,适合初学者实践。

AIDL怎么用,也许由于是工作性质的原因,很多人都没有使用过aidl.

网上教程又是很懵逼,然后只好自己实践一下,做一下实践记录.

作为一名合格Android开发人员,Service肯定是听过的,Service是Android四大组件之一,它是不依赖于用户界面的,就是因为Service不依赖与用户界面,所以我们常常用于进行一些耗时的操作.

比如:下载数据等;进行读写文件等等.我们也常常用到了intentservice
有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activity、broadcast receiver来说,使用可能并不是特别的多,所以对Service来说,

正题

首先第一步,创建aidl文件夹,很简单,android studio提供了这个快捷的方式,我们到src目录,直接右键,创建aidl目录即可,非常方便.

第二步

我们创建一个aidl文件

鼠标移到我们第一步创建的aidl目录里面,然后右键,创建一个aidlfile.很简单,直接生成了

如果创建成功,内容则是

// IMyAidlInterface.aidl
package com.ccx.aidlservice;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

由于只是做下案例,所以,我们就只是单纯的写一个方案来对外提供一个字符串,修改一下,就只是普通的接口而已,非常方便

package com.ccx.aidlservice;

interface IMyAidlInterface {
    String getString();
}

接着我们就是创建一个服务,将onBind方法中返回的Ibinder,我们返回一个自己的.需要继承我们刚刚生成的aidl的接口,并且实现他的方法,我们这里返回了一个字符串.当然,四大组件都是要注册的,这个也不例外.我们需要在清单文件中,注册一下

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
        </service>

很简单,如果这个接口找不到,我们得编译一下,编译成功会在build->generated->source->aidl->debug中生成一个路径,里面会有编译后的aidl文件


public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBind();
    }

    public class MyBind extends IMyAidlInterface.Stub {

        @Override
        public String getString() throws RemoteException {
            return "aadskjfi";
        }
    }
}

这个进程就是这样创建完成了.我们将其安装到手机上,这是第一个进程.

创建二号进程

我们需要创建第二个进程来调用这个进程的服务返回这个字符串.通过aidl

我们创建第二个module.

生成activity,并且在其中写入了一个button.绑定点击事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void start(View view) {
    
    }
}

这里需要一个aidl,我们将上面那个aidl复制过来,目录也要一样,什么都不能变.同样需要编译一下

而后我们启动这个服务.通过bindservice的方式.这里面这个BIND_AUTO_CREATE是Context自带的的key.结果是1


    public void start(View view) {
        Intent intent = new Intent("com.ccx.aidlservice.MyService");
        intent.setPackage("com.ccx.aidlservice");
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

这里的intent中需要一个action.似乎我们没有过滤action.重新到第一个进程中的清单文件里面,加入一个action修改为,然后安装一下

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.ccx.aidlservice.MyService" />
            </intent-filter>
        </service>

回到第二个进程中.重新介绍参数 conn则是我们的ServiceConnection.我们生成一个成员的ServiceConnection

  private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            IMyAidlInterface IMyAidlInterface = com.ccx.aidlservice.IMyAidlInterface.Stub.asInterface(service);
            try {
                String string = IMyAidlInterface.getString();
                System.out.println(string);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

这里面conn中的getString就是我们返回的值

安装第二个进程,我们启动点击按钮

成功打印.非常完美

同样这个是一个跨进程的通信,可以通过这个方式,去通知其他app做事情

点击查看源码

就介绍到这里~~~

 

<think>好的,用户现在问的是关于“aonutility-hal-aidl”的定义、功能、用途。首先,我需要结合之前提供的引用内容来解析这个组件可能的含义。 根据用户提供的引用[1],设备清单(device manifest)用于向框架说明提供的组件类型,可能是AIDL或HIDL。这说明在Android系统中,AIDL和HIDL都是定义硬件接口的重要方式。引用[2]提到hidl-gen和hidl2aidl工具的区别,hidl2aidl专门生成AIDL文件,这可能意味着AIDL是较新的接口定义方式,替代或补充HIDL。而引用[3]讨论了直通式和绑定式HAL的实现方式,说明HAL的不同通信机制。 用户之前的问题是关于将ADB输出保存到文件,但现在转向了AIDL相关的HAL组件,可能是在进行Android系统开发或调试,特别是在处理硬件抽象层时遇到的问题。用户可能正在开发或维护一个使用AIDL定义的HAL组件,需要了解其结构和作用。 首先,“aonutility-hal-aidl”这个名称可以拆解为几个部分:“aonutility”可能是模块或功能名称,“hal”代表硬件抽象层,“aidl”表示使用AIDL接口定义。结合引用内容,推测这是一个用AIDL定义的HAL服务,用于提供特定硬件功能。 根据引用[1],设备清单中需要定义这样的组件,所以aonutility-hal-aidl可能是在设备清单中声明的AIDL服务,供框架识别。引用[2]提到hidl2aidl生成AIDL文件,可能这个组件是由HIDL转换而来,或者直接使用AIDL定义,简化开发流程。 功能方面,AIDL HAL通常用于进程间通信,可能负责与硬件交互,如传感器、电源管理等。用途可能涉及系统服务调用硬件功能,比如电源优化、性能监控等。用户可能需要了解如何定义和实现这样的组件,以及它在系统中的角色。 另外,用户可能关心与HIDL HAL的区别,比如绑定式与直通式,但根据引用[3],AIDL可能更倾向于使用绑定式,通过Binder通信,而直通式可能较少使用。需要解释AIDL HAL的优势,如更好的类型安全、支持更多语言等。 需要确保回答覆盖定义、功能、用途,并引用提供的参考资料,同时联系之前的ADB日志问题,可能用户是在调试这样的HAL组件时需要捕获相关日志,所以可以建议使用之前提到的ADB命令来监控该服务的日志输出。</think>### AonUtility-HAL-AIDL 的定义与作用解析 #### 1. **基本定义** **AonUtility-HAL-AIDL** 是 **基于AIDL接口定义的硬件抽象层(HAL)组件**,主要用于在Android系统中提供 **特定硬件功能的标准化接口**。其核心定义包含以下要素: - **AIDL接口文件**:通过`.aidl`文件定义硬件服务接口(如`IAonUtility.aidl`),描述服务提供的方法和数据类型[^1][^2]。 - **设备清单声明**:在`device manifest`中注册该HAL组件,向Android框架声明其存在及功能范围[^1]。 - **实现类**:通过`defaultPassthroughServiceImplementation`或`registerAsService`等API实现接口的具体功能(绑定式或直通式)[^3]。 #### 2. **核心功能** | 功能类型 | 说明 | |----------------|----------------------------------------------------------------------| | **硬件交互** | 封装底层硬件操作(如传感器控制、电源管理、性能优化等) | | **跨进程通信** | 通过Binder机制实现应用层与硬件服务的通信(绑定式HAL)[^3] | | **类型安全** | AIDL提供强类型检查,避免HIDL中可能存在的序列化/反序列化问题[^2] | #### 3. **典型用途** 1. **系统服务集成** 例如在电源管理模块中,通过`AonUtility-HAL-AIDL`提供设备低功耗状态的控制接口: ```aidl // IAonUtility.aidl interface IAonUtility { boolean enterLowPowerMode(); int getBatteryUsageStats(); } ``` 2. **硬件能力抽象** 对芯片级功能(如AI加速、安全协处理器)进行抽象,供上层应用通过`ServiceManager`调用: ```java IBinder binder = ServiceManager.getService("aonutility"); IAonUtility service = IAonUtility.Stub.asInterface(binder); service.triggerHardwareOptimization(); ``` 3. **调试支持** 可通过ADB命令实时监控HAL层日志(需结合前文提到的日志保存方法): ```bash adb logcat -s AonUtilityHal ``` --- ### 与HIDL HAL的关键差异 | 特性 | AIDL HAL | HIDL HAL | |---------------------|-----------------------------------|-----------------------------------| | **接口定义语言** | Android Interface Definition Language | Hardware Interface Definition Language | | **代码生成工具** | `hidl2aidl`(将.hal转为.aidl)[^2] | `hidl-gen`(生成C++/Java代码)[^2] | | **通信模式** | 强制使用Binder(绑定式)[^3] | 支持直通式(同一进程)或绑定式 | | **版本兼容性** | 支持前向兼容(通过`@VintfStability`) | 需严格版本匹配 | --- ### 实现要点示例 ```cpp // 实现AIDL接口的C++类 class AonUtilityHal : public IAonUtility::BnHwService { public: ::ndk::ScopedAStatus enterLowPowerMode() override { // 调用底层硬件驱动 writeToKernelDriver("/dev/aon_power", "LPM=1"); return ::ndk::ScopedAStatus::ok(); } }; // 注册为系统服务 int main() { ABinderProcess_setThreadPoolMaxThreadCount(4); auto service = ndk::SharedRefBase::make<AonUtilityHal>(); AServiceManager_addService(service->asBinder().get(), "aonutility"); ABinderProcess_joinThreadPool(); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值