如何动态加载android的so文件,如何压缩apk大小?
1.工具包介绍(项目地址:/liyu Ming 1978/nativelibcompression)
Android压缩工具集提供了一种极其简单的方法,可以在应用中存储比Android原始Zip更高压缩比的so文件(以后的版本还可以支持动态加载的jar包和游戏资源文件的压缩),同时提供了一种在应用内网络中更新下载压缩文件的方法,使得应用可以在云端存储部分so,减小应用的大小。
压缩原理:压缩工具会利用LZMA算法将所有so压缩到assert目录下,应用在首次启动时会解压到应用的私有目录下。
二、工具集的构成
工具集是一个安装程序,所以建议安装在默认路径。如果安装在program files下,可能会因为win7可能有读写权限的问题导致一些异常。
安装后,您可以看到四个目录,它们都包含源代码。
安装后的四个目录如下
其中ApkLibComrepss是java命令行程序的源代码。在这个目录的bin子目录中,可以找到ApkCompress.jar,它可以用来将普通的apk文件转换成压缩的apk文件。
CompressDemo是一个示例代码,你可以参考这个代码来了解如何集成压缩后的SDK。
DecRawso是一个压缩的SDK。你的开发项目需要参考这个SDK,做一些源代码修改来集成压缩的功能。
RawsoCreator是windows下的转换工具,一般不需要,只在调试和二次开发压缩SDK时使用。
第三,如何整合压缩后的SDK
打开Compression Demo,我们就以这个项目为例来说明如何集成compression SDK。
1.首先需要介绍DecRawso项目。
2.那你需要打电话给DecRawso。NewInstance放在项目的初始位置。在这个演示项目中,这个方法在MainActivity.java的OnCreate中被调用,这个方法创建了一个惟一的解压缩实例。注意:这个方法是异步的,所以可以传入一个消息,说明处理程序接受异步解码。如果同时传入参数showProgress=true,SDK中会生成一个进度对话框来阻塞主进程。不建议使用Decrawso.newinstance (mcontext,null,false)。这样,不接受任何消息,也没有进度对话框。解压缩将在后台自动完成,在应用第一个load so时会被阻塞,直到后台解压缩完成。所以如果阻塞时间过长,可能会导致应用程序无响应。
3.修改load so文件的方法:将所有System.loadlibrary(***)改为?System.load(DecRawso。GetInstance()。GetPath(" * * * ");
对于新版本,这一步可以省略,sdk会修改系统的libaray加载路径。一般情况下,系统升级不会有问题(代码不规范,不太可能随着android升级修改新代码)。如果方便的话,我们还是用系统。加载(declawso。getinstance()。getpath ("* *))。
经过这些简单的步骤,压缩的SDK已经集成到项目中。
第四,如何压缩发布APK
使用ApkCompress.jar压缩和发布APK。该工具是一个命令行工具。这个命令的一般用法是:运行compressapk . jar-a c:/my/test . apk-k c:/key * * # # alias-x86(也可以运行java -jarComPressApk.jar)。
-a后跟apk路径名,可能不是完整路径。
-k后面是签名文件[key storepass别名],密钥可以不是完整的路径名(如果没有写名称,默认为CERT)。
-x86表示x86库文件需要存储在云端,后面是/cloudrawso_x86。
命令执行后,test _ Compressialign。将生成apk。这个apk是压缩的apk。
动词 (verb的缩写)开发模式和压缩模式
为了方便开发,在开发过程中(修改源代码支持压缩后),所以可以解压缩,apk也可以正常运行。压缩包SDK会自动判断是否有压缩包。如果没有压缩包,加载的路径会恢复为android的默认路径。所以最方便的开发就是先集成代码,像以前一样开发(不压缩),发布的时候压缩apk。
不及物动词X86和ARM库的混合调用
在实现和开发过程中,可能会有一些第三方库没有x86版本。通常ISV不会将arm的第三方库放在x86目录下,实际操作中会出现库荒的现象。在库不足的情况下,压缩后的SDK会自动解压x86设备上arm的压缩包,避免库不足的现象。(真正加载的只是缺失的库,不一致的库文件不一定是缺失的库。)
但显然,这样会导致效率低下。如果第三方so和x86的库根本不互相引用(也就是说,这些库都是JNI在java层调用的,而不是在native层调用的),那么可以把arm的第三方库复制到x86目录下,这样就不会缺库了。当然,这种情况会导致arm库的副本冗余,在之前的zip压缩情况下会使压缩包变大,但是在新的LZMA压缩情况下,库的大小根本不会增加,因为LZMA压缩因为字典比较大,可以尽量压缩几个相关的文件。如果文件完全相同,LZMA的压缩将与单个文件基本相同。
如果你满意,请点击右边采纳答案。如有疑问,请点击提问。
希望我的回答对你有帮助,希望采纳!
~ O(∩_∩)O~