ant 编译 aidl 报告错误: couldn't find import for class

本文详细介绍了AIDL工具的使用方法,包括输入参数、输出路径、依赖处理、预处理文件、生成路径指定等功能,并提供了实践案例。同时,解释了部分辅助选项的作用,如导入路径、生成依赖文件等。

Aidl的使用帮助如下:

[java]  view plain copy
  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”是必选而非可选,否则会提示:

[java]  view plain copy
  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文件命令行如下:

[java]  view plain copy
  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"选项:

[java]  view plain copy
  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"可以将其依赖的相关类输出到自定义的文件中.

[java]  view plain copy
  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内容如下:

[java]  view plain copy
  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:

[java]  view plain copy
  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内容如下:

[java]  view plain copy
  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,命令方法如下:

[java]  view plain copy
  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的执行方法。

 

转载请注明出处: http://blog.youkuaiyun.com/sodino/archive/2011/05/14/6419498.aspx

在 AOSP 中,`frameworks/base/core/java/android/app/IAvplayManager.aidl` 文件导入 `android.app.avplay.Attr` 和 `android.app.avplay.LongWrapper` 类报错找不到,可从以下方面解决: ### 文件路径与包名 确保 `Attr` 和 `LongWrapper` 类的文件位于与包名对应的目录下,即 `frameworks/base/core/java/android/app/avplay` 目录。若路径不匹配,将文件移动到正确位置。同时,检查类文件中的包声明是否为 `package android.app.avplay;`。 ### Android.mk 或 Android.bp 配置 - **Android.mk**:在 `IAvplayManager.aidl` 所在模块的 `Android.mk` 文件中,确保包含 `Attr` 和 `LongWrapper` 类的源文件。示例如下: ```makefile LOCAL_SRC_FILES := \ IAvplayManager.aidl \ avplay/Attr.java \ avplay/LongWrapper.java \ ... ``` - **Android.bp**:若使用 `Android.bp`,配置如下: ```bp java_library { name: "avplay-library", srcs: [ "IAvplayManager.aidl", "avplay/Attr.java", "avplay/LongWrapper.java", ], // 其他配置 } ``` ### 编译环境 - **清除编译缓存**:在 AOSP 根目录下执行 `make clobber` 清除编译缓存,然后重新编译。 - **检查环境变量**:确保 AOSP 编译环境变量正确设置,如 `ANDROID_BUILD_TOP`。可通过 `echo $ANDROID_BUILD_TOP` 检查,若有误,使用 `export ANDROID_BUILD_TOP=/path/to/aosp` 设置。 ### 代码问题 - **语法错误**:检查 `Attr` 和 `LongWrapper` 类文件是否存在语法错误,如拼写错误、类型不匹配等。 - **命名冲突**:确保类名唯一,避免与其他类或文件冲突。 ### 查找生成文件 若编译过程中生成了这些类的相关文件,可通过以下命令查找: ```sh cd aosp/out/soong/.intermediates find -name Attr.java find -name LongWrapper.java ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值