• 滴滴Booster移动APP质量优化框架 学习之旅 三


    推荐阅读:

    滴滴Booster移动App质量优化框架-学习之旅 一

    Android 模块Api化演练

    不一样视角的Glide剖析(一)

    滴滴Booster移动App质量优化框架-学习之旅 二对重复资源优化和无用资源优化进行了讨论。这里对不可编译无用assets资源优化进行讨论。

    先看微信Matrix-ApkChecker是怎样检索对无用assets资源。ApkCheckers是针对 android 安装包的分析检测工具,反汇编apk包中dex文件,在内存生产smali相关数据,检索  const-string 指令 line,根据const-string指令 后面字符串常量值 与 assets资源名是否相等,找出usedAssetsResouces,比如:

    //如果 能在assets文件夹booster_demo_1.png
    //则booster_demo_1.png为usedAssetsResources
    const-string v0, "booster_demo_1.png"

    反汇编dex使用了如下两个jar包:

    implementation "org.smali:smali:2.2.7"
    implementation "org.smali:baksmali:2.2.7"

    不过这种方式只能粗略的检索出来,比如使用三方图片加载库,是鉴别不了的,比如使用Glide加载assets中图片:

    val url = "file:///android_asset/booster_demo_1.png" Glide.with(context).load(url).into(holder.image)

    在构建过程中进行无用assets资源优化,需要考虑两点

    1.Hook点 即在哪个Task之后或者之前进行优化

    2.inputFiles(dex、assets) 来源 

    无用assets资源优化,肯定在apk生成之前进行,Hook点就选择在packageDebug/packageRelease task之前

    variant.packageAndroidTask.doFirst{
         ...       
        //unusedAssetsResources优化
        variant.removeUnusedAssetsResources(it.logger,results)
    
        variant.generateReport(results)
    
    }

    使用TaskTreePlugin插件查看packageDebug / packageRelease的task tree,cmdz终端执行如下命令:

    gradlew :app:packageDebug :app:taskTree --task-depth  1 > log-debug.txt

    可以看到packageDebug/packageRelease tasktree如下图:

    打印mergedAssetsTask和dex相关task的outputFiles,如下图:

    如果之前成功地打过包,查看这个两个task的outputFiles下的文件如下:

    现在无用assets资源优化的inputFiles dex和assets都找到了。

    无用assets资源优化实现

     

    步骤如下:

    1.找出assets资源

    2.反汇编dex找出usedAssetsResources

    3根据配置解析出无用assets白名单

    4.根据前三步,得到unusedAssetsResources

    5.删除unusedAssetsResources文件 

    详见:doRemoveUnusedAssetsResources方法

     

    验证:分别在App module assets放入显示如下图片资源:

    集成无用assets资源优化功能,打release包,插件输出报告如下:

    查看release.apk包中assets文件如下:

    运行app,可以成功加载显示assets图片资源。

    本篇文章比较简短,只讨论了无用assets资源优化,大佬们也许觉得写得有些啰嗦,估计一句也可以表述清楚,但我这里重在表述实现的思路过程。没有经过大量测试,仅供参考学习,共同成长。

     

    源码传送门:BoosterStudy

    参考资料:

    官方公众号-Apk 分析减包利器

    如果您对博主的更新内容持续感兴趣,请关注公众号!

  • 相关阅读:
    求字符串长度
    n人围圈报数,报3出圈
    设计模式-桥梁模式(11)
    ajax
    数组右移
    数组元素交换
    倒序输出(指针方法)
    myeclipse6.5使用tomcat7报java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory错
    设计模式-组合模式(10)
    刷评论脚本
  • 原文地址:https://www.cnblogs.com/sihaixuan/p/11075041.html
Copyright © 2020-2023  润新知