亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消