在 Gradle 中的 module/subprojects 中使用 AIDL 接口
Use AIDL interfaces across module/subprojects in Gradle
我有一个由多个 gradle 模块(插件 com.android.library)组成的项目,它们相互引用(树状,而不是平面状)。我大量使用 AIDL,因此碰巧我在另一个模块 (modB) 的 AIDL 接口中引用了一个模块 (modA) 的 AIDL 接口。
modA/src/main/aidl/modA/foo.aidl:
package modA;
interface foo {
void modAcall();
}
modB/src/main/aidl/modB/bar.aidl:
package modB;
import modA.foo;
interface bar {
foo modBcall();
}
modB/build.gradle:
dependencies {
compile project(':modA')
}
我可以在 modB 的 AIDL 文件中引用 modA 的 parcelables,我可以在 modB 的 java 代码中引用 modA 的接口,但不能在 modB 的 AIDL 中引用。相反,错误消息 couldn't find import for class
由 aidl 工具显示。
我注意到 .aar 文件也不包含有关库的 aidl 接口的信息,仅列出了 parcelables。我想这与上述问题的原因相同。
因为我已经将 aidl 文件放在一个地方,所以我不想将它们复制到另一个子项目,因为在那种情况下必须手动复制更改。我也不喜欢为此使用符号链接的想法,因为修改 modB 的 src 目录以包含来自 modA 的内容感觉不对。
- 有没有办法在 aar 中包含 aidl 接口,以便它可以被其他模块使用?
- 是否可以扩展 Gradle 中的 aidl 包含路径以使用依赖模块的 aidl 文件(对于子项目,这应该是可能的,因为 aidl 文件存在于文件系统上)而不 "compiling" 他们(生成的 java interface/classes 的 class 文件已经包含在 aar/module 导入中)?
我找到了解决办法。 Android gradle 构建工具中有一个明显未记录的功能,可以将任意 aidl 文件包含到输出 .aar 文件中。这使得在其他子项目中引用它们成为可能。
// In modA build.gradle
android {
aidlPackageWhiteList "src/main/aidl/foo.aidl"
}
这远非理想,但至少可以用来解决我的问题。
编辑:澄清这将在 modA(库)中,而不是 modB(根据问题,这是一个库,但并非在所有可能的情况下)。
我尝试 'aidlPackageWhiteList' ,它显示 "aidlPackageWhiteList is not supported" ,所以我尝试下面的另一种方法,它对我有用。
// in modB build.gradle
android {
sourceSets {
main {
aidl.srcDirs += '../src/main/aidl' // locate your modA aidl directory
}
}
}
我有一个由多个 gradle 模块(插件 com.android.library)组成的项目,它们相互引用(树状,而不是平面状)。我大量使用 AIDL,因此碰巧我在另一个模块 (modB) 的 AIDL 接口中引用了一个模块 (modA) 的 AIDL 接口。
modA/src/main/aidl/modA/foo.aidl:
package modA;
interface foo {
void modAcall();
}
modB/src/main/aidl/modB/bar.aidl:
package modB;
import modA.foo;
interface bar {
foo modBcall();
}
modB/build.gradle:
dependencies {
compile project(':modA')
}
我可以在 modB 的 AIDL 文件中引用 modA 的 parcelables,我可以在 modB 的 java 代码中引用 modA 的接口,但不能在 modB 的 AIDL 中引用。相反,错误消息 couldn't find import for class
由 aidl 工具显示。
我注意到 .aar 文件也不包含有关库的 aidl 接口的信息,仅列出了 parcelables。我想这与上述问题的原因相同。
因为我已经将 aidl 文件放在一个地方,所以我不想将它们复制到另一个子项目,因为在那种情况下必须手动复制更改。我也不喜欢为此使用符号链接的想法,因为修改 modB 的 src 目录以包含来自 modA 的内容感觉不对。
- 有没有办法在 aar 中包含 aidl 接口,以便它可以被其他模块使用?
- 是否可以扩展 Gradle 中的 aidl 包含路径以使用依赖模块的 aidl 文件(对于子项目,这应该是可能的,因为 aidl 文件存在于文件系统上)而不 "compiling" 他们(生成的 java interface/classes 的 class 文件已经包含在 aar/module 导入中)?
我找到了解决办法。 Android gradle 构建工具中有一个明显未记录的功能,可以将任意 aidl 文件包含到输出 .aar 文件中。这使得在其他子项目中引用它们成为可能。
// In modA build.gradle
android {
aidlPackageWhiteList "src/main/aidl/foo.aidl"
}
这远非理想,但至少可以用来解决我的问题。
编辑:澄清这将在 modA(库)中,而不是 modB(根据问题,这是一个库,但并非在所有可能的情况下)。
我尝试 'aidlPackageWhiteList' ,它显示 "aidlPackageWhiteList is not supported" ,所以我尝试下面的另一种方法,它对我有用。
// in modB build.gradle
android {
sourceSets {
main {
aidl.srcDirs += '../src/main/aidl' // locate your modA aidl directory
}
}
}