Все это началось с этой ошибки при запуске контрольно-измерительных приборов:
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?
Кроме того, я вижу «отсутствующий» метод в first dex.
Почему он указан как «справочный», а не «определенный» метод? Это не так, как есть класс OkHttp Util
, предоставляемый платформой.
В начальном падении он сказал, что не может найти метод в classes2.dex
. Почему это выглядит в classes2.dex? Почему бы не посмотреть в обоих?
Я сохраняю все в моем тестовом apk (используя proguard, но сохраняю все) (возможно, это объясняет методы + 65k ref). Так почему же в первую очередь это происходит?
UPDATE:
Оказывается, этот метод был необходим в моем приложении .apk (не тестовый .apk). Когда я обновил свои правила proguard для приложения apk, все заработало. Я до сих пор не знаю, зачем этот класс нужен в приложении?