Поскольку usedInTest
не используется приложением, R8 удалит его, а при запуске теста произойдет сбой с MethodNotFouldError
. Поэтому вам нужно правило хранения, чтобы убедиться, что usedInTest
все еще находится в приложении при тестировании. Хороший способ сделать это - добавить аннотацию, например KeepForTesting
, и добавить в приложение то, что нужно тестам. А затем добавьте это правило хранения:
-keep,allowobfuscation class * {
@KeepForTesting *;
}
Обратите внимание на модификатор allowobfuscation
. Это позволяет этим методам для тестирования переименовываться в более короткие имена. Когда Android Studio создает тесты, она автоматически добавляет параметр -applymapping
с файлом сопоставления, созданным при сборке приложения. Таким образом, ссылка на usedInTest
в тестах будет переименована в фактический метод в приложении после запуска R8.
Для самого R8 мы автоматизировали это, анализируя тесты R8, чтобы найти, какие части R8, которые не находятся в общедоступном API, используются в тестах. Из этого мы синтезируем правила хранения, чтобы сохранить это. Затем мы можем запустить R8 на R8, а затем запустить все тесты для этой версии R8 - которая также является версией, которую мы в конечном итоге поставляем.