为了账号安全,请及时绑定邮箱和手机立即绑定

Android开发减少Apk大小及统计方法数实践

标签:
Android

前言

一款好的App首先需要保证功能稳定性(在用户手上不Crash),同时也要考虑节省用户的流量,电量等。不过现在的App市场同类型的App已经很多了,那么如何保证你的产品能在做推广时用户愿意下载呢?就是通过精简APK大小来减少用户的下载成本。

下面就Androdi开发中一些控制APK大小的经验来简单说明一下。

APK分析

在开发一款APP时我们都会引用一些Github上的开发库,一款App基础框架如下:

1.    Retrofit+OkHttp+OkIO作为网络请求框架;

2.    Glide/Fresco/Picasso/AIL/等作为图片加载库;

3.    EventBus/Otto 作为事件发布/订阅总线;

4.    ORMLite/GreenDao作为数据库框架的普遍较多;

5.    Gson/Jackson等JSON解析库;

6.    基于RxJava函数式编程思想构建的精简开发框架(代码不容易看懂);

以上是笔者总结的大部分比较常用的库,当然有时候还需要集成一些三方平台提供的SDK:

1.    Umeng/ShareSDK/LeanCloud等三方统计平台服务(三方登录/数据统计/软件更新等);

2.    集成微信/支付宝支付SDK;

3.    高德/百度/腾讯地图SDK;

4.    讯飞/百度语音等语音识别/语音合成 SDK;

以上基本上是开发中需要用到的库和文件,而Android作为开发者,在开发中最好尽量避免在Apk中一些不必要的库,因为过多的集成库会导致Apk的方法数超过65535的限制。这时候只能通过MultiDex方法来解决这个问题。
不过使用MutliDex解决方案会导致一些问题:

1.    增加了在较旧和低版本的Android设备上应用加载的时间;

2.    在一些三星设备上,由于厂商设备出厂对应用的内存限制会导致一些问题。比如运行时崩溃。

所以不在万不得已的情况下,不要轻易使用MultiDex方案。应该尽量避免方法数超过65535。

解决方案

使用dex-method-counts来统计项目方法数量

[dex-method-counts]是一款基于Gradle构建的Java工程,它包含一些Android的构建工具,可以帮助我们统计Android工程中的每个三方库的方法数量并给出详细的数据分析。可以让我们快速定位Apk中方法数的问题。
Github地址:https://github.com/mihaip/dex-method-counts
这个项目是基于IDEA开发开发工具Gradle工程构建的,如果你的电脑中有IDEA软件,可以直接导入项目,传入APK的文件绝对路径作为参数,运行即可。

如果没有IDEA,也可以直接通过Gradle来编译整个工程:

on OSX

./gradlewassemble./gradlewassemble ./dex-method-counts path/to/App.apk

on Windows

gradlewassemblegradlewassemble java -jar path\to\build\jar\dex-method-counts.jar path\to\App.apk

本文在IDEA中编译并执行后得到如下结果(部分片段):
可以看出整个Apk的方法数为59805,小于65535的数量限制,可以不必使用Multidex。
在图中可以看出,ShareSDK的方法总计1941个;以com.包名的模块占方法数32327个,其中友盟Update(怎么是alimama额)占用293个,amap(高德地图)占用6003个方法。

使用Gradle脚本来计算Apk的大小

在每次编译完Apk后,可以通过脚本自动计算Apk各个版本的大小情况,包括debug-unProguard版本和release-proguard版本。
下面是一段简单的代码,打印app-debug版本和app-unaligned版本的大小:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

task reportApkSize << {

    def sdkProject =   project(':app')

    def nonSdkProject =   project(':app')

    def footprint =   getSizeDifferent(

            new   File("${sdkProject.buildDir}/outputs/apk/app-debug.apk"),

            new   File("${nonSdkProject.buildDir}/outputs/apk/app-debug-unaligned.apk"))

    println footprint

}

 

def getSizeDifferent(File file1,File file2){

    return "Debug Size is :   "+file1.size()/1024/1024+"M"+" Debug unaligned Size is :   "+file2.size()/1024/1024+"M";

}

 

通过简单的配置就可以打印Apk的其他版本大小,通过每次发布之前来比较,并结合dex-counts就可以随时的分析和了解自己Apk的大小情况,便于分析和解决问题。

原文链接:http://www.apkbus.com/blog-705730-61433.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消