После значительной потери доходов потребовалось некоторое время, чтобы выяснить, что Сокращение кода Android R8 препятствует работе Amazon In-App Purchasing (IAP) 2.0. Android Studio теперь использует R8 по умолчанию. К счастью, следующее в gradle.properties, похоже, может остановить R8:
android.enableR8=false
Я боюсь, что в будущем R8 станет обязательным, и это будет катастрофа. Я пытаюсь найти способ сделать их совместимыми. Кто-то разместил аналогичный вопрос на форуме амазона, который должен быть лучшим местом для таких вопросов, но у меня такое чувство, что Amazon прекратил поддержку форума, потому что мои последние два вопроса не получили ответа от Amazon.
У меня есть следующее в proguard-project.txt, которое используется R8
#amazon
-dontwarn com.amazon.**
-keep class com.amazon.** {*;}
-keepattributes *Annotation*
-optimizations !code/allocation/variable
-optimizationpasses 1
Насколько я понимаю, R8 игнорирует проходы оптимизации. Подозреваю, что причина в этом.
Изменить (2019-05-30) Вышеупомянутый скрипт для proguard-project.txt взят из Документ Amazon для покупок в приложении. Приложение build.gradle имеет следующее:
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.Release
}
@PeterTefft Большое спасибо за помощь. Чтобы облегчить чтение, я ответил на ваши вопросы, отредактировав пост.
Поскольку это разница между Proguard и R8, не могли бы вы сообщить об ошибке в issuetracker.google.com/issues?q=componentid:326788? Правила, предложенные Anazom, очень консервативны, и R8 не должен сильно влиять на код в пакете com.amazon
, но, видимо, что-то пошло не так. Есть ли в журналах признаки того, что что-то пошло не так в библиотеке Amazon при использовании R8? Тот факт, что R8 игнорирует -optimizations !code/allocation/variable
и -optimizationpasses 1
, здесь не имеет значения.
@sgjesse Мне интересно, содержит ли мой пост на форуме Amazon с записями logcat какую-либо полезную информацию: forums.developer.amazon.com/questions/207075/…
proguard-android.txt
использует -dontoptimize
, поэтому он вообще не должен оптимизироваться с ProGuard или R8, независимо от указанного количества -optimizationpasses
. Если вам интересно, вы можете увидеть доступные файлы ProGuard по умолчанию в разделе build/intermediates/proguard-files/
. proguard-android-optimize.txt
— тот, который позволит оптимизировать.
На данный момент, учитывая, что оптимизация R8, похоже, не включена, я не уверен, что есть какой-то обходной путь. Я бы порекомендовал вам сообщить о проблеме в Трекер проблем Google, предоставив как можно больше подробностей, чтобы помочь им воспроизвести проблему. Как правило, они довольно быстро реагируют на такие вопросы.
Спасибо за объяснение. Я нашел три файла: файлы: proguard-android.txt-3.4.1, proguard-android-optimize.txt-3.4.1, proguard-defaults.txt-3.4.1. Файл android.txt-3.4.1 имеет -dontoptimize. Не уверен, что означает следующее в официальном документе R8: «R8 не позволяет вам отключать или включать дискретные оптимизации или изменять поведение оптимизации. Фактически, R8 игнорирует любые правила ProGuard, которые пытаются изменить оптимизации по умолчанию, такие как -оптимизации и -оптимизация проходит."
ProGuard выполняет множество различных оптимизаций и позволяет отключать отдельные оптимизации. Например, это правило -optimizations !code/allocation/variable
отключает оптимизацию code/allocation/variable
, которая «оптимизирует размещение переменных в кадре локальной переменной», согласно Руководство по ProGuard. R8 не позволяет выбирать такие оптимизации. Вы либо включаете их все, либо все отключаете, возможно, потому, что он не выполняет точно такую же оптимизацию, как ProGuard.
Понимаю. Я думаю, что в официальном документе нет ясности по этому поводу. У меня сложилось впечатление, что какая-то оптимизация была включена, и ее нельзя было отключить. Насколько я понимаю ваше объяснение, я вообще не использовал оптимизацию R8, потому что использовал android.txt-3.4.1. Я подожду немного, чтобы узнать, могут ли сотрудники службы технической поддержки Amazon помочь здесь. Я уже связался с ними.
@Hong, они действительно исправили это с тех пор?
@Emil Эмиль, я думаю, что да, но я избегал R8, поэтому не проверял его.
build.gradle
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
proguard-rules.pro
-dontwarn com.amazon.**
-keep class com.amazon.** {*;}
-keepattributes *Annotation*
-dontoptimize
gradle.properties
# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false
Это работает для меня.
Не могли бы вы присоединиться к обсуждению этого вопроса здесь: issuetracker.google.com/issues/134766810
Вы отключили R8. Мы пытаемся выяснить, как использовать R8 с Amazon In-App Purchasing (IAP) 2.0.
Теперь должно работать с R8, добавьте это в свои основные зависимости build.gradle:
buildscript {
repositories {
maven {
url 'http://storage.googleapis.com/r8-releases/raw'
}
}
dependencies {
classpath 'com.android.tools:r8:1.6.42' //Must be before the Gradle Plugin for Android. - Or any other version
classpath 'com.android.tools.build:gradle:...'
}
}
Привет, Хонг. Я один из сопровождающих Неофициальная документация R8 и мог бы помочь. Какие файлы ProGuard, кроме вашего proguard-project.txt, вы используете в своем скрипте сборки Gradle (например, proguard-android.txt, proguard-android-optimize.txt и т. д.)? Кроме того, Amazon рекомендовал использовать это правило
-optimizations
? Я не нашел его в образце файла, приведенном в их Android SDK, и стоит отметить, что R8 также не поддерживает правила-optimizations
.