Как заставить Amazon In-App Purchasing (IAP) 2.0 работать с Android R8

После значительной потери доходов потребовалось некоторое время, чтобы выяснить, что Сокращение кода 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

}

Привет, Хонг. Я один из сопровождающих Неофициальная документация R8 и мог бы помочь. Какие файлы ProGuard, кроме вашего proguard-project.txt, вы используете в своем скрипте сборки Gradle (например, proguard-android.txt, proguard-android-optimize.txt и т. д.)? Кроме того, Amazon рекомендовал использовать это правило -optimizations? Я не нашел его в образце файла, приведенном в их Android SDK, и стоит отметить, что R8 также не поддерживает правила -optimizations.

Peter Tefft 30.05.2019 23:20

@PeterTefft Большое спасибо за помощь. Чтобы облегчить чтение, я ответил на ваши вопросы, отредактировав пост.

Hong 31.05.2019 01:01

Поскольку это разница между Proguard и R8, не могли бы вы сообщить об ошибке в issuetracker.google.com/issues?q=componentid:326788? Правила, предложенные Anazom, очень консервативны, и R8 не должен сильно влиять на код в пакете com.amazon, но, видимо, что-то пошло не так. Есть ли в журналах признаки того, что что-то пошло не так в библиотеке Amazon при использовании R8? Тот факт, что R8 игнорирует -optimizations !code/allocation/variable и -optimizationpasses 1, здесь не имеет значения.

sgjesse 06.06.2019 11:01

@sgjesse Мне интересно, содержит ли мой пост на форуме Amazon с записями logcat какую-либо полезную информацию: forums.developer.amazon.com/questions/207075/…

Hong 06.06.2019 17:38
3
4
721
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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, которые пытаются изменить оптимизации по умолчанию, такие как -оптимизации и -оптимизация проходит."

Hong 31.05.2019 15:44

ProGuard выполняет множество различных оптимизаций и позволяет отключать отдельные оптимизации. Например, это правило -optimizations !code/allocation/variable отключает оптимизацию code/allocation/variable, которая «оптимизирует размещение переменных в кадре локальной переменной», согласно Руководство по ProGuard. R8 не позволяет выбирать такие оптимизации. Вы либо включаете их все, либо все отключаете, возможно, потому, что он не выполняет точно такую ​​же оптимизацию, как ProGuard.

Peter Tefft 31.05.2019 15:56

Понимаю. Я думаю, что в официальном документе нет ясности по этому поводу. У меня сложилось впечатление, что какая-то оптимизация была включена, и ее нельзя было отключить. Насколько я понимаю ваше объяснение, я вообще не использовал оптимизацию R8, потому что использовал android.txt-3.4.1. Я подожду немного, чтобы узнать, могут ли сотрудники службы технической поддержки Amazon помочь здесь. Я уже связался с ними.

Hong 31.05.2019 16:26

@Hong, они действительно исправили это с тех пор?

Emil 09.01.2021 16:53

@Emil Эмиль, я думаю, что да, но я избегал R8, поэтому не проверял его.

Hong 09.01.2021 21:41

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

Hong 02.07.2019 18:28

Вы отключили R8. Мы пытаемся выяснить, как использовать R8 с Amazon In-App Purchasing (IAP) 2.0.

Hong 02.07.2019 18:41

Теперь должно работать с 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:...'
     }
}

Другие вопросы по теме