Является ли Android Gradle Plugin тестовый apk builder автоматически мультидексировать мой тестовый apk? Если это так, почему это генерирует "NoSuchMethodError" - PullRequest
0 голосов
/ 09 ноября 2018

Все это началось с этой ошибки при запуске контрольно-измерительных приборов:

java.lang.NoSuchMethodError: No static method closeQuietly(Ljava/net/ServerSocket;)V in class Lokhttp3/internal/Util; or its super classes (declaration of 'okhttp3.internal.Util' appears in /data/app/com.example-vKdPJoTLl49ntRbZfsRBqQ==/base.apk!classes2.dex)
at okhttp3.mockwebserver.MockWebServer$2.execute(MockWebServer.java:333)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

Я посмотрел в сгенерированный test.apk, чтобы увидеть, что присутствует / отсутствует в файлах dex.

Первое, что я заметил, это то, что на тестовом apk есть два .dex файла. Зачем? Я не использую multidex (и multidex IIRC не работает на тестовых апках в любом случае). Затем я добавил два «числа методов, на которые ссылаются», и, конечно же, я превысил предел в 65 КБ. Так AGP auto-multi-dexing мой тестовый apk?

classes.dex classes2.dex

Кроме того, я вижу «отсутствующий» метод в first dex.

Почему он указан как «справочный», а не «определенный» метод? Это не так, как есть класс OkHttp Util, предоставляемый платформой.

В начальном падении он сказал, что не может найти метод в classes2.dex. Почему это выглядит в classes2.dex? Почему бы не посмотреть в обоих?

Я сохраняю все в моем тестовом apk (используя proguard, но сохраняю все) (возможно, это объясняет методы + 65k ref). Так почему же в первую очередь это происходит?

UPDATE:

Оказывается, этот метод был необходим в моем приложении .apk (не тестовый .apk). Когда я обновил свои правила proguard для приложения apk, все заработало. Я до сих пор не знаю, зачем этот класс нужен в приложении?

1 Ответ

0 голосов
/ 10 ноября 2018

java.lang.NoSuchMethodError

Нет статического метода closeQuietly(java.net.ServerSocket) в классе okhttp3.internal.Util;

метод closeQuietly(java.net.ServerSocket) может не использоваться.

чтобы явно сохранить его:

-keep class okhttp3.internal.Util {
    public static void closeQuietly(java.net.ServerSocket);
}
...