Является ли R8 / Android Gradle Plugin достаточно умным, чтобы хранить библиотечные классы / методы, необходимые только в тестовом APK? - PullRequest
0 голосов
/ 25 октября 2019

Допустим, у меня есть приложение, которое зависит от библиотеки. Эта библиотека имеет два метода:

  • void usedInApp()
  • void usedInTest()

В приложении я вызываю usedInApp(). У меня также есть инструментальный тест, который вызывает usedInTest(). Если я запускаю инструментальные тесты ./gradlew app:connectedDebugAndroidTest Достаточно ли уместен R8 / AGP, чтобы знать, чтобы сохранить usedInTest() или он будет удален?

1 Ответ

0 голосов
/ 26 октября 2019

Поскольку usedInTest не используется приложением, R8 удалит его, а при запуске теста произойдет сбой с MethodNotFouldError. Поэтому вам нужно правило хранения, чтобы убедиться, что usedInTest все еще находится в приложении при тестировании. Хороший способ сделать это - добавить аннотацию, например KeepForTesting, и добавить в приложение то, что нужно тестам. А затем добавьте это правило хранения:

-keep,allowobfuscation class * {
  @KeepForTesting *;
}

Обратите внимание на модификатор allowobfuscation. Это позволяет этим методам для тестирования переименовываться в более короткие имена. Когда Android Studio создает тесты, она автоматически добавляет параметр -applymapping с файлом сопоставления, созданным при сборке приложения. Таким образом, ссылка на usedInTest в тестах будет переименована в фактический метод в приложении после запуска R8.

Для самого R8 мы автоматизировали это, анализируя тесты R8, чтобы найти, какие части R8, которые не находятся в общедоступном API, используются в тестах. Из этого мы синтезируем правила хранения, чтобы сохранить это. Затем мы можем запустить R8 на R8, а затем запустить все тесты для этой версии R8 - которая также является версией, которую мы в конечном итоге поставляем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...