apkbuilder слишком медленно работает с определенными файлами

#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/