2

我想Fragment为不同的构建变体创建 2 个版本,比如整个代码在风味 1 和风味 2 中会有所不同。我想在不根据BuildConfig.FLAVOR代码中的参数执行 if-else 的情况下解决这个问题。这意味着如果我有,我希望在构建不同风格时使用不同代码MapFragment命名的完全相同的类。MapFragment我想要这样做的原因是我不想MapFragment从其他版本中对此进行任何引用(在我的应用程序上的任何日志或细节中都有任何参考。这应该像string.xml本地化一样工作,或者dimens.xml。有什么办法可以实现这一目标?

原因是我使用的是华为地图和ag-connect服务以及 Google Play 地图。问题是华为正在使用一些后台定位服务,然后拒绝我在 Google Play 上的应用。这种华为风格永远不应该在 Google Play 上提供,它就像华为商店应用程序的独立副本。

这意味着如果我.apk从 Google Play(风格 1)构建,我不会包含任何来自华为风格的 ag-connect 服务或类或引用/导入,反之亦然。

更新:

当我检查下面的评论时,我尝试创建 sourceSets 并将我的风格重新实现到这些新集合中。但它仍然无法编译。

我还需要知道如何将这些口味与类型和来源结合起来。因为我有两个主要来源:谷歌和华为。然后,我需要 4 种风格用于这些来源,如 googleProd、googleProdTest、googleDev、googleDevTest 和华为相同,并且所有这些都应该具有构建类型调试/发布,以防我想将它们发布到 Google Play 商店进行测试。问题是我需要产品子风味之类的东西。每个华为风味(prod、test、dev、dev-test)将使用华为sourceSet(main+huawei),每个google风味(prod、test、dev、dev-test)将使用google sourceSet(main+google)。这意味着主要来源将是两者通用的代码,并且谷歌/华为来源具有相同片段的不同版本。

所以这些应该是最终的 buildVariants:

  1. googleProd (main+google src)
  2. googleTest (main+google src)
  3. googleDev (main+google src)
  4. googleDevTest (main+google src)
  5. huaweiProd (main+huawei src)
  6. huaweiTest (main+huawei src)
  7. huaweiDev (main+huawei src)
  8. huaweiDevTest (main+huawei src)

以及所有 8 个版本的发布/调试构建类型。总共有 16 个变体。

这意味着我需要知道如何将 src 与 , 和 flavor 合并google,并将 src 与,和 flavor合并,prod所以我不需要4 个相同的 huawei Fragment和4 个对所有口味都相同的 google Fragment。它应该像抽象类/父类一样工作。testdevdev-testhuaweihuaweiProdhuaweiTesthuaweiDevhuaweiDev-test

A problem occurred evaluating project ':app'.
No signature of method: build_1t7zaa85nxlbgjo4n3n9fcb4s.android() is applicable for argument types: (build_1t7zaa85nxlbgjo4n3n9fcb4s$_run_closure1) values: [build_1t7zaa85nxlbgjo4n3n9fcb4s$_run_closure1@56b08118]

代码梯度:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
//Google Crashlytics
apply plugin: 'com.google.firebase.crashlytics'
//Google Services
apply plugin: 'com.google.gms.google-services'
//Kotlin
apply plugin: 'kotlin-android-extensions'
android {
    compileSdkVersion 29

    def code = getVersionCodeTimestamp()

    defaultConfig {
        applicationId "----"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode code
        versionName "2.5.5"
        vectorDrawables.useSupportLibrary = true
    }

    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
    packagingOptions {
        exclude 'META-INF/atomicfu.kotlin_module'
    }
    signingConfigs {
        app{
           ...
        }
    }
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsCollectionEnabled:"true"]
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.app
        }
        debug {
            manifestPlaceholders = [crashlyticsCollectionEnabled:"false"]
            signingConfig signingConfigs.app
        }
    }

    sourceSets {
        google {
            java.srcDirs('src/main/java', 'src/google/java')
        }
        huawei {
            java.srcDirs('src/main/java', 'src/hua/java')
        }
    }

    flavorDimensions "production"
    productFlavors {
        google {
            prod {
                dimension "production"
                ...
            }
            test {
                dimension "production"
                ...
            }
            dev {
                ...
            }
            dev_test {
                ...
            }
        }

        huawei {
            prod {
                dimension "production"
                ...
            }
            test {
                dimension "production"
                ...
            }
            dev {
                ...
            }
            dev_test {
                ...
            }
        }
    }
}
dependencies {
    implementation project(':pin')
    //Kotlin SDK
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    //Glide
    implementation 'com.github.bumptech.glide:glide:4.11.0'

    //Kotlin Coroutines
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'

    //AndroidX
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
    implementation 'androidx.palette:palette-ktx:1.0.0'

    //Google SDK
    implementation 'com.google.android.material:material:1.3.0-alpha03'
    implementation 'com.google.android.gms:play-services-location:17.1.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.maps.android:android-maps-utils:2.0.3'
    implementation 'com.google.zxing:core:3.4.0'

    //Google Crashlytics SDK
    implementation ('com.google.firebase:firebase-crashlytics:17.2.2') {
        transitive = true
    }
    //Google Analytics SDK
    implementation 'com.google.firebase:firebase-analytics:18.0.0'

    //Google Firebase Messaging
    implementation 'com.google.firebase:firebase-messaging:21.0.0'
    implementation 'com.google.firebase:firebase-core:18.0.0'

    //Huawei SDK
    huaweiImplementation 'com.huawei.hms:identity:4.0.1.300'
    huaweiImplementation 'com.huawei.hms:location:4.0.3.303'
    huaweiImplementation 'com.huawei.hms:maps:4.0.1.301'
}
4

1 回答 1

0

也许你可以将不同的实现类放在不同的目录中,但是包名和父类或接口必须相同,然后在flavor config中重置srcDirs。 https://developer.android.com/studio/build/build-variants#sourcesets

例如:

  1. 创建风味 src 目录
app/src/google/java
app/src/huawei/java

  1. 在 app/build.gradle 中重置 srcDirs
plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            minifyEnabled false
        }

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

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    flavorDimensions("map", 'type')

    productFlavors {
        google {
            dimension "map"
        }

        huawei {
            dimension "map"
            apply plugin: 'com.huawei.agconnect'
        }

        shopDev {
            dimension "type"
        }

        shopProd {
            dimension "type"
        }

        shopTest {
            dimension "type"
        }
    }

    applicationVariants.all { variant ->
        def name = variant.name
        println("Starryi: " + name)
        if (name.contains('huawei')) {
            if (name.contains('ShopDev')) {
                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"HUAWEI_SHOP_DEV\"')

            } else if (name.contains('ShopTest')) {
                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"HUAWEI_SHOP_TEST\"')

            } else if (name.contains('ShopProd')) {

                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"HUAWEI_SHOP_PROD\"')
            }
        } else if (name.contains('google')) {
            if (name.contains('ShopTest')) {
                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"GOOGLE_SHOP_DEV\"')

            } else if (name.contains('ShopDev')) {
                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"GOOGLE_SHOP_TEST\"')

            } else if (name.contains('ShopProd')) {
                variant.buildConfigField("String", "APP_FLAVOR_NAME", '\"GOOGLE_SHOP_PROD\"')
            }
        }
    }

    sourceSets {
        google {
            java.srcDirs('/src/main/java', 'src/google/java')
        }
        huawei {
            java.srcDirs('/src/main/java', 'src/huawei/java')
        }
    }
}

dependencies {
    huaweiImplementation 'com.huawei.hms:identity:4.0.1.300'
    huaweiImplementation 'com.huawei.hms:location:4.0.3.303'
    huaweiImplementation 'com.huawei.hms:maps:4.0.1.301'
}
  1. 在构建变体窗口中选择 在此处输入图像描述

如果你想完全隔离google sdk和huawei sdk,你可以创建两个不同的库模块,一个用于谷歌地图,另一个用于华为地图(两个地图模块必须具有相同的公共接口,通过某种安排),然后编辑app/build .gradle 制作风味取决于适当的模块。 https://developer.android.google.cn/studio/build/dependencies?hl=en#variant_aware https://developer.android.com/studio/build/build-variants#dependencies

于 2021-03-01T10:41:47.043 回答