В чем разница в задачах Gradle между параметрами установки приложения «APK по умолчанию» и «APK из набора приложений»
Я хочу извлечь ресурсы нашего Android-приложения в Android Asset Pack, поскольку мы превышаем ограничение на размер AAB (Android App Bundle) в 150 МБ. Во время тестирования я следовал инструкциям по тестированиюпакета приложений Android и изменил конфигурацию запуска / отладки Android Studio на APK из пакета приложений . После выполнения этого изменения я смог найти активы из Asset Pack во время выполнения при отладке моего приложения.
Однако позже во время выполнения я понял, что метод JDK11 больше не поддерживается, как это было раньше при использовании APK- файла конфигурации запуска / отладки по умолчанию . Вот как его раньше обессахаривали.
C$r8$backportedMethods$utility$Optional$0$isEmpty.isEmpty(someVariable)
После некоторого исследования Google я включил в свой проект, который фактически решил эту проблему с библиотеку Desugaringобратным переносом . Однако, продолжая работать, я понял, что некоторые части нашей библиотеки, которая используется как зависимость в приложении Android, используют следующий метод.
public static ConcurrentHashMap.KeySetView newKeySet()
Согласно этой статье о stackoverflow, это известная проблема, которая приводит к следующему исключению.
Process: com.test.android_application, PID: 20849
java.lang.NoSuchMethodError: No static method newKeySet()Lj$/util/concurrent/ConcurrentHashMap$KeySetView; in class Lj$/util/concurrent/ConcurrentHashMap; or its super classes (declaration of 'j$.util.concurrent.ConcurrentHashMap')
Это мой файл build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.myAndroidApp"
minSdkVersion 21
targetSdkVersion 30
versionName "MyApplication"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
}
}
signingConfigs {
debug {
storeFile file('debug_signing/debug.keystore')
storePassword androidDebugStorePassword
keyAlias 'androiddebugkey'
keyPassword androidDebugKeyPassword
}
release {
Properties releaseSigningProperties = new Properties()
def releasePropsFile = file(releaseApiKeyFile)
if (releasePropsFile.canRead()) {
releaseSigningProperties.load(new FileInputStream(releasePropsFile))
if (releaseSigningProperties != null) {
storeFile file(releaseStoreFile)
storePassword releaseSigningProperties['releaseStorePassword']
keyAlias releaseSigningProperties['releaseKeyAlias']
keyPassword releaseSigningProperties['releaseKeyPassword']
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
multiDexKeepFile file('multidex-config.txt')
signingConfig signingConfigs.release
}
debug{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
multiDexKeepFile file('multidex-config.txt')
signingConfig signingConfigs.debug
}
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation group: 'com.myProject', name: 'internalDependency', version: '1.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.cardview:cardview:1.0.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
testImplementation 'junit:junit:4.13.1'
testImplementation 'org.hamcrest:hamcrest-library:1.3'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:core:1.4.0'
androidTestUtil 'androidx.test:orchestrator:1.4.0'
// Lifecycle components
def archLifecycleVersion = '2.2.0'
implementation "androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion
}
APK- файл конфигурации запуска по умолчанию поддерживает только резервные копии
Optional.isEmpty
метод и сохраняет
public static ConcurrentHashMap.KeySetView newKeySet()
нетронутый (на нем не производилась операция по обессахариванию). Такого же поведения я хочу добиться и для APK из набора приложений .
Я явно мог бы переписать этот фрагмент кода в библиотеке, которая втягивается в приложение Android, но все же возникает вопрос, какая разница в задачах Gradle между параметрами установки приложения APK по умолчанию и APK из пакета приложений .
Я уже нашел эту статью, но она не вдавалась в подробности.
Кроме того, при создании приложения выполняются следующие задачи Gradle:
Default APK : assembleDebug
APK from app bundle : extractApksForDebug