将Gradle依赖项res复制到另一个Gradle依赖项

3
我目前正在为Android开发一些插件,并遇到了一个问题,即在实施所有插件的最终项目中找不到资源。要部署插件,我使用 gradlew install,它会生成一个.aar,其中包含 .jar 和一个res文件夹,该文件夹包含来自该项目的资源文件。
问题概述:

插件 A 使用谷歌的 com.android.support:cardview-v7:23.2.0 依赖项。

插件 A 现在将一个外部库添加到该项目中并可以访问 cardview res 文件夹。

在编译 插件 B 时,它使用来自插件 A 的资源,这是 cardview 的一个实例。

这个 cardview 使用来自 插件 Ares 文件夹的资源文件。

插件 B 现在将 插件 A 作为依赖项添加。

插件 B 现在具有来自插件 Ares文件夹,但仍然缺少来自cardview依赖项的资源项目。

此时抛出的错误是: Error:(8) No resource identifier found for attribute 'cardCornerRadius' in package... 这是因为插件 B像这样使用 cardview
   <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="200dp"
        android:layout_height="200dp"
        card_view:cardCornerRadius="4dp">

        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v7.widget.CardView>

缺少的`card_view:cardCornerRadius`在我的项目中找不到,因为它从`Plugin A`未被复制到`Plugin B`中。我的问题如下:是否有一种方法让`Plugin B`知道`card_view:cardCornerRadius`是什么,而不必将`com.android.support: cardview-v7: 23.2.0`依赖添加到`Plugin B`中,而是从`Plugin A`复制它过来?

尝试将A的R包导入B中。 - Robert Rowntree
这不适用于 XML,它只是在 res 文件夹中搜索文件。 - Raymond
2个回答

2

Raymond,aar 不会包含所需的依赖项!至少相比于 jar ,这并不容易。你需要重新导入这些依赖项到你的应用中。比如说,app 使用了 plugin-B(aar),而 Plugin-B 又使用了 plugin-A 作为依赖。 Plugin-B 能够访问 plgin-A 的资源,但是应用却不能。你需要再次将 plugin-A 导入到你的应用中。请参考:文档:依赖管理

仅有 artifact 标记创建了一个模块依赖项,它只下载指定扩展名的 artifact 文件。已有的模块描述符则会被忽略。

你可以尝试在从 plguin-B 生成 aar 时向 plugin-A 应用传递依赖项,类似于这样:

compile ('com.apipas:plugin_a:1.0.0@aar'){
       transitive=true
}

祝你好运。

感谢您的回答。看起来这正是我正在寻找的,但是当我从本地.aar文件中编译它们时,传递似乎无法工作,我通过添加flatdirs找到了这些文件。经过一番搜索,我发现这是因为在这种情况下缺少pom文件而导致无法工作。要实际测试您的答案,我需要设置一个maven仓库。 - Raymond
很高兴能帮到您..我通过在应用程序模块重新导入依赖项来做了同样的事情。 - Maher Abuthraa

0
从您发布的xml代码中,您确定在布局xml中添加了xmlns:card_view="http://schemas.android.com/apk/res-auto",并在添加依赖项后请重新同步项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接