Android APK瘦身之Android Studio Lint

fz_fish 7年前
   <h3><strong>第一部分: 瘦身内容介绍</strong></h3>    <p>项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此公司决定做一次Android APK的资源瘦身.</p>    <p>这次瘦身使用的是 Lint审查工具 , 用Android Studio的Generate Signed APK打包, 瘦身前APK为17.3M, 瘦身后为15.7M. 瘦身结果为APK大小减少了1.6M(9.x%)</p>    <p>1. 完全相同的一张图片, 在项目中存在多份(不同的开发人员从UI资源文件夹里复制出来, 修改为不同的名字, 引入工程)</p>    <p>2. 版本多次迭代后, 许多XML文件已经不再使用了(包括布局文件, 自定义图形文件, 动画文件, 颜色文件, 字符文件strings.xml, 单位文件dimens.xml等).</p>    <p>3. 由于功能的迭代, 有些Activity, Fragment已经无效(好像 Android Studio Lint无法查处这一类的无效资源 )</p>    <h3><strong>第二部分: 瘦身工具介绍</strong></h3>    <p>1. 使用的是Android Studio工具做代码审查( Inspect Code功能 ), 实际上使用到的是其中 Android Lint 部分</p>    <p>2. Inspect Code配置(可以 单独选择Module ‘app’ 部分, 个人感觉library部分审查的意义不大. 不过为了方便, 我还是选择了 Whole project. .. 不过这样的结果就是, 同事的红点键盘电脑还没有Inspect完… 我已经把150多个无效资源全部处理完了… 所以还是 自行决定是否Fire The Whole吧 …)</p>    <h3><strong>第三部分: Android Studio Inspect Code 结果简介</strong></h3>    <p>zzzZZZ(Inspecting…)</p>    <p>1. 既然是瘦身, 那无效资源引用就是头等重要的事了. 个人觉得这部分都在 Inpsection模块的Android Lint 视图里面了.</p>    <p>首先, 在Inspection模块里找到Android Lint</p>    <p>然后, 在Inspection模块的Android Lint里向下滑动找到 Ununsed resources</p>    <p>来, 看一下Unused recources展开后的样子(对不起, 重复图片, 无效xml文件, 无效的strings.xml和dimens.xml都已经处理完了)…</p>    <p>( 说一下一个我自己的 处理”技巧” 吧, 对于无效的xml文件, 要删除起来其实还比较麻烦, 因为Android Studio在xml页面好像没有删除按钮??? 我是这么做的:</p>    <p>在Inspect Code 的Android List结果展示区, 双击对应的xml无效提示(例如: The resource ‘R.dimen.spacing_0_5′ appears to be unused这一个item),</p>    <p>进入对应的xml文件后, 把所有内容删除… 不要怕… 错了git可以恢复的…</p>    <p>当你删除的手酸的时候或者内心惶恐不安的时候, 在Android Studio里Clean一下工程[不懂的谷歌搜索: Android Studio Clean 工程...]</p>    <p>之后在Android Studio工程里遍历所有的xml文件, 对于没有内容的xml文件, Android Studio会用红色的波浪线提示, 然后选中所有需要删除的xml文件, 一次性删除… 建议带上引用审查)</p>    <p>安全删除之引用审查</p>    <p>( 说一下一个坑吧 … 事情的起因是这样的: android.content.res.Resources$NotFoundException</p>    <p>Android Lint信誓旦旦的说, R.dimen.spacing_0_5是没用的(实际上他的名字是R.dimen.spacing_0.5…) 后删之, 保留了values-1280×720目录下diemns.xml里的R.dimen.spacing_0.5定义…</p>    <p>这样看起来应该出现在分辨率为1280×720的HTC D816V完美不崩溃而其他分辨率可能崩溃的情况… 然而HTC D816V表示不服, 打开APP后崩溃,遂伙同Android Studio提示单身程序狗: Caused by: android.content.res.Resources$NotFoundException: File res/drawable/common_btn_grayf10.xml from drawable resource ID #0x7f0a0018</p>    <p>我找了一下, common_btn_grayf10.xml确实存在… HTC你”眼瞎”是不是!!! 还是Android Studio聪明, 在xml预览图里无预览, 但是提示spacing_0.5 not in right format… 于是将spacing_0.5修改为spacing_1, 错误提示不记得在不在了, 但是程序依旧崩溃… 查了很久后, 尝试将spacing_0.5也放到values/dimens.xml里试试… 结果崩溃问题解决…</p>    <p>总结: 在做适配的时候, 一定要保证values/dimens.xml文件是最大而全的 .就是说values/dimens.xml = values-aaxbb U values-ccxdd U etc… 这里U是离散数学里的取并集的意思(打我吧… 很罗嗦对不对)</p>    <p>)</p>    <p>2. 实际上Android Studio的Inspect Code还蛮强大的, 会帮你审查无效的LinearLayout, xml布局里View过多, onDraw()函数中分配内存这一类的效率问题. 举一个 Code style的例子 (实在无语了有没有!)</p>    <p>代码里是这么写的:</p>    <p>Intent intent = getIntent();</p>    <p>if (null != intent) {</p>    <p>goToMainPageFlag = intent.getBooleanExtra(KEY_GO_TO_MAIN_PAGE_FLAG, false);</p>    <p>} else {</p>    <p>goToMainPageFlag = false;</p>    <p>}</p>    <p>Inspect Code提示:</p>    <p>就是说, Android Studio的Inspect Code告诉你, 你的代码一点都不优雅… 应该改成酱:</p>    <p>Intent intent = getIntent();</p>    <p>goToMainPageFlag = (null != intent && intent.getBooleanExtra(KEY_GO_TO_MAIN_PAGE_FLAG, false));</p>    <p>结论: 把六行的代码改成两行, 确实是一个很好的Code Style实践有没有! 是的, Android Studio的Inspect Code功能我也是第一次用, 里面东西实在太多了, 大大小小事无巨细的, 没事儿多看看长长见识也是极好的… 虽然有时候你可能不能在短时间内一下子把所有选项优化完, 不过多看才会有优化的意识, 在之后的Code实践里就会逐渐的靠近最佳实践. (完)</p>    <p> </p>    <p>来自:http://www.androidchina.net/5577.html</p>    <p> </p>