Класс больше не запутывается после обновления до плагина Android Gradle 3.4.0 - PullRequest
2 голосов
/ 08 мая 2019

После обновления до плагина Android Gradle 3.4.0 базовый класс больше не запутывается.

Следующие основные шаги могут воспроизвести проблему:

  1. В Android Studio создайтеновый пустой проект
  2. В app/build.gradle изменить minifyEnabled на true
  3. Создать следующий класс, ProguardTestClass.java:

    public class ProguardTestClass {
    
        public interface ProguardTestInnerInterface {
            void proguardTestCallback(String message);
        }
    
        public static void proguardTestMethod(String input, ProguardTestInnerInterface impl) {
            impl.proguardTestCallback("proguardTestMethod received input=[" + input + "]");
        }
    }
    
  4. Обратитесь к классу от MainActivity.java:

        public class MainActivity extends AppCompatActivity {
            private static final String TAG = "MainActivity";
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                ProguardTestClass.proguardTestMethod("MainActivity's ProguardTestClass", new ProguardTestClass.ProguardTestInnerInterface() {
                    @Override
                    public void proguardTestCallback(String message) {
                        Log.d(TAG, "Proguard test: " + message);
                    }
                });
            }
        }
    
  5. Убедитесь, что он использует плагин Android Gradle 3.4.0 в build.gradle

  6. Подтвердите, что он использует gradle-5.1.1 в gradle/wrapper/gradle-wrapper.properties
  7. Откройте окно терминала на вкладке Терминал
  8. Выполнить ./gradlew clean build
  9. Выполнить find . -name mapping.txt | xargs grep "ProguardTestClass -> "

Ожидаемый вывод:

com.example.proguardgradleplugin340.ProguardTestClass -> com.example.proguardgradleplugin340.a:

Фактический вывод:

app/build/outputs/mapping/release/mapping.txt не упоминает никакого переименования ProguardTestClass.

Чтобы увидеть, что предыдущие версии плагинов Android Gradle могли давать ожидаемый результат, повторите описанные выше шаги, но укажите предыдущие версии плагинов Android Gradle и Gradle:

Изменить на плагин Android Gradle 3.3.2 в build.gradle Изменить на gradle-4.10.1 в gradle/wrapper/gradle-wrapper.properties

Я пытался исследовать, изучая другие диагностические файлы, которые мы использовали для получения от Proguard , но они больше не выводятся (по крайней мере, по умолчанию):

find . -name seeds.txt find . -name usage.txt

Я также проверилплагин Android Gradle 3.4.0 заметил, что он заменил Proguard на новую технологию, которая "объединяет десагеринг, сжатие, запутывание, оптимизацию и дексинг всего за один шаг" .

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Попробуйте установить useProguard false, чтобы плагин использовал R8 вместо ProGuard для сокращения и запутывания кода и ресурсов вашего приложения. Например.

android {
    ...
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
        }
        release {
            minifyEnabled true
            useProguard false 
        }
    }
}

Или же, если вы хотите придерживаться ProGuard, вы должны отключить R8 с gradle.properties, как показано ниже:

# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false

И не забудьте установить useProguard true.


Редактировать # 1

Проверьте здесь, как перенести Proguard на R8: Android / java: переход / миграция с ProGuard на R8?

0 голосов
/ 08 мая 2019

Решение от @shizhen - это то, что я принял как решение проблемы.Но я хотел задокументировать альтернативу на случай, если кто-нибудь еще столкнется с этой проблемой.

Я смог заставить R8 запутать класс, фактически создав его экземпляр.Обратите внимание, что мой исходный код для ProguardTestClass не содержал конструктора, и я использовал его довольно статично.Но когда я добавил конструктор и создал его из MainActivity.java, это дало R8 повод для его запутывания, я думаю.

Пересмотрено ProguardTestClass, в результате которого R8 выполнил запутывание:

public class ProguardTestClass {

    //
    // NEW CODE: BEGIN
    //
    private int avar;

    public ProguardTestClass(int avar) {
        this.avar = avar;
    }

    public int incrementValue() {
        return ++avar;
    }
    //
    // NEW CODE: END
    //

    public interface ProguardTestInnerInterface {
        void proguardTestCallback(String message);
    }

    public static void proguardTestMethod(String input, ProguardTestInnerInterface impl) {
        impl.proguardTestCallback("proguardTestMethod received input=[" + input + "]");
    }
}

Затем в MainActivity.java я создал экземпляр и назвал ProguardTestClass на onCreate():

    proguardTestClass = new ProguardTestClass(3);
    Log.d(TAG, "Proguard test: " + proguardTestClass.incrementValue());
...