【小木箱生长营】包体积优化系列教程:

包体积优化 实战论 怎么做包体积优化? 做好能晋升吗? 能涨多少钱?

包体积优化 东西论 初识包体积优化

BaguTree包体积优化录播视频课(重视大众号小木箱生长营,回复“包体积优化”可免费获取课程PPT)

一、导言

Hello,我是小木箱,欢迎来到小木箱生长营系列教程,今日将共享包体积优化 办法论 揭开包体优化奥秘面纱。

上一次共享咱们说了三个部分内容,榜首部分内容是事务问题和应战。第二部分内容是包体优化基础知识。第三部分内容是代码优化。最终一部分内容是代码优化留意事项。

代码优化分为四部分内容,榜首部分内容是代码优化的思路,第二部分内容是7款apk黑盒逆向东西,第三部分内容是7款代码剖析东西,

这一次共享,小木箱从三个维度将Android包体积优化办法论解释清楚,本文首要包含三部分,榜首部分内容是关于So层优化,第二部分内容是关于资源文件优化,第三部分内容是关于Assets/Raw资源优化,最终一部分内容是总结与展望。

假如学完小木箱包体积优化的东西论、办法论和实战论,那么任何人做包体优化都能够拿到结果。

二、关于So优化

首要咱们来到榜首部分内容关于Native层优化,关于Native层优化有六部分能够和咱们说一下,榜首部分内容是装备abiFilters。第二部分内容是防止解紧缩原生库.第三部分内容是移除调试符号。第四部分内容是so紧缩计划.第五部分内容是so混杂计划.第六部分内容是包体监控。

2.1 装备abiFilters

首要咱们聊聊榜首部分内容装备abiFilters,关于so包减肥引荐咱们移除剩余的so架构,一个硬件设备对应一个架构(mips、arm或许x86),只保留与设备架构相关的库文件夹(主流的架构都是arm的,mips归于小众,默许也是支撑arm的so的,但x86的不支撑)能够大大下降lib文件夹的巨细,移除装备如下:

defaultConfig {
    ndk {
        abiFilters "armeabi"
    }
}

一般运用都不需求用到 neon指令集优化,咱们只需留下 armeabi 目录就能够了。由于 armeabi 目录下的 So 能够兼容其他渠道上的 So。

缺点是其他渠道运用时性能上就会有所损耗,失去了对特定渠道的优化。

2.2 防止解紧缩原生库

然后咱们聊聊第二部分内容是防止解紧缩原生库,在编译运用的发布版别时,您能够经过在运用清单元素中设置 android:extractNativeLibs="false",打包 APK 中未紧缩的 .so文件。停用此标记可防止 PackageManager 在装置进程中将 .so 文件从 APK 复制到文件体系,并具有减小运用更新的额定优点。

2.3 移除调试符号

接着咱们聊聊第三部分移除调试符号,运用 Android NDK 中供给的 arm-eabi-strip 东西从原生库中移除不必要的调试符号。

运用strip手动为ndkaarch64-linux-android-strip指令移除动态库中的调试信息,装备如下:

SET_TARGET_PROPERTIES(yoga PROPERTIES LINK_FLAGS "-Wl,-s")

2.4 设置编译器的优化flag

其四,咱们聊聊设置编译器的优化flag,编译器有个优化flag能够设置,分别是-Os(体积最小),-O3(性能最优)等。这里将编译器的优化flag设置为-Os,以便削减体积。

CMake

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")

Android.mk

LOCAL_CPPFLAGS += -Os
LOCAL_CFLAGS += -Os

除了直接删去占用体积较大的模块外,编译器优化是排下来优化空间最大的办法。设置完-Os后占用提交较大的前几个库体积比照:

包体积优化  方法论  揭开包体积优化神秘面纱

2.5 Buck

其五,咱们聊聊so减肥计划,关于SO紧缩计划有许多种,XZ 和7-Zip 是不错的挑选,这边我引荐一款so紧缩神器Buck。

自从Android开发切换到Android Studio之后,就一直运用Gradle进行项意图构建,随着工程Module的增加,代码的一处改动,都要花费几分钟的时刻从头编译,实在是浪费时刻;Facebook的Buck首要用来替换Gradle,快速构建Android多模块体系。

包体积优化  方法论  揭开包体积优化神秘面纱

剖析代码中的 JNI 办法以及不同 Library 库的办法调用,然后找出无用的 symbol 并删去,这样 Linker 在编译的时分也会把 symbol 对应的无用代码给删去。在 Buck 有 NativeRelinker 这个类,它就完成了这个功用,其类似于 Native Library 的 ProGuard Shrinking 功用。

Buck 除了完成了 Library Merge 和 Relinker 功用之外,还完成了多言语拆分、分包支撑和ReDex支撑三大功用。

2.6 包体监控

由于篇幅有限,SO动态化计划实战论解说,技能计划比较多,但老练稳定开源库却少,FaceBook供给了SoLoader习惯于RN渠道会改动渠道构建方法,前两个店主公司有做动态化,某游戏直播公司DQ-Android-Labs源码已经开源、某同城货运公司供给了很好的技能思路,最近发现作业一年的Pika也着手做了一款SillyBoy,咱们能够点赞支撑一下。

最终,包体积优化之后,咱们需求包体监控,意图是防止包体积巨细劣化现象重复。关于包体监控首要分为三个纬度的监控。

榜首个维度是巨细监控,通常是记载当时版别与上一个或几个版别之间的改动情况,假如当时版别体积增加较大,则需求剖析详细原因,看是否有优化空间。

第二个维度是依靠监控,包含Jar、aar 依靠。其中arr依靠,咱们能够经过python脚本解析输出回溯前端,接着根据版别的差异性展示依靠关系图。这样每个版别咱们就能很方便的知道dex新增的体积发生点位在哪里,能快速排查和定位问题所在。

第三个维度是包体积规矩监控,咱们能够把包体积的监控抽象为无用资源、大文件、重复文件、R 文件等这些规矩。

包体积规矩监控能够用微信Matrix中的ApkChecker来完成。

三、 针对资源文件优化

针对资源优化的思考方法首要有六部分,榜首部分是图片资源优化。第二部分是重复资源优化。第三部分是AndResGuard资源混杂。第四部分是shrinkResources。第五部分是言语资源优化。第六部分是ApkChecker。

3.1 图片资源

图片资源优化分为八部分,榜首部分是图片紧缩。第二部分是运用webp。第三部分是运用SVG。第四部分是Tint着色器。第五部分是特点代码代替shape。第六部分是从代码进行烘托。第七部分是多分辨率适配。第八部分是超大图缩小分辨率。

3.1.1 图片紧缩

首要咱们聊聊图片紧缩,图片紧缩现在已知最优计划是tinypng,因而,主张采用ImgCompress、 McImage、TinyPngPlugin、TinyPIC_Gradle_Plugin东西装备tinypng来进行图片紧缩方面优化最佳。

项目中的一些场景下,如闪屏,布景图等,无论大图小图,不带透明度的png图片,都可挑选转化成jpg来进行有损紧缩,能有用减小资源文件的巨细。

据Google官方介绍,AAPT 默许运用内置的紧缩算法来优化 res/drawable/ 目录下的 PNG 图片,假如运用tinypng二次紧缩,那么或许会导致本来已经优化过的图片体积变大.因而,为了躲避AAPT内置优化的紧缩算法导致图片紧缩体积更大,紧缩时应禁用默许紧缩算法,禁用方法如下

aaptOptions {
    cruncherEnabled = false
    }

3.1.2 运用webp

vd(纯色icon)->webp(非纯色icon)->png(更好作用) ->jpg(若无alpha通道)

参阅链接:developer.android.com/guide/appen…

包体积优化  方法论  揭开包体积优化神秘面纱

其二咱们聊聊运用webp,android 4.0+以下,可挑选将png转化成jpg来进行有损紧缩。从而有用减小资源文件的巨细。

假如想要png或jpg文件的巨细更小 ,那么运用pngcrush、pngquant 或 zopflipng 等东西紧缩png或jpg文件的巨细是值得引荐的。

有没有比jpg更小的图片格局呢?webp。webp是android 4.0+以上版别原生支撑的一种图片格局。尽管webp的图片巨细低于png,但咱们需求比较一下webp比照png的编解码速度, 实验证明WebP解码时刻低于png解码时刻。

 fun decodeWebP(){
        var pngStart = System.currentTimeMillis()
        BitmapFactory.decodeResource(resources, R.mipmap.icon_png)
        Log.e(TAG, "解码 png 格局图片时刻 : ${System.currentTimeMillis() - pngStart} ")
        var webPStart = System.currentTimeMillis()
        BitmapFactory.decodeResource(resources, R.mipmap.icon_webp)
        Log.e(TAG, "解码 WebP 格局图片时刻 : ${System.currentTimeMillis() - webPStart} ")
    }
    // 解码 png 格局图片时刻 : 285 
    // 解码 WebP 格局图片时刻 : 210

png人肉转化webp引荐线上东西png-webp或Google供给的libWebp东西,由于libWebp支撑指令行,所以咱们经过自界说插件的方法去转化就很方便了 png全量转化webp主张用WebpConvert_Gradle_Plugin

cwebp -q 75 in.png -o out.webp

但有个兼容性问题需求考虑。在4.0 ~ 4.3.1,把png转成webp则无法显现 假如把png先转成jpg再转成webp则能正常显现了,但会丢失透明度。由于4.0 ~ 4.3.1设备上无法显现带有透明度的webp。

3.1.3 运用缩放矢量图

其三咱们聊聊运用SVG,SVG又名缩放矢量图,假如SVG需求运用VectorDrawable,那么能够引证support库能够兼容低版别。

由于SVG的扩大缩小,图片质量坚持不变,所以运用SVG能够节省内存空间巨细,从而减小 APK 的体积。

因而,SVG常用于简略小图标。作业中常用 svg2android 将矢量图转化成 VectorDrawable。SVG版别兼容性如下:

版别 矢量图支撑 Vector Asset Studio 支撑
Android 5.0以上(API 等级 21) ✔️ 一切 VectorDrawable 元素
Android 5.0以下(API 等级 20)及更低版别 支撑部分 XML 元素, 将SVG文件增加到项目中

在App减肥最佳实践 中有说到svg的问题和解决计划。运用AnimatedVectorDrawableCompat创建矢量动画代替原有的帧动画。

3.1.4 Tint着色器

参阅链接: github.com/han1202012/…

其四咱们聊聊Tint着色器,自 API 21 开始,Android SDK 引进Tint着色器Tint着色器就能够随意改动安卓项目中图标或许 View 布景的色彩,Tint着色器一定程度上能够削减同一个款式不同色彩图标的数量,从而起到 Apk 减肥的作用。Tint着色器运用如下:

包体积优化  方法论  揭开包体积优化神秘面纱

包体积优化  方法论  揭开包体积优化神秘面纱

3.1.5 特点代码代替shape

其五咱们聊聊特点代码代替shape,XML Drawable目标出产了契合 Material Design 准则的单色图片并且Drawable目标(XML 中shape)占用APK少量内存空间,因而,当某些图片非静态图片;结构能够在运转时改为动态绘制图片。

特点代码代替shape体运用原理是经过加载自界说布景shape的factory, 注入体系的LayoutFactory,拦截体系的控件创建进程。在自界说控件时,扫描咱们自界说控件相关的自界说特点,经过这些自界说特点,创建体系的GradientDrawable目标,并将该目标作为布景,设置到控件上。完成进程如下:

    @Override
    public View onCreateView(@Nullable View parent,  String name,  Context context,  AttributeSet attrs) {
        name = TUtil.getRealViewName(name);
        View view = null;
        // 先让外部layoutInflaterFactory测验加载view
        if (mOutFactory != null) {
            view = mOutFactory.onCreateView(parent, name, context, attrs);
        }
        // 外部factory不存在或许加载不成功,测验体系AppCompatDelegate记载view
        if (view == null && appCompatDelegate != null) {
            view = appCompatDelegate.createView(parent, name, context, attrs);
        }
        // 获取布局中的t_background相关特点
        TRoundBackground bg = TUtil.getTbackgroundFromAttrs(context, attrs);
        ColorStateList csl = TUtil.getTextColorFromAttr(context, attrs);
        // 假如设置了T_background相关特点
        if (bg != null || csl != null) {
            // 自身测验创建view
            if (view == null) {
                view = createViewFromTag(context, name, attrs);
            }
            // 测验设置t_background相关到view中
            TUtil.setViewBackground(bg, view);
            TUtil.setViewTextColor(csl, view);
        }
        return view;
    }

经过上面的烘托方法达到了自界说特点完成体系Shape布景的作用。

3.1.6 从代码进行烘托

其六咱们聊聊从代码进行烘托,关于一些矩形、圆形等惯例图形咱们能够直接经过代码进行烘托和绘制。

3.1.7 多分辨率适配

其七咱们聊聊多分辨率适配,实践项目中咱们引进的icon文件,假如是谈天表情图片主张运用hdpi格局,假如是纯色小 icon 主张运用 VD格局,假如是布景大图主张运用 xhdpi格局,假如是logo等权重比较大的图片主张运用 hdpi和xhdpi格局。

假如某些图在真机中有异常主张出多套图,其余仅保drawable-hdpi一套即可。为了一致运用风格,咱们能够削减shape文件。为了一致的标题栏,相同界面资源运用include标签。为了运用toolbar,咱们能够削减menu文件。为了限制灵活性,咱们能够削减layout文件。

3.1.8 超大图缩小分辨率

最终 咱们聊聊超大图缩小分辨率 假如解压Apk发现有超出限制巨细的非alpha png图片,那么咱们考虑把超出限制的图片进行转码或缩小分辨率来优化。当然这个步骤能够经过McImage完成。

3.2 重复资源

说完图片资源优化,咱们说一下重复资源优化,实践项目开发进程中,不同的功用迭代,经过了N多个人保护。或许会在不同的方位运用了相同的icon,但命名各不一样,这样就会导致apk中呈现许多重复发资源文件。

常见的解决办法是经过资源包中的每个ZipEntry的CRC-32 checksum来筛选出重复的资源;经过android-chunk-utils修正resources.arsc,把这些重复的资源都重定向到同一个文件上; 把其它重复的资源文件从资源包中删去。

包体积优化  方法论  揭开包体积优化神秘面纱

jekins打包后,咱们能够输出包含重复资源列表的apk巨细剖析结果报表,经过参阅列表进行优化。

3 .3 言语资源

说完重复资源优化,咱们说一下言语资源优化,google给咱们的apk供给了国际化支撑,如习惯不同的屏幕分辨率的drawable资源,还有习惯不同言语的字符串资源等等。

构建东西能够移除指定言语之外的一切资源(能够删去sdk里面的言语资源) 。

但是在许多情况下咱们只需求一些指定分辨率和言语的资源就能够了,这个时分咱们能够运用resConfigs办法来装备。

android { //...   
defaultConfig {
     resConfigs "zh"
 }
}

3.4 AndResGuard

传送门: github.com/shwenzhang/…

3.4.1 导言

说完言语资源优化,咱们说一下AndResGuard资源混杂东西,AndResGuard资源混杂东西大约是在2014年4月完成,并在微信5.4中运用,削减了大约1M的空间。

AndResGuard把资源名称,途径名称混杂紧缩的方法,增加运用本身安全性的一起,紧缩包体巨细,一起把原apk包stared方法存储的png文件,改成DEFLATED(一般紧缩存储)方法,进一步紧缩包体巨细。

3.4.2 计划

AndResGuard资源混杂东西直接处理apk。不依靠源码,不依靠编译进程,仅仅输入一个装置包,得到一个混杂包。

3.4.3 处理

AndResGuard资源混杂东西针对resources.arsc,记载了资源文件的名称与途径,运用混杂后的短途径 res/s/a,能够削减文件的巨细。

AndResGuard资源混杂东西针对metadata签名文件,签名文件 MANIFEST.MF 与 CERT.SF 需求记载一切文件的途径以及它们的哈希值,运用短途径能够削减这两个文件的巨细。

由于AndResGuard资源混杂东西内部能够敞开7zip紧缩资源。关于ZIP 文件,ZIP 文件格局里面经过其索引记载了每个文件 Entry 的途径、紧缩算法、CRC、文件巨细等等信息。短途径的优化削减了记载文件途径的字符串巨细。

包体积优化  方法论  揭开包体积优化神秘面纱

3.4.4 作业流程

包体积优化  方法论  揭开包体积优化神秘面纱

3.4.5 7zip紧缩

7z有着更好的紧缩率,一起咱们也能够强制紧缩类似resources.arsc、png、jpg等Android默许不会打包紧缩的文件。最终把修正后的resources.arsc重打包即可,微信从解压,到混杂,到重打包消耗时刻,仅需35秒。详细作用如下图:

包体积优化  方法论  揭开包体积优化神秘面纱

3.4.6 运用方法

包体积优化  方法论  揭开包体积优化神秘面纱

在终端里执行如下sh文件,会在当时目录生成release文件夹,所生成的文件在这个目录下。

git clone https://github.com/shwenzhang/AndResGuard.git
&& brew install p7zip 
&& cd ../tools/res-reguard 
&& java -jar ./AndResGuard-cli-1.3.15.jar(混杂东西包)
./xxx.apk(输入文件) -config ./config.xml(装备文件)
-out ./release(输出目录) -signatureType v2(签名类型) 
-signature ./release.keystore(签名keystore文件途径)
testres(storepass) testres(keypass) testres(storealias) 
-zipalign /Library/Android/sdk/build-tools/32.0.0/zipalign(zipalign东西途径)

其中, config.xml文件内容如下:

包体积优化  方法论  揭开包体积优化神秘面纱

3.4.7 混杂后产品

包体积优化  方法论  揭开包体积优化神秘面纱

包体积优化  方法论  揭开包体积优化神秘面纱

3.4.8 经历与踩坑

关于AndResGuard有三点经历能够共享一下。榜首点是资源混杂之白名单代码扫描调用getIdentifier()办法的当地。

第二点是敞开7zip紧缩之后会影响图片加载速度,会对app发动速度有点影响。

由于安卓能够直接把图片资源加载到 mmap 里面。假如图片紧缩过之后,那么图片需求再解压一次,再加载图片会变慢。

第三点是Android 体系不会去紧缩这些文件呢?首要根据以下两点原因:

一方面,紧缩作用不明显:上述格局的文件大部分已经被紧缩过,因而,从头做 Zip 紧缩作用并不明显。比方 从头紧缩 PNG 和 JPG 格局只能削减 3%~5% 的巨细。

另一方面,根据读取时刻和内存的考虑:针关于没有进行紧缩的文件,体系能够运用 mmap的方法直接读取,而不需求一次性解压并放在内存中。

第四点是AndResGuard会全量扫描工程文件从而拉低工程编译速度,非必要情况下不要引进Plugin,在release打包环境用指令行即可。

包体积优化  方法论  揭开包体积优化神秘面纱

3.5 ShrinkResources

3.5.1 导言

说完AndResGuard资源混杂,咱们说一下shrinkResources,shrinkResources是Android的编译东西链中供给了一款资源紧缩的东西,能够经过shrinkResources东西来紧缩资源。

3.5.2 留意事项

shrinkResources不会真实删去资源图片,而是用预置的小资源文件代替原来的资源防止crash。

假如要启用资源紧缩,能够在build.gradle文件中将shrinkResources设置为true能够移除无用的 resource 文件:

包体积优化  方法论  揭开包体积优化神秘面纱

当 ProGuard 把部分无用代码移除的时分,这些代码所引证的资源也会被标记为无用资源,然后,体系会经过资源紧缩功用将它们移除。

需求留意的是现在资源紧缩器现在不会移除 values / 文件夹中界说的资源(例如字符串、尺度、款式和色彩)。

不想被unused resources或许shrinkResources删去的资源在raw目录增加增加keep文件。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="
           @layout/fragment_personal,
           @drawable/material_*,
           @string/*,
           @style/*,
           @anim/tiny_*"/>

敞开后,Android 构建东西会经过 ResourceUsageAnalyzer 来检查哪些资源是无用的,当检查到无用的资源时会把该资源替换成预界说的版别。

首要是针对 .png、.9.png、.xml 供给了 TINY_PNG、TINY_9PNG、TINY_XML 这 3 个 byte 数组的预界说版别。

包体积优化  方法论  揭开包体积优化神秘面纱

资源紧缩东西默许是采用安全紧缩模式来运转,能够经过敞开严格紧缩模式来达到更好的减肥作用。

3.6 ApkChecker

3.6.1 运用方法

说完AndResGuard资源混杂,咱们说一下ApkChecker,ApkChecker运用很简略。打开项目目录:根目录/tools/apk-checker,将需求打包生成的apk文件、mapping文件复制到该目录下; 修正该目录下的config.json文件的装备在–apk特点装备项修正为拷进该目录的apk文件名,在–mapping特点装备项修正为复制进该目录的mapping文件名。

将apk-check.sh文件拖进去终端回车运转(留意由于是省掉途径,终端需求cd相应的目录),就会主动生成一个checker-result.html的陈述。

ApkChecker比较好用的功用是对同一种图片监测,由于许多图片它或许是同一个,但是在不同的模块里面,或名字不一样,由于它 MD5一样的,所以能够把它弄成一张图片即可。

留意: 假如需求针对so相关的进行检测,需求自行在config.json增加相关选项:

 { "name":"-unstrippedSo""--toolnm":"(绝对途径)../arm-linux-androideabi-as" }
 { "name":"-checkMultiSTL""--toolnm":"(绝对途径)../arm-linux-androideabi-as" } 

3.6.2 输出陈述

包体积优化  方法论  揭开包体积优化神秘面纱

包体积优化  方法论  揭开包体积优化神秘面纱

包体积优化  方法论  揭开包体积优化神秘面纱

四、 针对Assets/Raw资源优化

4.1 紧缩资源文件

有些资源文件是必须要随着app同时发布的,关于这样的文件,能够采用紧缩存储的方法,在需求资源的时分将其解压运用。android上也有一个7z库帮助咱们方便的运用7z。

4.2 尽量防止运用帧动画

有些帧动画完全没必要,有些能够考虑换其他方法完成,或许动态下载。

4.3 优化音频格局,下降采样率

项目中的语音播报文件wav、mp3和aac格局能够进行紧缩优化 ,下降采样率。

4.4 字体紧缩

项目中或许为了某些特别需求需求用到一些特别的字体,但运用场景很少,咱们能够考虑精简字体包。小木箱引荐字体紧缩神器FontZip来提取特定字符的字体,在不影响用户运用的情况下,对ttf字体文件进行size精简。

包体积优化  方法论  揭开包体积优化神秘面纱

五、 总结与展望

本文首要说了三部分内容,榜首部分内容是针对SO优化。第二部分内容是针对Res资源优化。第三部分内容是针对Assets/Raw资源优化。

其中针对SO优化从装备abiFilters ,防止解紧缩原生库 ,移除调试符号 ,设置编译器的优化flag ,so紧缩和包体监控五个维度进行解说。

Res资源优化咱们谈到了图片资源优化、重复资源优化和言语资源优化紧接着带咱们引进了三个实用的Res资源优化东西 ,AndResGuard、ShrinkResources和ApkChecker。

而针对Assets/Raw资源优化一共触及了三个方面 ,紧缩资源文件、尽量防止运用帧动画、优化音频格局,下降采样率和字体紧缩。

近些年来,中大厂门户app不断老练,功用不断堆积和迭代,Android打包后体积越来越大。装置包体巨细不仅对用户留存、市场推广有负面影响,并且假如后续缺乏长效治理监管机制,那么包体巨细会呈现边治理边污染的现象。官方引荐、微信、美团、QQ音乐、字节跳动、快手、手淘和蘑菇街等包体优化计划对咱中小企业依然有学习含义。

下一篇实战论会从上而下带咱们学习Android的包体优化高档进阶教程。我是小木箱,咱们下一篇见~

优质技能计划参阅

  • developer.android.com/topic/perfo…
  • developer.android.com/studio/buil…
  • www.guardsquare.com/manual/conf…
  • 包体积优化(上):怎么削减装置包巨细?
  • 包体积优化(下):资源优化的进阶实践
  • 支付宝 App 构建优化解析:Android 包巨细极致紧缩
  • 美团 Android App包减肥优化实践
  • 美团 Android 对 so 体积优化的探究与实践
  • 字节 抖音 Android 包体积优化探究:从 Class 字节码入手精简 Dex 体积
  • 字节 抖音 Android 包体积优化探究:资源二进制格局的极致精简
  • 字节 抖音 Android 包体积优化探究:根据 ReDex 的 Dex 优化落地实践
  • 货拉拉 Android 包体积优化实践
  • 有道词典 Android 客户端包体积优化之路
  • 百度 App Android 包体积优化实践(一)总览
  • 百度 App Android 包体积优化实践(二)Dex 行号优化
  • 百度APP Android包体积优化实践(三)资源优化
  • 得物 App 包体积治理之路
  • Android包体积优化(惯例、进阶、极致)