在Gradle

时间:2016-08-04 10:45:12

标签: android gradle aidl

我有一个项目,由多个gradle模块(插件com.android.library)相互引用(树,而不是平面)。我强烈使用AIDL,因此我从另一个模块(modB)的AIDL接口中的一个模块(modA)引用AIDL接口。

MODA / SRC /主/ AIDL / MODA / foo.aidl:

package modA; 
interface foo {
    void modAcall();
}

MODB / SRC /主/ 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中引用modA的接口。而是由aidl工具显示错误消息couldn't find import for class

我注意到.aar文件也不包含库的aidl接口的信息,只列出了parcelables。我想这与上述问题的原因相同。

由于我已经将aidl文件放在一个地方,我不想将它们复制到另一个子项目,因为在这种情况下必须手动复制更改。我也不喜欢使用符号链接的想法,因为修改modB的src目录以包含来自modA的东西是错误的。

  • 有没有办法在aar中包含aidl接口,以便其他模块可以使用它?
  • 是否可以在Gradle中扩展aidl include路径以使用依赖模块的aidl文件(对于子项目,应该是可能的,因为aidl文件存在于文件系统上)而不用编译"再次(生成的java接口/类的类文件已包含在aar / module导入中)?

2 个答案:

答案 0 :(得分:6)

我找到了解决方案。 Android gradle构建工具中有一个明显没有记录的功能,可以将任意的aidl文件包含在输出.aar文件中。这使得可以在其他子项目中引用它们。

android {
    aidlPackageWhiteList "modA/foo.aidl"
}

这远非理想,但至少可用于解决我的问题。

答案 1 :(得分:0)

我尝试使用“ aidlPackageWhiteList”,它显示“不支持aidlPackageWhiteList”,所以我在下面尝试了另一种方法,对我有用。

  // in modB build.gradle
  android {
        sourceSets {
            main {
                aidl.srcDirs += '../src/main/aidl'    // locate your modA aidl directory 
            }
        }
    }