包含.so文件时缩小APK的大小

时间:2014-09-12 06:29:33

标签: android android-ndk ffmpeg proguard javacv

我正在使用第三方API,用于使用ffmpeg帧记录器和.so文件以及javacv的相机库。

我也在使用第三方库从视频中提取元数据,该视频也有一些.so文件

当我将所有这些文件合并到一个文件夹“armeabi”时,我的应用程序无效。 所以我必须将所有这些文件复制到所有其他文件夹“armeabi-v7a,mips,x86”。哪个工作得很好,但很明显apk的大小现在太大了。

这些文件的总大小为每个文件夹20MB。这使得所有文件夹都有80MB。我的.apk大小是41MB。请建议我可以做些什么来删除重复的文件/文件夹或减少.apk大小。

为什么我需要所有这些文件夹armeabi,armeabi-v7a,mips,x86 enter image description here

.so文件夹 enter image description here

2 个答案:

答案 0 :(得分:3)

如果要支持多种体系结构,则需要这些多个文件夹。但是,有一种方法可以通过部署多个APK来减少您的APK大小,即每种CPU类型的特定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

答案 1 :(得分:2)

我认为alpinescrambler的回答可能是最适用的,但是即使您遵循他对多个APK的建议,也可以做一些事情。

首先,您可以省略armeabi-v7a,因为armeabi可以满足。

其次,使用-Os构建共享对象和ffmpeg共享对象。

第三,使用-ffunction-sections构建共享对象和ffmpeg共享对象。之后,可以删除未使用的功能。事实上,这是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 

第四,使用带有-mthumb的16位拇指指令构建共享对象和ffmpeg共享对象(而不是带有-marm的32位臂指令)。

第五,在共享对象和ffmpeg共享对象中使用__attribute__ ((visibility ("hidden")))。它会使导出表变小。它还可以加快加载速度。

第六,使用-Wl,--exclude-libs,ALL构建共享对象和ffmpeg共享对象,以确保不会重新导出其他库函数。

第七,在共享对象和ffmpeg共享对象上运行arm-linux-androideabi-strip --strip-unneeded。这是可能的,因为您使用-ffunction-sections进行了编译。

Eigth,在共享对象和ffmpeg共享对象上运行arm-linux-androideabi-strip --strip-all


另外,你甚至需要MIPS吗?我找不到平板电脑了。我尝试找到一个已尝试"closed, off topic"