库是否可以依赖并从另一个多样式库中读取资源?

时间:2019-01-18 15:47:34

标签: android libraries android-productflavors android-build-flavors android-flavors

使用:Android Studio 3.2.1-Gradle 4.6

我有一个包含3个模块的应用程序::app:lib1(库):lib2(库) :app取决于lib1和lib2:lib 1取决于lib2 lib2是一个模块,仅包含从:app和:lib1

引用的资源(通常是图像,字符串,颜色和值的res文件夹,而不是Java代码)

我想用相同的样式来修饰:app模块和:lib2模块(用于为我的客户定制应用程序,为每个应用程序指定不同的包)。 :lib1没有味道

在添加调味剂之前,所有方法均适用。 我在:app模块和:lib2模块中添加了1种口味,称为“ client1”。 我在:lib2 \ src \ client1中添加了一个“ client1”文件夹到:lib2。

Gradle编译为以下内容创建了相关的构建变体: :app-client1Debug :app-client1发布 :lib1-Debug :lib1-发布 :lib2-client1Debug :lib2-client1Release

我运行调试构建版本,并且正确安装了应用程序,并成功地从:lib2模块的client1风格中获取了正确的资源

现在,我在:app和:lib2模块中添加了第二个风味,即“ client2”,并在“:lib2 \ src \ client2”中添加了一个文件夹,用于第二个客户定制的风味资源。 我在:app和:lib1的gradle文件中为库模块:lib2

添加了productFlavors和配置以及相对依赖项
    APP MODULE GRADLE FILE
    apply plugin: 'com.android.application'
    android {
    defaultConfig {
         applicationId "it.test.myapp" 
     .
     .

    }
    buildTypes {
        release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-rules.pro'
        }
    }

    flavorDimensions "default"
    productFlavors {
        client1 {
            dimension="default"
            versionNameSuffix "-client1"
            applicationIdSuffix ".client1"
        }
        client2 {
            dimension="default"
            versionNameSuffix "-client2"
            applicationIdSuffix ".client2"
        }
    }
    }
    configurations { 
        client1DefaultDebugCompile 
        client1DefaultReleaseCompile 
        client2DefaultDebugCompile 
        client2DefaultReleaseCompile 
   }

   dependencies { 
    // implementation project(':lib2') //before flavors
    implementation project(':lib1')

    client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
    client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')

    client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2Debug')
    client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')


    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation ....
    . . .
    }


:lib1 MODULE GRADLE FILE

    apply plugin: 'com.android.library'
    android { 

       ....some configuration
    defaultConfig {
       ...some configuration

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 
           'proguard-rules.pro'
        }
    }
    }
    configurations { 
         client1DefaultDebugCompile 
         client1DefaultReleaseCompile 
         client2DefaultDebugCompile 
         client2DefaultReleaseCompile 
    }
    dependencies { 
         //implementation project(':lib2') //before flavors
         client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
         client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')

         client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2tDebug')
         client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')


    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation ...
     ....some implementation
    }


:lib2 MODULE GRADLE FILE

apply plugin: 'com.android.library'
android {

publishNonDefault true

...some config



defaultConfig {
   ...some config

}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
        'proguard-rules.pro'
    }
}

flavorDimensions "default"
productFlavors {
    client1 {
        dimension="default"
    }
    client2 {
        dimension="default"
    }
}
}

dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])
...some implementation
}

我希望:app和:lib1模块都采用正确的版本的:lib2模块资源。 我将gradle与构建变体同步: :app-client1Debug :lib1-Debug //没有味道 :lib2-client1Debug

和gradle同步过程以一个异常结束: :app:processClient1DebugResources失败 失败:构建失败,发生异常。     •出了什么问题:任务':app:processClient1DebugResources'的执行失败。Android资源链接失败输出:/Users/davide/Documents/......./android/MyApp/app/build/intermediates/incremental/mergeClient1DebugResources /merged.dir/values/values.xml:2601:错误:找不到资源颜色/ colorPrimary(又名it.test.myapp.client1:color / colorPrimary)。

和其他类似的错误,链接到:lib1应该从client1风格获取的其他资源。

似乎:lib1软件包无法读取这些资源 如果我尝试从菜单“ Build-> Rebuild Project”进行重建,则会收到类似的错误:

:lib1:javaPreCompileDebug /Users/davide/Documents/...../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:183:错误:找不到符号textView.setTextColor(MyApplication.getInstance()。getResources()。getColor(R.color.colorPrimaryDark)); ^符号:变量colorPrimaryDark位置:类颜色     ....     ..... /Users/davide/Documents/......../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:228:错误:找不到符号字符串channelId = context.getString(R.string.default_notification_channel_id); ^符号:变量default_notification_channel_id位置:类字符串     。     。 ....其他类似的错误     。     。     。     注意:某些输入文件使用或覆盖不推荐使用的API。     注意:有关详细信息,请使用-Xlint:deprecation重新编译。 50个错误:lib1:compileDebugJavaWithJavac FAILED     失败:构建失败,发生异常。         •出了什么问题:任务':lib1:compileDebugJavaWithJavac'的执行失败。有关详细信息,请参见编译器错误输出。
        •尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。与--scan一起运行以获取完整的见解。     *在https://help.gradle.org

获得更多帮助

如果我选择以下版本的构建变体 :app-client2Debug :lib1-Debug //没有味道 :lib2-client2Debug

我对client2风味有相同的错误,:lib1无法读取这些资源。 现在有人告诉我正确的解决方案?一个库可以具有依赖项并从另一个FLAVORED库中读取资源吗? 我读了这个https://android.jlelse.eu/product-flavors-for-android-library-d3b2d240fca2 而这个https://proandroiddev.com/advanced-android-flavors-part-1-building-white-label-apps-on-android-ade16af23bcf 而这个Android multi flavor library referenced from non flavor application - AAPT: No resource found 和其他人...虽然我是对的...但是....不起作用

//更新 如果我从:lib2 gradle文件中删除了风味,并且从:app和:lib1中删除了它的依赖项风味配置,但同时维护了具有这两种风味的:app模块,则该应用会运行并已安装了boh变体和正确的versionNameSuffix,我认为我是我丢失了:lib1的配置中的某些内容,以使其能够从:lib2的正确样式读取资源。

有人可以帮忙吗?谢谢

1 个答案:

答案 0 :(得分:0)

您的请求,不可行。像往常一样,该库不使用其他库的内部资源,而是使用库API,并且可以通过程序包名称访问资源,如果您的缺陷更改了,请记住更改其他库中的每个引用。请勿在其他参考文献上使用瑕疵路径。