——欢迎转载,请注明出处 http://blog.csdn.net/asce1885
,未经本人同意请勿用于商业用途,谢谢——
原文链接:https://github.com/futurice/android-best-practices
本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重复制造轮子。如果你对iOS或者Windows Phone开发感兴趣,那么也请看看iOS最佳实践
和Windows客户端开发最佳实践
。
概要
**使用Gradle和推荐的工程结构
**
**把密码和敏感数据存放在gradle.properties文件中
**
**不要自己实现HTTP客户端,要使用Volley或者OkHttp库
**
**使用Jackson库来解析JSON数据
**
**避免使用Guava,使用少量的函数库从而避免超出65k方法数限制
**
**使用Fragments来表示UI界面
**
**Activities只用来管理Fragments
**
**布局XML文件是代码,要组织好它们
**
**使用样式文件来避免布局XML文件中属性的重复定义
**
**使用多个样式文件避免单一大样式文件的使用
**
**保持colors.xml文件简短和不重复,只定义颜色值
**
**保持dimens.xml文件不重复,并只定义通用的常量
**
**避免ViewGroups层次结构太深
**
**避免在客户端侧处理WebViews,谨防内存泄漏
**
**使用Robolectric作为单元测试的工具,Robotium作为UI测试的工具
**
**使用Genymotion作为你的模拟器
**
总是使用ProGuard或者DexGuard
**Android SDK
**
把你的Android SDK目录放在电脑的主目录或者其他跟IDE安装目录独立的磁盘位置,某些IDE在安装时就包含了Android SDK,而且可能把它放在跟IDE相同的目录下。当你需要升级(或重新安装)IDE,或者更换IDE时,这种做法是不好的。同样要避免把Android SDK放在另外一个系统层级的目录中,这样当你的IDE在user模式下运行而不是root模式时,将需要sudo权限。
**构建系统
**
你的默认选择应该是Gradle。相比之下,Ant限制更大而且使用起来更繁琐。使用Gradle可以很简单的实现:
1)将你的app编译成不同的版本;
2)实现简单的类似脚本的任务;
3)管理和下载第三方依赖项;
4)自定义密钥库;
5)其他
Google也在积极的开发Android的Gradle插件,以此作为新的标准编译系统。
**工程结构
**
目前有两个流行的选择:以前的Ant和Eclipse ADT工程结构,以及新的Gradle和Android Studio工程结构。你应该选择新的工程结构,如果你的工程还在使用旧的结构,那么应该立即开始将它迁移到新的结构上面来。
旧的工程结构如下所示:
old-structure
├─ assets
├─ libs
├─ res
├─ src
│ └─ com/futurice/project
├─ AndroidManifest.xml
├─ build.gradle
├─ project.properties
└─ proguard-rules.pro
新的工程结构如下所示:
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),这是从Gradle引入的概念。例如,你可以在源码目录src中添加paid和free两个子目录,分别用来存放付费版和免费版app的源码。
顶层的app目录有助于把你的app和工程中会引用到的其他库工程(例如library-foobar)区分开。settings.gradle文件中记录了这些库工程的引用,这样app/build.gradle就能够引用到了。
**Gradle配置**
一般结构:参见[Google的安卓Gradle指南](http://tools.android.com/tech-docs/new-build-system/user-guide)。
小任务:在Gradle中,我们使用tasks而不是脚本(shell,Python,Perl等使用脚本),详细的内容可参见[Gradle文档](http://gradle.org/docs/current/userguide/userguide_single.html#N10CBF)。
密码:发布release版本时,你需要在app目录下面的build.gradle文件中定义signingConfigs字段,下面这个配置会出现在版本控制系统中,这是你应该避免的:
signingConfigs {
release {
storeFile file("myapp.keystore")
storePassword "password123"
keyAlias "thekey"
keyPassword "password789"
}
}
你应用创建一个gradle.properties文件,该文件不要添加到版本控制系统中,并设置如下:
KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789
gradle会自动导入这个文件,现在你可以在build.gradle中这样使用:
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文件,它们会是特定的不可变的版本,例如2.1.1。下载jar包并手动更新是很麻烦的,而这个问题Maven正好帮我们解决了,在Android Gradle构建中也建议这么做。你可以指定某个版本范围的jar包,例如2.1.+,这样Maven会帮我们自动更新和这个版本模式匹配的后续升级。例子如下:
dependencies {
compile 'com.netflix.rxjava:rxjava-core:0.19.+'
compile 'com.netflix.rxjava:rxjava-android:0.19.+'
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+'
compile 'com.squareup.okhttp:okhttp:2.0.+'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+'
}
**IDE和文本编辑器**
使用任何保持良好工程结构的代码编辑器。代码编辑器是个人喜好的选择,你需要做的是保证你所用的编辑器能够和工程结构以及构建系统良好集成。
当下最受推崇的IDE是Android Studio,因为它是Google开发的,和Gradle耦合最好,默认使用最新的工程结构,已经处于稳定阶段,是为Android开发量身定做的IDE。