Android中aidl如何import文件

本文详细解析了如何使用AIDL命令行工具,并解决了在使用过程中遇到的常见错误。通过深入研究AIDL工具的工作原理及命令选项,如-I和-p参数的具体用法,帮助开发者更好地理解和运用AIDL。

 

如果你做Android开发,那就应该会知道aidl工具的,但是会使用aidl命令行工具的人有吗有吗有吗,如果有的话你们为神马不出来写写怎么用!!!!

用aidl命令行的如果不出意外肯定会遇见类似这样的错误

 

 

 

遇到错误,自然要先看下aidl的帮助是怎么写的

 

 

 

看到如此简洁不明了的介绍你有何感想?

多写一句会死啊!!!我讨厌这种假人,以为开发Android的人理解能力都很强吗,不仅help此般不负责任,tutorial也是如此,只有一句

 


让我们来一步步解决这个猪血问题

当文档不能帮你的时候,看Android代码吧。如何获取代码,Google的文档写的很清楚,其实Google大部分的文档都还是够明了的TAT

以下ANDROID代表android代码树的根

ANDROID/frameworks/base/tools/aidl里是aidl工具的C++代码,我没从中获得有用信息。或许很可能是我对C++代码不太有感。。。

一炮打不响就换一个洞,既然Eclipse可以处理aidl文件,我就来上Eclipse的Android插件ADT吧。aidl相关的文件是这个

 

你问我如何找到的吗?Linux上的经典工具要经常用才能算是经典

 

880行有一个private boolean handleAidl函数,看名字就是这地方了。一路摸下去,直到890行

 

看到吗,在这儿发现了-p参数,但还不知道它是什么,顺着此条代码追踪,我们找到了这样一个文件

 

现在找到30行,我们终于知道,原来这个-p所指的file created by --preprocess to import就是一个名叫framework.aidl的文件

 

哈哈,让我来验一验你的真身!!!

 

这个framework.aidl文件也很脑残,虽说注释不是很重要,但是这个代码根本就没有半点自我解释能力,也不写个注释说明自己有什么用途--

到此,-p参数确认

革命远未结束,要想解决这个猪血问题,还要知道-I参数的写法。

继续看上面PreCompilerBuilder.java文件的896行

 

我想你能看出这是什么意思来了,就是你项目的source目录,一般来说是src那个目录

至此,问题解决,最後总结下使用aidl命令行工具的方法就是

 

谢谢国家,打完收工

 

Android 中,AIDLAndroid Interface Definition Language)是一种接口定义语言,它允许开发者定义客户端和服务端之间进行进程间通信(IPC)的接口。AIDL 的核心目标是简化跨进程通信的复杂性,使得开发者能够像调用本地方法一样调用远程服务的方法。 ### AIDL 的使用方法 #### 1. 定义 AIDL 接口 首先,需要创建一个 `.aidl` 文件来定义接口。AIDL 支持基本数据类型、String、CharSequence、List、Map 以及实现了 `Parcelable` 接口的对象。例如,定义一个简单的接口 `IStringService.aidl`: ```aidl // IStringService.aidl package com.example.remoteservice; interface IStringService { void logString(); } ``` 如果接口中涉及自定义的 `Parcelable` 类型,则需要为其创建一个 `.aidl` 文件来声明该类型。例如: ```aidl // User.aidl package com.kotlin.aidltest; parcelable User; ``` #### 2. 实现服务端 在服务端,需要创建一个继承自 `Service` 的类,并在其中实现 AIDL 接口中定义的方法。通常通过继承 AIDL 接口的 `Stub` 类来实现远程调用逻辑。例如: ```java public class RemoteService extends Service { public RemoteService() { } @Override public IBinder onBind(Intent intent) { return new StringService(); } private class StringService extends IStringService.Stub { @Override public void logString() throws RemoteException { Log.i("my", "remote service get success"); } } } ``` 在 `AndroidManifest.xml` 中注册服务: ```xml <service android:name=".RemoteService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="RemoteService.ACTION" /> </intent-filter> </service> ``` #### 3. 客户端绑定服务并调用方法 客户端通过绑定服务来获取 `IBinder` 对象,并将其转换为 AIDL 接口的实例,从而可以调用远程方法。例如: ```java private IStringService iStringService; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iStringService = IStringService.Stub.asInterface(service); try { iStringService.logString(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { iStringService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(new Intent(this, RemoteService.class), serviceConnection, Context.BIND_AUTO_CREATE); } ``` #### 4. 处理自定义 Parcelable 类型 如果接口中涉及自定义的 `Parcelable` 类型,例如 `User`,则需要确保该类实现了 `Parcelable` 接口,并且在 AIDL 文件中正确声明该类型。例如: ```java // User.java public class User implements Parcelable { private String name; private int age; // 构造方法、describeContents、writeToParcel 方法 protected User(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } } ``` 在 AIDL 文件中声明该类型: ```aidl // User.aidl package com.kotlin.aidltest; parcelable User; ``` 然后在接口中使用该类型: ```aidl // IUserService.aidl package com.example.remoteservice; import com.kotlin.aidltest.User; interface IUserService { User getUser(int age, String name); } ``` ### AIDL 的优势与限制 AIDL 的优势在于它提供了一种标准化的方式来定义跨进程通信的接口,简化了 IPC 的实现过程。它支持多种数据类型,包括基本类型、字符串、列表、映射以及自定义的 `Parcelable` 类型。 然而,AIDL 也有一些限制。例如,它不支持异常处理,所有的方法调用都可能抛出 `RemoteException`。此外,AIDL 的性能相对较差,因为每次调用都需要进行跨进程通信,这涉及到数据的序列化和反序列化。 ### 总结 AIDLAndroid 中实现跨进程通信的一种强大工具,它通过定义接口的方式简化了 IPC 的复杂性。通过创建 AIDL 接口、实现服务端逻辑、客户端绑定服务并调用远程方法,开发者可以轻松地实现跨进程通信。尽管 AIDL 有一些限制,但它仍然是 Android 中实现 IPC 的一种常用方法。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值