Android项目的优化(清理篇)
接手二手项目是一件非常痛苦的事情,更别说是流转了四手五手,且还为了项目进度而直接引入其他部门的代码、模块的项目,更更麻烦的是在AS中还依赖了Eclipse的模块。
项目最近的发布版本大小有47.6M

项目共使用了个17Module,不包括注释了的5个Module,总共有22个Module

在没修改逻辑的前提下,清理后apk大小为40.4M

下面就记录下清理的逻辑
分支
为不影响正常的开发工作和清理所带来的不确定隐患,清理的工作还是另开一分支将风险降为0比较保险。
目前所处develop分支

新建分支clean2

将gradle修改下

清理工作到一半,测试提了个bug,切回develop分支修改

结果在clean2分支修改的代码被带到了develop分支,创建分支的目的就是要将修改操作分离,现在却起了反作用。
常用AS的git插件的话可能对stash比较陌生,问题出现时我也很懵,多亏同事指点

git常用的提交操作有:commit提交本地仓库、push提交本地仓库到远程仓库,还有一种stash。
commit是将小修改提交本地仓库,多次commit后一个功能完成了,此时将多次commit合成的功能push到远程仓库,多次push后一个版本就出来了。
当我的修改做到一半导致整体不能运行,且非切换分支不可的情况,如我上述遇到的,代码删了大半但有紧急bug需要修改,commit的话不合适,直接切换分支又会将修改的代码带入到develop分支内,此时就需要将clean2分支内的修改用stash的方式缓存


Create Stash 后代码回到了修改前的状态,不要担心你的修改还在的。

切到develop这次修改没有被带过来,安心的修改bug,commit,push

bug告一段落,回到clean2分支继续清理代码,需要将之前缓存的修改放出来

找到存放的stash

若不勾选Pop stash,则缓存的修改应用在代码上,且缓存的修改还缓存着。pop后则修改应用在代码上,缓存的修改被删除。

之前的修改又回来了。
但develop分支修改的bug需要同步过来
通过工具栏按钮

报错了

通过菜单项

需要选择分支

为什么呢?
分支clean2没有关联其他分支,属于单独分支何来的pull

按提示操作

但是我们要从develop分支pull下来,所以要修改下命令
git branch --set-upstream-to origin/develop clean2
这时再看看

pull下试试

出现这种问题的原因是创建分支的时候没有指定,新分支的上一个节点,安全的操作是这种

这种方式新建的分支就会有上一个节点。
至于pull和stash孰先孰后的问题都是可以的,当出现冲突就需要手动解决了。
Code Cleanup
终于可以安心的清理代码了,第一步

主要用于整理代码中不规范的书写

跑一遍程序,commit,小心一点总没错
Optimize Import
第二步,删除多余import

如当前打开某文件则执行文件操作,没有打开则是整个项目

跑一遍程序,commit,小心一点总没错
Reformat Code
第三步,格式化代码

跑一遍程序,commit,小心一点总没错
Unused Resources
第四步,删除无用的资源文件



跑一遍程序,commit,小心一点总没错
看看出错了吧!!!!!!
删除未使用的资源文件,并没有那么智能,我遇到两个问题:
1、项目中和Kotlin相关的布局文件,所有的控件id被删除。由于Kotlin Extensions插件的原因,控件id并没有被显式引用,所以AS误以为控件id为无用资源
2、menu文件被删除,代码中引用了menu文件中的id但没有引用menu文件导致文件被删除
当明显知道删除错了,还要手动还原回去
Gradle
作为Android构建工具的Gradle,也可以设置打包时资源文件的压缩。

将false修改为true,打包是就不会将使用不到的资源文件打入包内。与此同时,还会将代码混淆预防反编译。
运行时的APP为debug模式,所以打包测试下
又出错了!!!!
由于第四步,删除无用的资源时,导致一string.xml文件内容被删除,打包时发现此文件为空报错,确认文件无用时将文件删除即可。
打包成功,将apk放入手机运行。
又出错了!!!!
出错信息没在代码内,但有一个重点信息ClassLoader找不到类,定位原因在混淆规则上,看看具体找不到那个类,第三方的话很好解决找找官网的混淆规则。但但但但但我们公司买了**公司的订制服务SaaS,坑爹了,找了半天终于找到一行的混淆规则。
到此只是对项目进行了最简单的清理,代码逻辑啊!无用的Activity、Fragment是没有被清理掉的,路还很长。