Уменьшите размер APK при включении файлов .so

Я использую сторонний API для библиотеки камер, который использует регистратор кадров ffmpeg и файлы .so вместе с javacv.

Я также использую стороннюю библиотеку для извлечения метаданных из видео, в котором также есть некоторые файлы .so.

Когда я объединил все эти файлы только в одну папку, мое приложение не работало. Поэтому мне приходится копировать все эти файлы во все остальные папки armeabi-v7a, mips, x86. Что прекрасно работает, но очевидно, что размер apk теперь слишком велик.

Общий размер этих файлов составляет 20 МБ на папку. Это составляет 80 МБ для всей папки. Мой размер .apk составляет 41 МБ. Пожалуйста, предложите мне, что я могу сделать, чтобы удалить дубликаты файлов/папок или уменьшить размер .apk.

Зачем мне все эти папки armeabi, armeabi-v7a, mips, x86 введите здесь описание изображения

Файлы .so в папке введите здесь описание изображения


person Arslan Anwar    schedule 12.09.2014    source источник
comment
Я также сталкиваюсь с теми же проблемами размера, вы уменьшили размер apk. Я также работаю над записью видео, мне нужна помощь в уменьшении размера.   -  person Amjad Khan    schedule 31.10.2017


Ответы (2)


Если вы хотите поддерживать несколько архитектур, вам понадобятся эти несколько папок. Однако есть способ уменьшить размер APK, развернув несколько APKS, т. е. отдельные APK для каждого типа ЦП.

См. эти ссылки:

https://software.intel.com/en-us/android/articles/google-play-supports-cpu-architecture-filtering-for-multiple-apk

http://developer.android.com/google/play/publishing/multiple-apks.html

person alpinescrambler    schedule 12.09.2014

Я думаю, что ответ alpinescrambler, вероятно, наиболее применим, но вот некоторые вещи, которые вы можете сделать, даже если вы последуете его предложению о нескольких APK.

Во-первых, вы можете опустить armeabi-v7a, так как его можно удовлетворить armeabi.

Во-вторых, создайте общий объект и общий объект ffmpeg с помощью -Os.

В-третьих, создайте общий объект и общий объект ffmpeg с помощью -ffunction-sections. Позже неиспользуемые функции можно удалить. На самом деле, вот типичная строка компиляции для armeabi (для одного из моих проектов):

arm-linux-androideabi-g++ -MMD -MP -MF …/MyProj/obj/local/armeabi/objs/prng/libprng.o.d -fpic 
-ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te 
-mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer 
-fno-strict-aliasing -finline-limit=64 -I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport 
-I/opt/android-ndk-r9/sources/cxx-stl/system/include -I/usr/local/cryptopp/android-armeabi/include 
-I…/MyProj/jni -DANDROID  -Wa,--noexecstack -frtti -fexceptions -I/opt/android-ndk-r9/platforms
/android-14/arch-arm/usr/include -c  …/MyProj/jni/libprng.cpp 
-o …/MyProj/obj/local/armeabi/objs/prng/libprng.o 

В-четвертых, создайте свой общий объект и общий объект ffmpeg с помощью 16-битных инструкций thumb с -mthumb (а не 32-битных инструкций arm с -marm).

В-пятых, используйте __attribute__ ((visibility ("hidden"))) в вашем общем объекте и общем объекте ffmpeg. Это позволит сохранить таблицы экспорта небольшими. Это также приведет к более быстрому времени загрузки.

В-шестых, создайте общий объект и общий объект ffmpeg с помощью -Wl,--exclude-libs,ALL, чтобы исключить повторный экспорт других библиотечных функций.

В-седьмых, запустите arm-linux-androideabi-strip --strip-unneeded для вашего общего объекта и общего объекта ffmpeg. Это возможно, потому что вы скомпилировали с -ffunction-sections.

В-восьмых, запустите arm-linux-androideabi-strip --strip-all для вашего общего объекта и общего объекта ffmpeg.


Кроме того, вам вообще нужен MIPS? Не могу найти планшет. Мои попытки найти его были встречены "закрыто, не по теме".

person jww    schedule 13.09.2014