Best Practices for Android Developer Productivity
软件工程师的工作效率不仅依赖于知识的掌握程度与经验,也会依赖于你选择的工具集合、合适的环境配置以及团队内的合作技巧。本文即是作者在Droidcon Berlin上演讲的总结。
看穿你的AndroidManifest
众所周知,我们开发时候在文本编辑器中看到的AndroidManifest.xml
并非最终打包到应用中的AndroidManifest.xml
文件。在打包时,编译器会自动地将你所使用的第三方依赖库中的譬如<uses-permission/>
这些元素从它们自己的AndroidManifest.xml
文件中声明,关于这部分的详细说明可以参考这里。AndroidManifest.xml
文件,该文件中会包含项目依赖中声明的构建类型、变量等等信息。
好好使用Support Annotations
另一个非常有用的工具就是com.android.support:support-annotations:23.4.0
依赖,然后可以在代码中添加元注释来辅助很快地
快速的Code Review
- 暂存本分支的更改
- 检出待
Review 的分支 - 在
IDE 中重载gradle 配置文件 - 在
IDE 中浏览代码 - 编译、运行与测试应用
- 切换分支并且重复以上步骤
上述流程很规范很正常,不过当你的项目拥有
修改的热加载
笔者在
- https://developer.android.com/studio/run/index.html#instant-run
- Reto Meier: “Instant Run: How Does it Work?!”
- Oleg Selajev: “Looking at JRebel for Android and Instant Run …”
两个工具都正处在不断的开发与完善中,从我们的经验来看,目前还有很多的用户场景并没有被涉及到,因此我们也相信未来这两个工具的提升空间令人期待。
性能分析与执行效率估测
另一个应用调试与性能分析中常需的用户特性是对于方法的输入输出与执行时间的日志记录,作者在这方面是使用了
@DebugLog
public String getName(String first, String last) {/* ... */}
然后在控制台中我们可以看到如下的信息
V/Example: --> getName(first="Jake", last="Wharton")
V/Example: <-- getName [16ms] = "Jake Wharton"
读取设备中的日志输出
我们在开发过程中经常会使用
- 我们必须使用额外的工具来对日志记录进行格式化
Android Studio 的调试工具是附着到应用的进程ID 上,一旦我们重新部署应用或者杀掉了进程,之前打印出来的日志就会被覆盖掉
作者在这里推荐的是
- 更友好的配色与格式化
- 根据包名来获取调试信息,即使重新部署应用也不会删除之前的日志记录
网络调试与分析
应用开发中我们也常常需要通过查看
- 如果你在开发过程中全程保持网络的日志输出,会大大影响应用的运行性能,毕竟需要一些时间来输出日志
- 如果你的应用使用的其他依赖库需要进行网络通信,譬如
Google Analytics 这样的分析工具,我们需要进行额外的配置来过滤掉这些扰乱的信息 - 在生产环境下无法监测到网络通信信息
这边作者首先建议的方法是使用类似于Charles Proxy这样的
HTTP/HTTPS 的流量监控与记录- 重定义某些特定情况下的服务端返回信息
- 设置部分网络调用的断点
- 为设备安装合适的
SSL 证书来阅读加密的流量
另一个推荐的工具就是Facebook Stetho,它允许开发者在生产环境下获取网络交互数据,不过我们在开发中肯定也是可以使用该工具,不过作者发现好像它还不能读取基于
多版本测试
在应用开发过程中,作者建议务必要在
UI 自动化测试
有些用户场景下我们需要在不同的设备中进行重复的adb
命令来模拟用户点击输入,譬如
build.gradle 配置检测
即使是有经验的开发者也往往会使用些过时的配置方案,作者建议根据如下顺序来检查下你的
- 使用
jcenter 来替换mavenCentral ,jcenter 的响应速度比mavenCentral 好。 - 检测
Android Plugin for Gradle 的版本号,使用最新版本的依赖有助于提高编译速度。 - 不要使用范围来定义依赖的版本号,而使用 “23.4.0” 这样固定的版本号来避免不确定的依赖中的
API 的变化。