使用NativeLibCompression极致压缩APK文件大小
- * 在一个项目长期迭代开发的过程中,随着功能的不断多样化,APK文件的体积也在不断的扩大 *
- * 在公司产品推广的过程中,体积庞大的APK文件会让用户望而生畏 *
- * 因此产品就提出了在不消减APP功能的前提下,最大限度的减少APK文件的大小 *
- * 因为本APP接入很多第三方jar包、so库,这也是造成APK文件过大的原因 *
- * 那我们今天就使用NativeLibCompression 工具压缩so文件*
NativeLibCompression 工具介绍
先上工具包下载地址:https://github.com/liyuming1978/NativeLibCompression
安卓压缩工具集提供了一个极为简洁的方法,能够比安卓原有的Zip提供更高压缩比的存储应用内的so文件 (后期版本还可以支持压缩动态加载的jar包,以及游戏资源文件),同时提供了应用内网络更新下载压缩文件的方法,使得应用可以将部分so存储到云端,减小应用的尺寸。
从github上下载本工具解压后得到以下几个文件
其中 ApkLibComrepss 为java命令行程序的源码
在此目录的bin子目录中,你可以找到ApkCompress.jar ,使用这个文件可以把一个普通的apk文件转换为压缩的apk文件
CompressDemo为一个样例代码
你可以参考这个代码知道如何整合压缩的SDK。
DecRawso是压缩的SDK
你的开发工程需要引用这个SDK,并进行一些源码上的修改,才能整合压缩的功能,
可以用来依赖到自己的项目中
DecRaws_Jar文件夹
是打包好的NativeLibCompression jar包,
如果不用依赖的方式,也可以把本文件夹中的文件添加到自己的项目中
如何整合压缩SDK
* 方法一 、首先把DecRawso项目添加依赖到自己的工程中 *
* 方法二、 也可以使用添加jar包的方式,把本工具接入到自己的工程中 *
把 \NativeLibCompression-master\DecRawso_Jar\libs\ 下的文件全部复制到自己工程对应的文件中
以上两种方式选择一种就可以了 **
代码块
接入成功后,第一部需要在程序的入口调用DecRawso.NewInstance,例如在MyApplication类中调用:
@Override
public void onCreate() {
super.onCreate();
instance = this;
DecRawso.NewInstance(instance,null,false);
DecRawso.GetInstance().waitdecoding();
startFanfa();
}
DecRawso.NewInstance方法是创建了一个解压的唯一实例。
注意:此方法是异步的,所以你可以传入一个handler接受异步解码完成的消息,如果同时传入参数showProgress=true,SDK内会产生一个进度对话框以阻塞主进程。
我在本项目中使用DecRawso.NewInstance(mContext,null,false);的方式,
在service内load library
因为service是在不同的进程空间,需要在service启动时调用DecRawso.NewInstanceInService
一定要确保在尽可能前的地方调用DecRawso.NewInstance,然后调用waitdecoding阻塞应用。确保在load库之前解压完成后,就可以正常调用自己的方法了
接入好后,正常打包正式签名的APK文件,发布市场前进入压缩
* 用cmd命令行进入 \NativeLibCompression-master\ApkLibCompress\bin\ *
java -jar ApkCompress.jar
-a C:\Users\Administrator\Desktop\apk\test.apk //需要压缩的APK文件
-k F:\keystore\testkey //key文件路径
testpassword //key密码
aliaspassword //alias密码
aliasname //alias名称
XXXX //name 如果不写, 默认就是CERT
-o C:\Users\Administrator\Desktop\apk\abc.apk //定义输出的apk文件名
-noarm //不压缩arm库(三星s6手机arm库不能压缩,环信会报错)
使用ApkCompress.jar压缩发布APK。 此工具为命令行工具。
一般的此命令使用方式为:
在命令行运行ComPressApk.jar -a C:/my/test.apk -k c:/key * ### alias -x86 http://www.test.com (也可以运行 java –jar ComPressApk.jar )
-a 后面跟apk路径名, 可以不是全路径
-k 后面是签名文件[key storepass keypass alias name] ,key可以不是全路径名 (name 如果不写, 默认就是CERT)
-x86 表示需要存储x86库文件在云端, 后面跟以http://开头的链接,最后实际的存储位置应该为 http://www.test.com/cloudrawso_x86
命令执行完以后, 会生成test_CompressAlign.apk. 这个apk就是压缩后的apk
新的命令参数
-o outputfilename 定义输出的apk文件名
-slience 不需要显示,在ant打包或者linux命令行执行有用
-nosign 不签名apk
-nox86check 不检测x86,arm混合调用
-noarm 不压缩arm库
在ant打包模式下检测打包成功 (一定要使用-slience)
如果Done.flag文件存在,表示打包成功
最后就可以把压缩后的test_CompressAlign.apk发布到市场了
注意:使用NativeLibCompression时遇到的一些坑 **。
\DecRawso_Jar\libs中的so文件只兼容了 armeabi、x86,
一、自己的项目中请务必删除arm64-v8a、armeabi-v7a,不然在三星S6等系列的手机上会包找不到libDecRawso.so文件的问题
二、在用cmd命令压缩APK文件时,有用到环信libeasemob_jni.so等类似的so库时,
请务必使用-noarm //不压缩arm库(三星s6系列手机arm库不能压缩,环信会报错),
Android 设备的CPU类型(通常称为”ABIs”)
armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。