从库模块导入特定风格

Import a specific flavour from a library module

我创建了一个有两种风格的库模块。每种风格都以不同的方式实现 FlavourActivity.java。在我的应用程序中,我要导入我的库模块作为依赖项,但我想指定我要导入的风格

我的问题是我可以在我的应用 gradle 文件中添加依赖项,但我无法访问 FlavourActivity.java。尽管我的应用程序已经导入了库,但我的应用程序无法访问它。


结构

我的结构如下:

app/
├── src/
│   ├── Activity.java

Library/
├── lottieYes/
│   ├── FlavourActivity.java
├── lottieNo/
│   ├── FlavourActivity.java

Android插件版本:3.4.0 Gradle版本:5.1.0


资源

我的应用 gradle 文件如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "com.asousa.testing.moduleflavour"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

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

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    implementation project(path: ':mylibrary', configuration: 'lottieYes')
}

我的图书馆 gradle 文件如下:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    publishNonDefault true

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

    flavorDimensions "lottie"

    productFlavors {
        lottieYes {
            dimension "lottie"
        }

        lottieNo {
            dimension "lottie"
        }
    }

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

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

configurations {
    lottieYes
    lottieNo
}

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    lottieYesImplementation 'com.airbnb.android:lottie:2.5.6'
}


我已经阅读了以下文章:

我还检查了以下 question,但它没有解决我的问题,因为最新的 gradle 版本不起作用。

但其中 none 帮助了我。有人有类似的问题吗?

为了以后的记录,我通过根据功能状态声明 java.srcDirsres.srcDirs 找到了解决我的问题的方法。


我声明一个 gradle 外部 属性 声明该功能是否启用。

project.ext {
  hasLottie = true
}

更多信息blog post


在我的图书馆 gradle 文件中:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    publishNonDefault true

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

    sourceSets {
        main {
            if (hasLottieSupport.toBoolean()) {
                java.srcDirs += 'lottieYes/java'

            } else {
                java.srcDirs += 'lottieNo/java'
                res.srcDirs += 'lottieNo/res'
            }
        }
    }

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

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

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'

    if (hasLottieSupport.toBoolean()) {
        implementation 'com.airbnb.android:lottie:2.5.6'
    }
}

你可以试试这个。

apply plugin: 'com.android.application'

android {
   ......
   flavorDimensions "lottie"

   productFlavors {
     lottieYes {
        dimension "lottie"
     }

     lottieNo {
        dimension "lottie"
     }
   }
}

dependencies {
   ......
   lottieNoimplementation project(path: ':mylibraryX')
   lottieYesimplementation project(path: ':mylibraryY')

}