Намалете размера на APK, когато включвате .so файлове

Използвам API на трета страна за библиотека с камери, която използва ffmpeg frame recorder и .so файлове заедно с javacv.

Също така използвам библиотека на трета страна за извличане на метаданни от видеоклип, който също има някои .so файлове

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

Общият размер на тези файлове е 20MB на папка. Това прави 80MB за цялата папка. Размерът на моя .apk е 41 MB. Моля, предложете ми какво мога да направя, за да премахна дублиращите се файлове/папки или да намаля размера на .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 за всеки тип CPU.

Вижте тези връзки:

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-битови инструкции за палец с -mthumb (а не 32-битови инструкции за ръка с -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