1

使用:Android Studio 3.2.1 - Gradle 4.6

我有一个包含 3 个模块的应用程序: :app :lib1 (library) :lib2 (library) :app 依赖于 lib1 和 lib2 :lib 1 依赖于 lib2 lib2 是一个仅包含资源的模块(用于图像、字符串、颜色和:app 和 :lib1 引用的一般值,而不是 java 代码

我想给 :app 模块和 :lib2 模块添加相同的口味(为我的客户定制应用程序,为每个应用程序指定不同的包)。:lib1 没有味道

在添加口味之前,一切正常。我向 :app 模块和名为“client1”的 :lib2 模块添加了 1 种风味。我在 :lib2\src\client1 中添加了一个“client1”文件夹:lib2。

Gradle 编译为: :app-client1Debug :app-client1Release :lib1-Debug :lib1-Release :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 //Has no flavor :lib2-client1Debug

并且 gradle 同步过程以异常结束: :app:processClient1DebugResources FAILED FAILURE: Build failed with an exception。• 出了什么问题:任务':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)。</p>

以及链接其他资源的其他类似错误:lib1 应该从 :lib2 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 FAILURE:构建失败并出现异常。• 出了什么问题:任务':lib1:compileDebugJavaWithJavac'执行失败。编译失败;有关详细信息,请参阅编译器错误输出。<br> • 尝试:使用--stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。运行 --scan 以获得完整的见解。* 获取更多帮助 https://help.gradle.org


如果我在 :app-client2Debug :lib1-Debug //Has no flavor :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 多风味库 - AAPT:未找到资源 和其他...虽然我是对的...但是....不起作用

//更新如果我从 :lib2 gradle 文件中删除了风味,并从 :app 和 :lib1 中删除了它的依赖风味配置,但保留了具有两种风味的 :app 模块,则应用程序运行并为 boh 变体安装,并且为此我安装了正确的 versionNameSuffix认为我在 :lib1 的配置中遗漏了一些东西,使其能够从 :lib2 的正确风格中读取资源。

有人可以帮忙吗?谢谢

4

1 回答 1

0

你的要求,不可行。像往常一样,该库不使用其他库的内部资源,而是使用库 API,并且通过包名称访问资源,如果您的缺陷发生更改,请记住更改来自其他库的每个引用。不要在其他参考文献上使用缺陷路径。

于 2019-01-22T08:08:16.257 回答