#android #android-ndk #shared-libraries #apk
#Android #android-ndk #общие библиотеки #apk
Вопрос:
Для моего JNI требуется 8-10 секунд.итак, libray для упаковки в apk с помощью apkbuilder. Библиотека составляет около 8 МБ и написана в основном на C .
Чтобы прояснить проблему, я провел следующие тесты.
1) Библиотека Other .so
Я заменил библиотеку .so на другую .so, которая составляет около 10 МБ и написана в основном на C. Удивительно, но для new .so требуется 1,5 секунды, что также является библиотекой JNI для той же архитектуры процессора.
2) Фиктивный файл
Я поместил фиктивный файл с именем xxx.so в моем каталоге libs / armabi-v7a. Это занимает 1 секунду.
3) Другая архитектура процессора
Все мои библиотеки .so для arm / x86 / mips занимают 8-10 секунд.
4) Подделанный
Я отредактировал свою библиотеку .so с помощью шестнадцатеричного редактора в случайных местах со случайными значениями. Это также занимает 8-10 секунд.
Почему только моя библиотека .so так долго упаковывается в apk с помощью apkbuilder? Есть ли какой-нибудь способ ускорить этот процесс для моей библиотеки .so?
Ответ №1:
APK-файл по сути представляет собой просто ZIP-файл, и файлы .so добавляются к нему без какой-либо специфичной для APK обработки. Таким образом, наиболее вероятной причиной является то, что apkbuilder пытается выкачать ваш файл .so, что занимает некоторое время, считая другой файл .so несжимаемым и просто сохраняя его.
AFAICS единственный способ ускорить это — изменить исходный код apkbuilder так, чтобы он всегда сохранял, а не выкачивал файлы .so.
Комментарии:
1. Некоторые ресурсы обещают хранить в несжатом виде в APK, но для папки таких договорных обязательств нет
libs
.2. Ганс, есть ли какие-либо опции с флагами «не пытаться сдуть» my .so для apkbuilder?
3. К сожалению, такого флага нет. Вам нужно будет изменить исходный код apkbuilder. Самый последний исходный код здесь: android.googlesource.com/platform/tools/base/ /master/sdklib /…
4. Ганс, я решил проблему с исправлением sdklib, как вы предложили. Время было потрачено zip compressor. Если я изменю уровень zip с 9 на 3 для mOutputJar.setLevel в SignedJarBuilder, это значительно улучшит производительность в целом. Спасибо.
Ответ №2:
Я обнаружил, что ZipOutputStream потратил большую часть времени на сжатие файла .so.
Android ApkBuilder использует уровень сжатия 9, который имеет самое высокое сжатие, но самую низкую производительность. Если я изменю этот уровень на 3, общая производительность значительно улучшится с небольшой потерей степени сжатия.
Вы можете изменить этот уровень, исправив исходный код sdklib. В SignedjarBuilder.java (com.android.sdklib.internal.build), найдите «mOutputJar.setLevel» и измените нужный уровень. Затем создайте sdklib.jar и скопируйте это в свой каталог Android SDK (android_sdk / tools / lib)
Вы можете скачать исходный код здесь: https://android.googlesource.com/platform/tools/base/ /master/sdklib/src/main/java/com/android/sdklib/build/