我正在使用第三方API,用于使用ffmpeg帧记录器和.so文件以及javacv的相机库。
我也在使用第三方库从视频中提取元数据,该视频也有一些.so文件
当我将所有这些文件合并到一个文件夹“armeabi”时,我的应用程序无效。 所以我必须将所有这些文件复制到所有其他文件夹“armeabi-v7a,mips,x86”。哪个工作得很好,但很明显apk的大小现在太大了。
这些文件的总大小为每个文件夹20MB。这使得所有文件夹都有80MB。我的.apk大小是41MB。请建议我可以做些什么来删除重复的文件/文件夹或减少.apk大小。
为什么我需要所有这些文件夹armeabi,armeabi-v7a,mips,x86
.so文件夹
答案 0 :(得分:3)
如果要支持多种体系结构,则需要这些多个文件夹。但是,有一种方法可以通过部署多个APK来减少您的APK大小,即每种CPU类型的特定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"。