android aidl

简介: 引用:http://www.devdiv.com/thread-66219-1-1.html 之前写过一篇文章“[Android]使用命令行打APK包”,里面没有涉及到aidl,现Sodino补充aidl的使用方法。

引用:http://www.devdiv.com/thread-66219-1-1.html

之前写过一篇文章“[Android]使用命令行打APK包”,里面没有涉及到aidl,现Sodino补充aidl的使用方法。

aidl的使用帮助如下:

  1. C:\Documents and Settings\Administrator>aidl
  2. INPUT required
  3. usage: aidl OPTIONS INPUT [OUTPUT]
  4.        aidl --preprocess OUTPUT INPUT...
  5. OPTIONS:
  6.    -I<DIR>    search path for import statements.
  7.    -d<FILE>   generate dependency file.
  8.    -p<FILE>   file created by --preprocess to import.
  9.    -o<FOLDER> base output folder for generated files.
  10.    -b         fail when trying to compile a parcelable.
  11. INPUT:
  12.    An aidl interface file.
  13. OUTPUT:
  14.    The generated interface files.
  15.    If omitted and the -o option is not used, the input filename is used, with th
  16. e .aidl extension changed to a .java extension.
  17.    If the -o option is used, the generated files will be placed in the base outp
  18. ut folder, under their package folder
复制代码

这些信息太少了,还不能让人明白如何使用。帮助信息首句就是“INPUT required”,其实只有"INPUT"仍是不够的,OPTIONS中“-I”是必选而非可选,否则会提示:

  1. D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl:19: couldn't find import for class com.example.android.apis.app.IRemoteServiceCallback
复制代码

以SDK自带的ApiDemos为实践对象,该工程存储路径为:"D:\JavaTest\ApiDemos\",有三个aidl文件分别为:
com\example\android\apis\app\IRemoteService.aidl
com\example\android\apis\app\IRemoteServiceCallback.aidl
com\example\android\apis\app\ISecondary.aidl

要生成对应的.java文件命令行如下:

  1. aidl -ID:\JavaTest\ApiDemos\src  D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl
复制代码

对,你没看错,"-I"与"D:\JavaTest\***"之间是没有空格的。XX,看来Google里也有相当混蛋的程序员。
执行此条命令后,生成的.java会与.aidl文件在同一目录下。
如果想指定aidl的生成路径,则可以按照aidl的提示信息使用"-o"选项:

  1. aidl -ID:\JavaTest\ApiDemos\src  -oD:\JavaTest D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl
复制代码

对,你还是没看错,"-o"与"D:\JavaTest\**"中间还是没有空格,再次咒骂设计了aidl工具的那个混蛋。
执行此命令后,则生成的aidl文件存于"D:\JavaTest\"路径下了。
在ApiDemos中,IRemoteService.aidl与IRemoteServiceCallback.aidl是互相依赖的,在编译IRemoteService.aidl时,通过使用"-d"可以将其依赖的相关类输出到自定义的文件中。

  1. aidl -ID:\JavaTest\ApiDemos\src  -oD:\JavaTest  -dD:\JavaTest\aidl_dependency.txt D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl
复制代码

生成的aidl_dependenry.txt内容如下:

  1. : \
  2.   D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl \
  3.   D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteServiceCallback.aidl
复制代码

可选项中"-b"的用法不详,帮助信息中的那句“fail when trying to compile a parcelable.”就感觉少说了些内容,"fail"然后干嘛,XX,第三次咒骂设计了aidl工具的那个混蛋。
帮助信息中还有“aidl --preprocess OUTPUT INPUT...”,作用是根据要编译的.aidl生成预处理文件,但具体预处理起到什么,还请知道的兄弟姐妹们告诉我下啊,谢谢。
仍以ApiDemos为例,生成预处理文件为aidl.preprocess:

  1. aidl --preprocess D:\JavaTest\aidl.preprocess D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteServiceCallback.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\ISecondary.aidl
复制代码

生成的aidl.preprocess内容如下:

  1. interface com.example.android.apis.app.IRemoteService;
  2. interface com.example.android.apis.app.IRemoteServiceCallback;
  3. interface com.example.android.apis.app.ISecondary;
复制代码

SDK自带了预处理文件为<sdk_path>\platforms\android-<level>\framework.aidl。
“-p”表示编译aidl时以预处理文件为参去生成.java,命令方法如下:

  1. aidl -ID:\JavaTest\ApiDemos\src  -pE:\SoftSetup\AndroidSDK\android_sdk_r08_windows\platforms\android-3\framework.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl
复制代码

而通过查看adt的源码可以发现,adt编译aidl使用的正是系统自带的预处理文件framewrok.aidl。
adt源码处理aidl的文件为:<OpenSourceProjectPath>\sdk\eclipse\plugins\com.android.ide.eclipse.adt\src\com\android\ide\eclipse\adt\internal\build\PreCompilerBuilder.java,其中的handleAidl()即为编译aidl的执行方法。

相关文章
|
2月前
|
Java Android开发
[Android AIDL] --- AIDL工程搭建
[Android AIDL] --- AIDL工程搭建
18 0
|
2月前
|
Java 开发工具 Android开发
[Android AIDL] --- AIDL原理简析
[Android AIDL] --- AIDL原理简析
33 0
|
9月前
|
缓存 Android开发
|
11月前
|
Java Android开发
Android IPC系列(一):AIDL使用详解
AIDL可以实现进程间的通信,由于每个进程都是运行在独立的空间,不同的进程想要交互需要借助一些特殊的方式,AIDL就是其中的一种,AIDL是一种模板,因为实际交互过程中,并不是AIDL起的作用,具体会在之后源码分析解释,AIDL的作用是为了避免重复编写代码而出现的一个模板
|
Android开发
Android IPC 之 AIDL 原理
Android IPC 之 AIDL 原理
Android IPC 之 AIDL 原理
|
Java Android开发
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯
605 1
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯