金融APP装置包瘦身历程中的一些下场

时尚2024-05-17 13:29:004

一、金融布景

随着营业不断迭代更新,装置包中App的瘦身巨细也在快捷削减,2019年~2022年时期一度逾越了117M,历程时期咱们也做了部份优化如图1红色部份所示,下场但在做优化的金融同时面临着新的增量代码,包体积不断不断回升。装置包中包体积直接或者直接地影响着下载转化率、瘦身装置光阴、历程磁盘空间等紧张目的下场,以是金融投入肉体开掘更深条理的装置包体积优化黑白常需要的。凭证google商铺的装置包中外部数据,APK体积每一削减10M,瘦身平均可削减~1.5%的历程下载转化率,如图2所示:

瘦身妄想搭配_瘦身妄想减肥产物_瘦身妄想

图1 京东金融版本2019-2022体积变更历程 (红色部份是下场时期做的部份优化,可是很快就反弹回去了)

瘦身妄想_瘦身妄想搭配_瘦身妄想减肥产物

图2 google商铺运用转化率削减幅度 / 10M [1]

因此2022年9月开始咱们针对于金融APP妨碍了瘦身专项整治,在不思考增量的情景,无删减营业代码的情景下实现从117M瘦身至74M,在本次装置包瘦身历程中咱们碰着了良多坑,同时也积攒了些履历,在此分享给巨匠。

二、APK合成

接下来咱们会重大合成下 Apk内各组成部份,以及 Apk 作为 ZIP,其尺度妄想是甚么样的,为包瘦身的目的设定及使命拆解提供数据反对于。

2.1 APK内容合成

瘦身妄想搭配_瘦身妄想_瘦身妄想减肥产物

图3 APK 妄想

•.dex APK 中可能搜罗一个或者多个 .dex 文件,运用挨次内的 Java/ 源码最终会以字节码的方式存在于 .dex 文件中。

•.工具在编译资源会将一些资源概况资源索引打包成.arsc。

•res/ 源码工程中 res 目录下除了 外的资源文件,这些文件道路同时会记着实 .arsc 中。

•lib/ ,即源码工程 jni 目录下的 so 文件,二级目录为 NDK反对于的 ABI。

•/ 与 res/ 资源目录差距,/ 下的资源文件不会在 .arsc 中天生查问条款,且 / 下的资源目录可残缺自界说,在挨次中经由 工具来取患上。

•META-INF/该文件夹下主要搜罗 CERT.SF 以及 CERT.RSA 署名文件, 以及 .MF 清单文件。

•.xml 运用清单文件,用于形貌运用根基信息,主要搜罗运用包名、运用id、运用组件、所需权限、配置装备部署兼容性等。

2.2 SDK巨细合成

经由咱们自研的能效提升平台[7],可能直不雅地看到SDK的巨细,如图4所示:

瘦身妄想搭配_瘦身妄想_瘦身妄想减肥产物

图4 SDK巨细排序(搜罗版本号)

瘦身妄想减肥产物_瘦身妄想搭配_瘦身妄想

图5 SDK中搜罗的SO库列表及巨细

凭证SDK合成后散漫营业,来分说哪些营业适宜做插件化,进而直不雅的飞腾包体积。

2.3 ZIP妄想合成

可能用命令输入缩短包中每一个文件的详细信息日志,用法: -l --t --h test.apk >test.txt

输入的日志文件掀开如图6所示,每一个文件的缩短信息一行,搜罗文件名、原始巨细、缩短后巨细等目的:

瘦身妄想减肥产物_瘦身妄想_瘦身妄想搭配

图6 APK内文件信息巨细

对于以上日志信息妨碍逐行剖析,凭证解混合后的文件名道路、文件规范妨碍归类统计,即可患上出Apk的总览信息,搜罗各规范文件的数目、总巨细、繁多文件巨细等目的,并建树文件巨细索引。

三、瘦身实际

部份实施道路如图7所示,主要分为:

1.老例技妙筹划,经由插件(代码无侵入、自动化)在编译时期实现APP瘦身;

2.进阶技妙筹划,将部份营业线差距性的经由插件化概况SO动态下载的方式就行刷新,营业刷新的越多,收益越高;

3.营业优化妄想,针对于营业线的数据埋点,天生碰头UV妨碍排名,将UV较低的营业线反映架构委员会,评估是否可能妨碍下线概况经由进阶技妙筹划(2)妨碍刷新,进而减小包体积。

瘦身妄想减肥产物_瘦身妄想搭配_瘦身妄想

图7 部份实施道路

3-1 老例技妙筹划 3-1-1 图片处置

经由上述的APP的合成,患上出占用体积第一大的仍是图片,因此将APP所有含SDK内所有图片在编译打包历程中经由瘦身使命自动实现图片优化处置,部份优化妄想如图8所示:

瘦身妄想_瘦身妄想搭配_瘦身妄想减肥产物

图8 图片优化妄想

1.多 DPI 优化:

为了适配种种差距分说率概况方式的配置装备部署,为开拓者妄想了统一资源多个配置装备部署的资源道路,app 经由 取患上图片资源时,自动凭证配置装备部署配置装备部署加载适配的资源,但这些配置装备部署伴同着的下场便是高分说率的配置装备部署搜罗低分说率的无用图片概况低分说率的配置装备部署搜罗高分说率的无用图片。

艰深情景下,针对于国内运用市场,App 为了削减包巨细,会选用市场占有率最高的一套 dpi( 推选 )兼容所有配置装备部署。而针对于外洋运用市场的 APP,大多会经由 打包上传至 Play,可能享受动态散发 dpi 这一功能,差距分说率手性可能下载差距 dpi 的图片资源,因此咱们需要提供多套 dpi 来知足所有配置装备部署。在名目中,咱们的图片有的惟独一套 dpi,有的有多套 dpi,针对于上述两种场景,咱们分说在打包时并吞资源、复制资源,削减了包巨细。

2.转换为webp格式:

是google提供的一种反对于有损缩短以及无损缩短的图片文件格式,而且可能提供比JPEG或者PNG更好的缩短。在 4.0(API level 14)中反对于有损的WebP图像,在 4.3(API level 18)以及更高版本中反对于无损以及透明的WebP图像

因此:咱们接管插件在编译时期仅保存针对于图片经由提供的shell挨次妨碍格式转换,转换乐成删除了旧的图片,进而抵达APK瘦身的下场

3.png缩短

是一个_好用的png缩短工具一个,可能妨碍有损图片缩短的命令行工具,因此在1以及2处置停止后,可能运用妨碍二次缩短,抵达更优的图片瘦身。

3-1-2 R文件内联优化

DEX里是Java/ 源码编译后的字节码文件,对于DEX的优化着实便是奈何样优化字节码文件,DEX中搜罗大批的资源索引R文件,这里主要讲下若何经由资源ID内联后妨碍R文件删除了,抵达APK瘦身的目的:

R文件瘦身的可行性合成

同样艰深开拓阶段,在主工程中经由R.xx.xx的方式援用资源,经由编译后R类援用对于应的常量会被编译进class中。

();

这种变更叫做内联,内联是java的一种机制(假如一个常量被标志为 final,在java编译的历程中会将常量内联到代码中,削减一次变量的内存寻址)。非主工程中,R类资源ID以援用的方式编译进class中,不会发生内联。

(R..);

发生这种天气的原因是AGP打包工具导致的。详细细节,巨匠可能去查阅一下 在R文件上的处置历程。论断:R类id内联后挨次可运行,但并非所有的工程都市自动发生内联天气,咱们需要经由技术本领在适宜的机缘将R类id内联到挨次中,内联实现后,由于再也不依赖R类文件,则可能将R类文件删除了,在运用个别运行的同时,抵达包瘦身目的,如图9所示,在编译实现后会发生大批的R文件:

瘦身妄想减肥产物_瘦身妄想_瘦身妄想搭配

图9 名目R文件天生展现

部份妄想如图10所示:

瘦身妄想搭配_瘦身妄想减肥产物_瘦身妄想

图10 R文件优化流程

留意事变:在交流阶段确定要退出二次魔难,防止交流完,运行时泛起颇为,如下所示:

try {

int value = .(type, name);

}catch ( e){

= " is not found(I),="++",="+owner+"."+name;

throw new ption();

try {

int[] value = .(type, name);

}catch ( e){

= " is not found(I[]),="++",="+owner+"."+name;

throw new ption();

3-1-3 妨碍资源混合

1.资源加载历程合成

开拓历程中咱们经由aapt天生的R.java中的常量来运用资源,而在编译之后运用常量的中间都市被交流为常量的值,如下所示:

final View = .(, , false);

也便是说咱们经由运用一个int数值来查找运用资源。那末是奈何样经由int数值找到详细的资源呢?咱们解压apk可能看到概况有个.arsc文件,这个文件也是由aapt天生,文件中保存着资源id以及资源key的映射关连,便是凭证这个映射关连找到资源的。

2..arsc:

图11是.arsc的里存储的映射关连,.arsc可能清晰为一个资源映射数据库,凭证ID映射其中详细的道路以及称谓。

瘦身妄想减肥产物_瘦身妄想_瘦身妄想搭配

图11 .arsc剖析

经由解压APK后,将资源文件名妨碍短链处置好比res//hello.xml转换为r/l/a.xml后,而后变更.arsc对于应的value值,抵达部份的瘦身下场。

[5]是微信推出资源优化工具,它的根基脑子相似于 中的混合,可能实现以上妄想。

3-1-4 7zip缩短

7zip命令批注:

-t:指定缩短规范,反对于7z, xz, split, zip, gzip, bzip2, tar, ....

-m:指定缩短算法,默认是

详细流程如下:

第一步:运用7z命令将未署名包解压到指定目录:7za x ${ 未署名包} -o${ 7z解压目录}

第二步:首先经由7z命令对于解压目录妨碍全副缩短:7za a -tzip -mx9 ${ 目的7z文件名} ${ 7z解压目录}

第三步:取患上存储规范文件,经由 SDK中的aapt命令取患上缩短方式为的文件列表:aapt l -v ${ 未署名包}

第四步:更新存储规范文件,经由7z命令将存储规范文件更新到第二步操作中天生的7zip装置包:7za a -tzip -mx0 ${ 目的7z文件名} ${ 存储规范文件目录}

3-1-5 配置装备部署CPU架构

凭证差距的CPU架构,构建差距的规范的装置包,当初主流配置装备部署都是64位机械,因此安卓市场上主要投放的是凭证arm64-v8a编译构建的装置包

ndk {

arm64-v8a

3-1-6 arsc 缩短

.arsc 的缩短体积收益很高,但对于其妨碍缩短会影响启动速率以及内存目的。原因是:零星在加载 arsc 文件时,若 arsc 文件未缩短,可运用 妹妹ap 妨碍内存映射;若 arsc 文件被缩短了,则需要将其解缩短后读取到RAM 缓冲区,会削减内存运用,也会拖慢启动速率。

民间出于同样的思考,从 >=30后不能用这种方式 开始欺压要求.arsc ,否则会直接装置失败,因此本文不在睁开论述。

3-1-7 国内化语言处置

京东金融App当初仅在国内市场经营,可是接入的大批SDK中退出了多少十种语言同样,导致全部人积变大,经由评估可能经由配置装备部署 去除了无用的语言资源。

{

"zh","en"

3-1-8

:编译历程中用来检测并删除了无用资源文件,也便是不援用的资源

:用来开启删除了无用代码,好比不援用到的代码,以是假如需要知道资源是否被援用就要配合运用,惟独两者都为true时才会起到真正的删除了实用代码以及无援用资源的目的。

其熏染是将未被援用的资源文件交流为一总体积很小的格式文件(仍存在占位体积,同时保存了该资源条款,以是 .arsc 体积并不会削减),可经由 res/raw/keep.xml 文件配置装备部署 以及白名单。

{

{

// 不展现Log

"", "", "false"

//混合

true

// 移除了无用的文件

true

le('-.txt'), '-rules.pro'

sign.

3-1-9 编码约束

•尽管纵然少用枚举规范,由于枚举在编译成字节码后,会削减大批体积,如图12所示(22行代码编译后字节码是86行)

瘦身妄想减肥产物_瘦身妄想_瘦身妄想搭配

图12 枚举规范编译后的字节码比力

•删除了不用要的LOG日志输入

3-2 进阶技妙筹划

SO库动态下载以及插件化技术,本性上都属于动态下载的一个规模,两个妄想可能在营业中临时不断运用,在详细运用历程中若何抉择,如图13所示:

瘦身妄想减肥产物_瘦身妄想搭配_瘦身妄想

图13 营业若何抉择进阶妄想

3-2-1 SO库动态加载

APP中有部份营业不适宜做插件化刷新,经由拆解发现其中的SO库占比很大,因此可能思考接管动态下载的方式妨碍刷新,进而实现减小体积。

SO库加载的两种方式

第一种方式咱们直接把SO库下载并放到指定目录就能

第二种方式是经由情景变量配置的目录中妨碍加载SO库,因此咱们需要追加指定的目录到情景变量中,就能个别加载SO库

.load("{ 清静道路}/.so")

.load("xxx")

一、若何配置APP中SO库的情景变量位置(借鉴):

final Field = .(, "");

final = .get();

final Field ries = .(, "ries");

List = (List) ries.get();

if ( == null) {

= new (2);

final = .();

while (.()) {

final File = .next();

if (.()) {

.();

break;

.add(0, );

final Field = .(, "");

List = (List) .get();

if ( == null) {

= new (2);

final List = new (.size() + .size() + 1);

.();

.();

final = .(, "", List.class);

final [] = ([]) .(, );

final Field ments = .(, "ments");

ments.set(, );

二、若何删除了指定SO库以及全部加载流程,如图14所示:

瘦身妄想_瘦身妄想减肥产物_瘦身妄想搭配

图14 SO库删除了以及加载流程

3-2-2 插件化

甚么是插件化:

插件化是将一个Apk凭证营业功能拆分成差距的子Apk(也便是差距的插件),每一个子Apk可能自力编译打包,最终宣告上线的是集成后的Apk。在Apk运历时,每一个插件是动态加载的,插件也可能妨碍热修复以及热更新。

•宿主:主App可能用来加载插件也成为Host

•插件:插件App,被宿主加载的App,可能跟艰深的App同样的Apk文件

甚么方式的营业适宜插件化刷新:

•营业相对于自力,与宿主App解耦残缺

•改选老本低,收益相对于较高

•占用体积较大

经由一些列评估,视频歇业适宜以上多少点,刷新后的下场如图15所示:

瘦身妄想搭配_瘦身妄想减肥产物_瘦身妄想

图15 视频歇业厅插件化刷新后下场

3-3 营业优化妄想

随着营业越来越多,一些怪异的营业UV越来越低,因此拟订了一套营业下线优化流程,如图16所示:

瘦身妄想搭配_瘦身妄想减肥产物_瘦身妄想

图16 营业优化妄想流程

四、管控

瘦身妄想的实施很紧张,后续的管控不反弹更紧张,咱们一边做瘦身规画,另一边探究常态化的管控机制,最终积淀了一套管控尺度以及管控机制。管控的目的不是限度营业迭代概况新增代码,而是奈何样做到在有限的代码中实现其功能,提升工程师同样艰深编码中的瘦身意见。

4.1 SDK接入尺度

为防止SDK无序扩展,拟订了SDK准入尺度,在保障功能的条件下严控SDK体积巨细,最大水平操作APP体积反弹。

4.2 管控流程

瘦身妄想_瘦身妄想搭配_瘦身妄想减肥产物

图17 管控流程

凭证削减内容、删除了内容、增大内容、减小内容、一再文件、代码规画等资源文件的变更情景散漫规画管控尺度等妨碍规画,打包构建实现会跟历史版本就行差量比力,取患上变更的内容来评估是否具备优化空间,并给出优化目的,待优化后重新构建打包集成。

五、下场与后续妄想 5.1 下场

经由以上措施,京东金融版本经由两个季度5个版本的迭代,从117M到如今的74M(图18),部份不断坚持在可控的规模内。同时在接下来的版本迭代中,咱们会将APK瘦身常态化,不断坚持包体积在可控的规模内。

瘦身妄想减肥产物_瘦身妄想搭配_瘦身妄想

图18 金融APP瘦身下场

5.2 后续妄想

不断技术本领优化:

营业的不断聚积迭代,总会发生一些无用的资源,以是装置包瘦身要定期整理这些无用文件以及代码;

做好各个版本的监控,比力版本之间的差距,发现可能在不影响营业情景下,运用技术本领优化。

线上管控平台搭建:

前期接管线下的管控规画,实施起来有点耗时,后续咱们会美满线上管控平台的搭建,与全部App宣告构建平台妨碍融会,组成流水线的机制,做好管控。

小结:装置包瘦身的探究尚有很长的路走,本文也只是摆列了一些罕用的瘦身妄想,对于重大的名目除了优化外,尚有做好名目之间的规画,不断对于APP妨碍体积优化,提升用户体验。

【参考质料】

[1] 包巨细与装置转化率

[2]

[3] R8

[4] 与R8比力

[5]

[6] AGP

[7] :基于去中间化技术的研发、测试阶段能效提升工具

本文地址:http://n.3x5h33e.cn/html/30a099285.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

梅州进口企业享惠更利便!海关总署作废原产地企业存案

中文课堂学习钻研实际与案例合成(对于中文课堂学习钻研实际与案例合成简述)

互联网大潮来势汹涌 地板企业“革命”从何入手?

中文版Photoshop图像处置典型技法118例(对于中文版Photoshop图像处置典型技法118例简述)

体坛:中超部份品质有后退国足开始受益,需更多有谋求的球队

墓道电视剧(对于墓道电视剧的根基情景剖析介绍)

坟地风水(对于坟地风水的根基情景剖析介绍)

填报被迫指南(对于填报被迫指南的根基情景剖析介绍)

友情链接