Я хочу создать 2 версии Fragment
для разных вариантов сборки, например, весь код будет отличаться во вкусе 1 от варианта 2. Я хочу решить эту проблему, не выполняя if-else на основе параметра BuildConfig.FLAVOR
в коде. Это означает, что если у меня есть MapFragment
, я хочу иметь точно такой же класс с именем MapFragment
с другим кодом, когда создается другой вариант. Причина, по которой я хочу это сделать, заключается в том, что я не хочу иметь никаких ссылок на этот MapFragment
из другой версии (вкус в каких-либо журналах или особенностях моего приложения. Это должно работать так же, как работает локализация string.xml
или dimens.xml
. Есть ли какие-либо способ как этого добиться?
Причина в том, что я использую карту Huawei и службы ag-connect
, а также карту Google Play. Проблема в том, что Huawei использует некоторую фоновую службу определения местоположения, которая затем отклоняет мое приложение в Google Play. Этот вариант Huawei никогда не должен быть доступен в Google Play, это как отдельная копия приложения для Huawei Shop.
Это означает, что если я создам .apk
из Google Play (вариант 1), я не буду включать в него какие-либо службы или классы ag-connect, а также ссылки / импорт из Huawei и наоборот.
ОБНОВИТЬ:
Когда я проверил комментарий ниже, я попытался создать sourceSets и повторно реализовать свои вкусы для этих новых наборов. Но он по-прежнему не компилируется.
Также мне нужно знать, как сочетать эти вкусы с типами и источниками. Потому что у меня 2 основных источника: google и huawei. Затем мне нужно 4 разновидности для каждого из этих источников, таких как googleProd, googleProdTest, googleDev, googleDevTest и то же самое для huawei, а также все они должны иметь отладку / выпуск типа сборки на случай, если я захочу выпустить их в магазин Google Play для тестирования. Проблема в том, что мне нужно что-то вроде субпродуктов. Каждая разновидность huawei (prod, test, dev, dev-test) будет использовать huawei sourceSet (main + huawei), а каждая разновидность google (prod, test, dev, dev-test) будет использовать google sourceSet (main + google). Это означает, что основными источниками будет код, общий для обоих, а источники google / huawei имеют разные версии одного и того же фрагмента.
Итак, это должны быть окончательные варианты сборки:
- googleProd (основной + google src)
- googleTest (основной + google src)
- googleDev (основной + google src)
- googleDevTest (основной + google src)
- huaweiProd (основной + huawei src)
- huaweiTest (основной + huawei src)
- huaweiDev (основной + huawei src)
- huaweiDevTest (основной + huawei src)
и тип сборки выпуска / отладки для всех 8. Итого 16 вариантов.
Это означает, что мне нужно знать, как объединить google
src с вкусами prod
, test
, dev
и dev-test
и huawei
src с вкусами huaweiProd
, huaweiTest
, huaweiDev
и huaweiDev-test
, поэтому мне не нужно иметь 4 идентичных фрагмента huawei и 4 фрагмента Google, которые являются идентичен для всех вкусов. Он должен работать как абстрактный класс / родительский класс.
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]
Код Gradle:
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'
}