在Gradle中跨模块/子项目使用AIDL接口

k4ymrczo  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(310)

我有一个由多个相互引用(树形,而非平面)的gradle模块(plugin com.android.library)组成的项目。我大量使用AIDL,因此我会在一个模块(modA)的AIDL接口中引用另一个模块(modB)的AIDL接口。
模式A/源代码/主文件/辅助文件/模式A/文件名。辅助文件:

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

模块B/源代码/主文件/辅助文件/模块B/条形辅助文件:

package modB;
import modA.foo;
interface bar {
    foo modBcall();
}

modB/构建版本:

dependencies {
    compile project(':modA')
}

我可以在modB的AIDL文件中引用modA的parcelables,也可以在modB的java代码中引用modA的接口,但不能在modB的AIDL中引用。相反,aidl工具显示错误消息couldn't find import for class
我注意到. aar文件也不包含库的aidl接口的信息,只列出了可打包的接口,我想这和上面描述的问题有着相同的原因。
因为我已经把aidl文件放在一个地方了,所以我不想把它们复制到另一个子项目中,因为在这种情况下,修改必须手动复制。我也不喜欢使用符号链接的想法,因为修改modB的src目录以包含modA中的内容感觉不对。

  • 有没有办法在AAR中包含AIDL接口,这样它就可以被其他模块使用了?
  • 是否可以在Gradle中扩展aidl include路径以使用依赖模块的aidl文件(对于子项目,应该可以,因为aidl文件存在于文件系统中),而无需再次“编译”它们(生成的java接口/类的类文件已包含在aar/模块导入中)?
to94eoyn

to94eoyn1#

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

// In modA build.gradle
android {
    aidlPackageWhiteList "src/main/aidl/foo.aidl"
}

这远非理想,但至少可以用来解决我的问题。
编辑:澄清这将是在modA(库),而不是modB(根据问题,这是一个库,但不是在所有可能的情况下)。

ruoxqz4g

ruoxqz4g2#

我尝试了“aidlPackageWhitelist”,它显示“aidlPackageWhitelist不受支持”,所以我尝试了下面的另一种方法,它对我很有效。

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

b4lqfgs43#

我的答案与@Marvin W相同,但路径参数不同
//在modA内部版本.gradle中

aidlPackagedList "com/xxx/xxx/xxx.aidl"

相关问题