使用NativeLibCompression极致压缩APK文件大小

使用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位的平板。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值