这篇文章主要为Futurice公司Android开发者总结的经验教训。遵循这些规范可以避免无谓的重复劳动。如果对iOS或Windows Phone平台的开发感兴趣,请查看《iOS开发最佳实践》和《Windows客户端最佳实践》。
欢迎反馈,但请先阅读反馈规范。
摘要
- 使用Gradle和Gradle默认的项目结构
- 将密码和敏感数据放在gradle.properties中
- 不要实现自己的HTTP客户端,使用Volley或者OkHttp库
- 使用Jackson库解析JSON数据
- 由于65K的方法空间限制,避免使用Guava并使用尽可能少的库
- 用Fragment来显示UI
- Activity只用来管理Fragment
- XML也是代码,管理好XML代码
- 使用样式来减少布局XML代码中重复属性
- 将样式写在多个文件中,避免把样式全部写在单一的大文件当中
- 保持colors.xml文件的简短干净,只定义调色板
- 同样也保持dimens.xml简短干净,只定义通用的常量
- 避免深层级的ViewGroup
- 避免客户端处理WebView要显示的内容,并且注意内存泄露
- 使用Robolectric进行单元测试,使用Robotium进行连接设备(UI)的测试
- 使用Genymotion模拟器
- 一直使用ProGuard或者DexGuard
Android SDK
将Android SDK存放在home目录或者其他跟应用开发无关的位置。一些IDE在安装时包含了SDK,这时SDK可能存放在IDE的安装目录下。而这是很不好的做法,特别是当你需要升级(或者重新安装)或更换IDE时。同时也要避免把SDK存放在系统目录下,否则,当普通用户(不是root)使用IDE时就需要获取sudo权限。
编译系统
编译系统首选Gradle。相比于Gradle,Ant更加的局限并且更加繁琐。使用Gradle编译系统可以很简单的做到:
- 将应用编译成不同的版本
- 完成简单的类似脚本的任务
- 管理和下载依赖
- 自定义秘钥仓库
- 其他…
Google正积极的开发安卓Gradle插件,作为新的标准编译系统。
项目结构
主要有两个主流的项目结构:旧的Ant项目结构和Eclipse ADT项目结构,较新的Gradle和Android Studio项目结构。当然选择新的项目结构。如果你的项目正在用旧的项目结构,考虑放弃旧的结构,转移到新的项目结构下吧。
旧项目结构:
1 2 3 4 5 6 7 8 9 10 |
old-structure ├─ assets ├─ libs ├─ res ├─ src │ └─ com/futurice/project ├─ AndroidManifest.xml ├─ build.gradle ├─ project.properties └─ proguard-rules.pro |
新的项目结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
new-structure ├─ library-foobar ├─ app │ ├─ libs │ ├─ src │ │ ├─ androidTest │ │ │ └─ java │ │ │ └─ com/futurice/project │ │ └─ main │ │ ├─ java │ │ │ └─ com/futurice/project │ │ ├─ res │ │ └─ AndroidManifest.xml │ ├─ build.gradle │ └─ proguard-rules.pro ├─ build.gradle └─ settings.gradle |
新旧项目结构最大的不同点是新项目结构更加合理的分开了代码集(main, androidTest)。例如,你可以在代码集src文件夹下添加’paid’和’free’文件夹,分别用于存放付费版应用代码和免费版应用的代码。
顶层app文件夹用于将你的应用和其他库(例如:library-foobar)区分开来。Settings.gradle中保存了app/build.gradle需要用到的库的引用。
Gradle配置
普通项目结构。遵循Google安卓Gradle规范。
简单任务。可以用Gradle完成一些简单任务,而不用特地去写(shell, Python, Perl等)脚本。具体参考Gradle文档。
密码。你需要在build.gradle中配置应用发行版本的签名配置。以下这些情况是需要避免的:
不要这样做。也许你会在版本控制系统中这样做。
1 2 3 4 5 6 7 8 |
signingConfigs { release { storeFile file("myapp.keystore") storePassword "password123" keyAlias "thekey" keyPassword "password789" } } |
换一种方式,新建一个gradle.properties文件,文件内容如下。注意,不要把Gradle.properties添加到版本控制系统中。
KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789
Gradle会自动导入gradle.properties文件,所以你可以在build.gradle中这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
signingConfigs { release { try { storeFile file("myapp.keystore") storePassword KEYSTORE_PASSWORD keyAlias "thekey" keyPassword KEY_PASSWORD } catch (ex) { throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.") } } } |
使用Maven管理项目依赖,而不是直接导入jar文件。如果你显式的导入jar文件到项目中,那这些依赖的jar文件只会是某个固定的版本,例如2.1.1。下载jar文件并管理更新这种方式笨拙不堪,而Maven完全解决了这个问题,并且,Maven可以集成在安卓Gradle编译系统中。你可以指定版本的范围,例如2.2.+,然后Maven就会自动更新到版本范围内的最新版本。例如:
1 2 v>
|