【发布时间】:2014-04-09 09:25:46
【问题描述】:
我一直在尝试将 IPC 用于多 apk 项目。
其中一个公开了一个带有很多方法的服务。其中一些方法将 Parcelable 对象作为参数(或返回它们)。
我做的第一件事是为我的服务创建一个aidl文件。
这是这个aidl文件的一小部分:
package com.test.myapp;
import com.test.mylib.Settings;
interface ISettingsService {
boolean getSettings(in com.test.mylib.Settings arg1);
}
我使用 Android Studio 和 gradle,所以我将这个aidl 文件保存在我的模块的 src/main/aidl/com/test/myapp/ 文件夹中。
由于 Settings 对象是 Parcelable,Android 文档指出我还必须为其声明一个aidl 文件。请注意,Settings 类位于另一个包中,因为它是在包含的 jar 库中定义的,我无法修改。
所以我创建了 src/main/aidl/com/test/myapp/Settings.aidl 文件:
package com.test.mylib;
parcelable Settings;
在构建时,编译器应该打开我的aidl 文件并生成我可以实现的适当的 ISettingsService 存根对象。问题是编译器给了我这个错误:
error: cannot find symbol
_arg0 = com.test.mylib.Settings.CREATOR.createFromParcel(data);
^
symbol: variable CREATOR
location: class Settings
/.../myapp/build/source/aidl/debug/com/test/myapp/ISettingsService.java:89: error: cannot find symbol
arg1.writeToParcel(_data, 0);
^
symbol: method writeToParcel(Parcel,int)
location: variable arg1 of type Settings
2 errors
:myapp:compileDebugJava FAILED
通过阅读错误,我认为编译器没有理解 Settings 类是 Parcelable。
您知道为什么它不起作用吗?我阅读了很多关于这方面的文章,看起来很清楚也很容易做到。
【问题讨论】:
-
Settings.aidl应该在同一包中的Settings.java旁边。可以试试吗? -
Settings.aidl 位于aidl/ 文件夹中的同一包中。如果我尝试放入 java/ 文件夹,aidl 构建将失败,因为它找不到导入。此外,Settings 类的源代码位于预构建的 jar 中。
-
请注意,我尝试了一个虚拟的、更简单的程序,在该程序中我定义了自己的可打包对象和一个非常简单的aidl 接口,但我遇到了完全相同的问题。
标签: android ipc android-gradle-plugin aidl