-
Android
开发最佳实践
从
Futurice
公司
A
ndroid
开发者中学到的经验。
遵循以下准则,避免重复发明
轮子。若您对开发
iOS
或
Windows Phone
有兴趣,
请看
iOS Good
Practices
和
Windows client
Good Practices
这两篇文章。
摘要
?
?
?
?
?
使用
Gradle
和它推荐的工程结构
把密码和敏感数据放在
ties
不要自己写
HTTP
客户端
,
使用
Volley
或
OkHttp
库
< br>使用
Jackson
库解析
JS
ON
数据
避免使用
< br>Guava
同时使用一些类库来避免
65k
method limit
(一个
Android
程序中最多能执行
65536
个方法)
使用
Fragments
来呈现
UI
视图
使用
Activities
只是为了管理
Fragments
Layout
布局是
XMLs
代码,组织好它们
在
layoutout XMLs
布局
时,使用
styles
文件来避免使用重复的属性
使用多个
style
文件
来避免单一的一个大
style
文件
保持你的
简短
DRY(
不要重复自己
)
,只是定义
调色板
总是使用
DRY(
不要重复自己
)
,定义通用常数
不要做一个深层次的
ViewGroup
在使用
WebViews
时避免在客户端做处理
,当心内存泄露
使用
Robolec
tric
单元测试,
Robotium
做
UI
测试
使用
Genymotion
作为你的模拟器
总是使用
ProGuard
和
DexGuard
混淆来项目
?
?
?
?
?
?
?
?
?
?
?
?
Android SDK
将你的
Android SDK
放在你
的
home
目录或其他应用程序无关的位置。
< br>
当安装
有些包含
SDK
的
IDE
的时候,可能会将
< br>SDK
放在
IDE
同一目录下,
当你需要
升级(或重新安装)
IDE
或
更换的
IDE
时,会非常麻烦。
p>
此外,若果你的
IDE
是在普通用户,不是
在
root
下运行,还要避免吧
SDK
放到一下需要
sudo
权限
的系统级别目录下。
构建系统
你的默认编译环境应该是<
/p>
Gradle
. Ant
有很多限制,
也很冗余。使用
Gradle
,
完成以
下工作很方便:
?
?
?
?
?
p>
构建
APP
不同版本的变种
制作简单类似脚本的任务
管理和下载依赖
自定义秘钥
更多
同时,
Android
Gradle
插件作为新标准的构建系统正在被
Google
积极的开发。
工程结构
有两种流行的结构:老的
Ant & Eclipse ADT
工程结构,和新的
Gradle &
Android Studio
工程结构,
你应该选择新的工程结构
,如果你的工程还在使用
老的结构,考虑放弃吧,将工程移植到新的结构。
老的结构
:
old-
structure
├─ assets
├─ libs
├─
res
├─ src
│ └─ com/futurice/project
├─
├─
├─ ties
└─ proguard
-
新的结构
new-
structure
├─ library
-foobar
├─ app
│ ├─
libs
│ ├─ src
│ │ ├─ androidTest
│ │ │ └─ java
│ │ │ └─
com/futurice/project
│ │
└─ main
│ │ ├─
java
│ │
│ └─ com/futurice/project
│ │ ├─ res
│
│ └─
│ ├─
│ └─ proguard
-
├─
└─
主要的区别在于,新的结构明确的分开了
'source
sets' (
main
,
andro
idTest
)
,
Gradle
的一个理念。
你可以做到,例如,添加源组
‘paid’
和
‘free’
在
src
中,这
将成为
您的应用程序的付费和免费的两种模式的源代码。
你的项目引用第三方项目库时(例如,
library-foo
bar
),拥有一个顶级包名
app
从
第三方库项目区分你的应用程序是非常有用的。
然后
不断
引用这些库项目,其中
app/
可以引用。
Gradle
配置
常用结构
参考
Google's guide on Gradle
for Android
小任务
除了
(shell, Python, Perl,
etc)
这些脚本语言,你也可以使用
Gradle
制作
任务。
更多信息请参考
Gradle's
documentation
。
密码
在做版本
release
时你
app
的
你需要定义
p>
signingConfigs
.
此
时你应该避免以下内容:
不要做这个
.
这会出现在版本控制中。
signingConfigs {
release
{
store(
)
storePassword
keyAlias
keyPassword
}
}
而是,建立一个不加入版本控制系统的
ties
文件。
KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789
那个文
件是
gradle
自动引入的,你可以在
文件中使用,例如:
signingConfigs {
release
{
try
{
store(
)
storePassword
KEYSTORE_PASSWORD
keyAlias
keyPassword
KEY_PASSWORD
}
catch
(ex) {
throw
new
InvalidUserDa
taException
(
KEYST
ORE_PASSWORD and KEY_PASSWORD in ties.
)
}
}
}
使用
Maven
依赖方案代替使用
导入
jar
包方案
如果在你的项目中你明确使用
率
ja
r
文件,那么它们可能成为永久的版本,如
2.1.1
.
下载
jar
包更新他
们是很
繁琐的,
这个问题
Maven
很好的解决了,这在
Android
Gradle
构建中也是推
荐的方法。你可
以指定版本的一个范围,如
2.1.+
< br>,
然后
Maven
会自动升级到
制
定的最新版本,例如:
dependencies {
compile
':rxjava-core:0.19.+'
compile
':rxjava-
android:0.19.+'
compile
':jackson-databind:2.4.+'
compile
':jackson-
core:2.4.+'
compile
':jackson-annotations:2.4.+'
compile
':okhttp:2.0.+'
compile
':okhttp-
urlconnection:2.0.+'
}
IDEs and text editors
IDE
集成开发环境和文本编辑器
无论使用什么编辑器,一定要构建一个良好的工程结构
编辑器每个人都有自己
的
选择,让你的编辑器根据工程结构和构建系统运作,那是你自己的责任。
当下首推
Android Studio
,
因为他是由谷歌开发,最接近
Gradle
,默认使用最新
的工程结构,已经到
beta
阶段
(目前已经有
release 1.0
了),它就是为
Android
开发定制的。
< br>
你也可以使用
Eclipse
ADT
,但是你需要对它进行配置,因为它使用了旧的工
p>
程结构
和
Ant
作为构建系统。你甚至可以使用纯文版编辑器如
Vim
,
Sublime
Text
< br>,或者
Emacs
。如果那样的话,你需要使用
Gardle
和
adb
命令行。如果使
用
Eclipse
集成
Gradle
不适合你,你只是使用命令行构建工程,或迁移
到
Android
Studio
中来吧。
无论你使用何
种开发工具,只要确保
Gradle
和新的项目结构保持官方的
方式构
建应用程序,避免你的编辑器配置文件加入到版本控制。例如,避免加入
Ant
文件。
p>
特别如果你改变
Ant
的配置,不要忘记保
持
是最新和起作用的。同时,善待其他开发者,不要强制改变他
们的开发工具和
偏好。
类库
Jackson
是一个将
java
对象转换成
JSON
与
JSON
转化
java
类的类库。
Gson
是解决这个问题的流行方案,然而我们发现
Jackson
更高
效
,
因为它支持
替代的方法处理
JSON:
流、内存树模型
,
和传统
JSON-
POJO
数据绑定。不过,
请记住,
Jsonkson
库比起
GSON
更大
,所以根据你的情况选择,你可能选择
GSON
来避免
APP 65k
个方法限制。其它选择
:
Json-smart
and
Boon JSON
网络请求,缓存,图片
执行请求后端
服务器,有几种交互的解决方案,你应该
考虑实现你自己的网络客户端。使用
Volley
或
Ret
rofit
。
Volley
同时提供
图片
缓存类。若果你选择使用
Retrofit,
那么考虑使用
Picasso
来加载图片和缓存,
同时使用
OkHttp
作为高效的网络请求。
Retrofit
,
Picasso
和
OkHttp
< br>都是有同
一家公司开发(注:
是由
Square
公司开发),所以它们能很好的在一起运行。
OkHttp <
/p>
同样可以和
Volley
在一起使用
p>
Volley
.
RxJava
是函数式反应性的一个类库,换句话说,能处理异步的事件。
这是一
个强大的和有前途的模式,同时也可能会造成混淆,因为
它是如此的不同。
我
们建议在使用这
个库架构整个应用程序之前要谨慎考虑。
有一些项目是使用<
/p>
RxJava
完成的,如果你需要帮助可以跟这些人取得联系:<
/p>
Timo Tuominen,
Olli Salonen,
Andre Medeiros, Mark Voit, Antti Lammi, Vera
Izrailit, Juha
Ristolainen.
我们也写了一些博客:
[1]
,
[2]
,
[3]
,
[4]
.
如若你之前有使用过
Rx
的经历,开始从
API
< br>响应应用它。
另外,从简单的
UI
事件处理开始运用,如单击事件或在搜索栏输入事件。
<
/p>
若对你的
Rx
技术有信
< br>心,同时想要将它应用到你的整体架构中,那么请在复杂的部分写好
Javado
cs
文档。
请记住其他不熟悉
RxJava
的开发人员,可能会非常难理解整个项目。
尽你的的全力帮助他们理解你的代码和
Rx
。
Retrolambda
是一个在<
/p>
Android
和预
JDK8
平台上的使用
Lambda
表达式语法
的
Java
类库。
p>
它有助于保持你代码的紧凑性和可读性,特别当你使用如
RxJav
a
函数风格编程时。
使用它时先安装
JDK8
,在
Android Stu
dio
工程结构
对话框中把它设置成为
SDK
路径,同时设置
JAVA8_HOME
< br>和
JAVA7_HOME
环境变
量,
然后在工程根目录下配置
:
dependencies {
classpath
'a:gradle-
retrolambda:2.4.+'
}
同时在每个
module
的
中添加
apply
plugin
:
'retrolambda'
android {
compileOptions
{
sourceCompatibility
Ja
vaVersion.
VERSION_1_8
targetCompatibility
Java
Version.
VERSION_1_8
}
retrolambda {
jdk
System.
ge
tenv(
)
oldJdk
System.
getenv(
)
javaVersion
Ja
vaVersion.
VERSION_1_7
}
Android Studio
提供
Java8 lambdas
表带
是代码提示支持。如果你对
lambdas
不熟悉,只需参照以
下开始学习吧:
?
任何只包含一个接口的方法都是
同时代码可以被折叠成
更紧凑的语法
如果对参数或类似有疑
问,就写一个普通的匿名内部类,然后让
Android Status
为你生成一个
lambda
。
?
当心
de
x
方法数限制,同时避免使用过多的类库
Android a
pps
,当打包成一个
dex
文件时,
有一个
65535
个应用方法强硬限制
[1]
[2]
[3]
。
当
你突破
65k
限制
之后你会看到一个致
命错误。因此,使用一个正常范围的类库文件,同时使用
dex-method-
counts
工具来决定哪些类库可以再
65k
限制之下使用,特别的避
免使用
Guava
类库,因为它包含超过
13k
< br>个方法。
Activities and
Fragments
Fragments
应该作为你实现
p>
UI
界面默认选择。你可以重复使用
Fra
gments
用
户接口来
组合成你的应用。我们强烈推荐使用
Fragments
< br>而不是
activity
来呈
现
UI
界面,理由如下:
?
提供多窗格布局解决方案
Fragments
的引入主要将手机应用延伸到平板
电脑,所以在平板电脑上你可能有
A
、
B
两个窗格,但是
在手机应用上
A
、
B
< br>可能分别充满
整个屏幕。如果你的应用在最初就使用了
fragments
,
那么以后将你的
应用适配到其他不同尺寸屏幕就会非常简单。
?
屏幕间数据通信
从一个
Activity
发送复杂数据
(
< br>例如
Java
对象
)
到另外一
个
Activity
,
Android
的
API
并没有提供合适的方法。不过使用
Fragment
< br>,你可以使用
一个
activ
ity
实例作为这个
activity
子
fragments
的通信通道。即使这样比
Activity
与
Activity
间的通信好,你也想考虑使
用
Event
Bus
架构,使用如
Otto
或者
greenrobot
EventBus
作为更简洁
的实现。
如果你希望避免添加另外一个类库,
RxJava
同样可以实现一
个
Event
Bus
。
?
Fragments
一般通用的不只有
UI
你可以有一个没有界面的
fragment
作
为
Activity
提供后台工作。
进一步你可以使用这个特性来创建一个
fragment
p>
包含改变其它
fragment
的逻辑
p>
而不是把这个逻辑放在
activity
中。
?
甚至
ActionBar
都可以使用
内部
fragment
来管理
你可以选择使用一个
没有
UI
界面的
fragment
来专门管理
< br>ActionBar,
或者你可以选择使用在
每个
Fragment
中
添加它自己的
action
来作为父
Activity
的
ActionBa
r.
参考
.
很不幸,我们不建议广泛
的使用嵌套的
fragments
,因为
有时会引起
matryoshka bugs
。我们只有当它有意义
(
例如,在水平滑动的
ViewPager
在
像
屏幕一样
fragment
中<
/p>
)
或者他的确是一个明智的选择的时候才广泛的使用
fragment
。
在一
个架构级别,你的
APP
应该有一个顶级的
activity
来包含绝大部分业务相
关的
fragment
。你也可能还有一些辅助的
act
ivity
,这些辅助的
activity
< br>与主
activity
通信很简单限制在这两种方法
a()
或
ion()
或类似的方法。
Java
包结构
Android
应用程序在架构上大致是
Java
中的
Model-View-
Controller
结构。
在
Android
中
Fragment
和
Activity
通常上是控制器类
().
换句话说,他们是用户接
口的部分,同样也是
Views
视图的部分。
正是因为如此,才很难严格的将
fragments
(
或者
activities)
严格的划分成
控制
< br>器
controlloers
还是视图
< br>
views
。
最还是将它们放在自己单独的
fragments
包中。
只要你遵循之前提到的建议,
Activities
则可以放在顶级目录下。
若果你规划
有
2
到
3
个以
上的
activity
,那么还是同样新建一个
activities
包吧。
然而,这种架构可以看做是另一种形式的
MVC
,
包含要被解析
API
响
应的
JSON
数据,来填充的
POJO
的
models
包中。
和一个
views
包来包含
你的自定
义视图、通知、导航视图,
widgets
等等。
适配器
Adap
ter
是在数据和视图之
间。然而他们通常需要通过
getView()
方法来导出一些视图,
p>
所以你可以将
adapters
包放在
p>
views
包里面。
一些控制器角色的类是应用程序级别的,同时是接近系统的。
这些类放在
managers
包下面。
一些繁杂的数据处理类,比如说
p>
放在
utils
包下
面。
与后端交互负责网络处理类,放在
network
包下面。
总而言之,以最接近用户而不是最接近后端去安排他们。
t
-
-
-
-
-
-
-
-
-
上一篇:微透析技术探针回收率的影响因素研究进展
下一篇:最新细菌名称中英文