Android开发技术文档.docx

上传人:b****8 文档编号:10023800 上传时间:2023-05-23 格式:DOCX 页数:19 大小:28.71KB
下载 相关 举报
Android开发技术文档.docx_第1页
第1页 / 共19页
Android开发技术文档.docx_第2页
第2页 / 共19页
Android开发技术文档.docx_第3页
第3页 / 共19页
Android开发技术文档.docx_第4页
第4页 / 共19页
Android开发技术文档.docx_第5页
第5页 / 共19页
Android开发技术文档.docx_第6页
第6页 / 共19页
Android开发技术文档.docx_第7页
第7页 / 共19页
Android开发技术文档.docx_第8页
第8页 / 共19页
Android开发技术文档.docx_第9页
第9页 / 共19页
Android开发技术文档.docx_第10页
第10页 / 共19页
Android开发技术文档.docx_第11页
第11页 / 共19页
Android开发技术文档.docx_第12页
第12页 / 共19页
Android开发技术文档.docx_第13页
第13页 / 共19页
Android开发技术文档.docx_第14页
第14页 / 共19页
Android开发技术文档.docx_第15页
第15页 / 共19页
Android开发技术文档.docx_第16页
第16页 / 共19页
Android开发技术文档.docx_第17页
第17页 / 共19页
Android开发技术文档.docx_第18页
第18页 / 共19页
Android开发技术文档.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Android开发技术文档.docx

《Android开发技术文档.docx》由会员分享,可在线阅读,更多相关《Android开发技术文档.docx(19页珍藏版)》请在冰点文库上搜索。

Android开发技术文档.docx

Android开发技术文档

Android开发最佳实践

从Futurice公司Android开发者中学到的经验。

遵循以下准则,避免重复发明轮子。

若您对开发iOS或WindowsPhone有兴趣,请看iOSGoodPractices 和 WindowsclientGoodPractices 这两篇文章。

摘要

∙使用Gradle和它推荐的工程结构

∙把密码和敏感数据放在gradle.properties

∙不要自己写HTTP客户端,使用Volley或OkHttp库

∙使用Jackson库解析JSON数据

∙避免使用Guava同时使用一些类库来避免65kmethodlimit(一个Android程序中最多能执行65536个方法)

∙使用Fragments来呈现UI视图

∙使用Activities只是为了管理Fragments

∙Layout布局是XMLs代码,组织好它们

∙在layoutoutXMLs布局时,使用styles文件来避免使用重复的属性

∙使用多个style文件来避免单一的一个大style文件

∙保持你的colors.xml简短DRY(不要重复自己),只是定义调色板

∙总是使用dimens.xmlDRY(不要重复自己),定义通用常数

∙不要做一个深层次的ViewGroup

∙在使用WebViews时避免在客户端做处理,当心内存泄露

∙使用Robolectric单元测试,Robotium做UI测试

∙使用Genymotion作为你的模拟器

∙总是使用ProGuard和DexGuard混淆来项目

AndroidSDK

将你的AndroidSDK放在你的home目录或其他应用程序无关的位置。

当安装有些包含SDK的IDE的时候,可能会将SDK放在IDE同一目录下,当你需要升级(或重新安装)IDE或更换的IDE时,会非常麻烦。

此外,若果你的IDE是在普通用户,不是在root下运行,还要避免吧SDK放到一下需要sudo权限的系统级别目录下。

构建系统

你的默认编译环境应该是Gradle.Ant有很多限制,也很冗余。

使用Gradle,完成以下工作很方便:

∙构建APP不同版本的变种

∙制作简单类似脚本的任务

∙管理和下载依赖

∙自定义秘钥

∙更多

同时,AndroidGradle插件作为新标准的构建系统正在被Google积极的开发。

工程结构

有两种流行的结构:

老的Ant&EclipseADT工程结构,和新的Gradle&AndroidStudio工程结构,你应该选择新的工程结构,如果你的工程还在使用老的结构,考虑放弃吧,将工程移植到新的结构。

老的结构:

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

主要的区别在于,新的结构明确的分开了'sourcesets'(main,androidTest),Gradle的一个理念。

你可以做到,例如,添加源组‘paid’和‘free’在src中,这将成为您的应用程序的付费和免费的两种模式的源代码。

你的项目引用第三方项目库时(例如,library-foobar),拥有一个顶级包名app从第三方库项目区分你的应用程序是非常有用的。

然后settings.gradle不断引用这些库项目,其中app/build.gradle可以引用。

Gradle配置

常用结构 参考Google'sguideonGradleforAndroid

小任务 除了(shell,Python,Perl,etc)这些脚本语言,你也可以使用Gradle制作任务。

更多信息请参考Gradle'sdocumentation。

密码 在做版本release时你app的 build.gradle你需要定义 signingConfigs.此时你应该避免以下内容:

不要做这个 .这会出现在版本控制中。

signingConfigs{

release{

storeFilefile("myapp.keystore")

storePassword"password123"

keyAlias"thekey"

keyPassword"password789"

}

}

而是,建立一个不加入版本控制系统的gradle.properties文件。

KEYSTORE_PASSWORD=password123

KEY_PASSWORD=password789

那个文件是gradle自动引入的,你可以在buld.gradle文件中使用,例如:

signingConfigs{

release{

try{

storeFilefile("myapp.keystore")

storePasswordKEYSTORE_PASSWORD

keyAlias"thekey"

keyPasswordKEY_PASSWORD

}

catch(ex){

thrownewInvalidUserDataException("YoushoulddefineKEYSTORE_PASSWORDandKEY_PASSWORDingradle.properties.")

}

}

}

使用Maven依赖方案代替使用导入jar包方案 如果在你的项目中你明确使用率jar文件,那么它们可能成为永久的版本,如2.1.1.下载jar包更新他们是很繁琐的,这个问题Maven很好的解决了,这在AndroidGradle构建中也是推荐的方法。

你可以指定版本的一个范围,如2.1.+,然后Maven会自动升级到制定的最新版本,例如:

dependencies{

compile'flix.rxjava:

rxjava-core:

0.19.+'

compile'flix.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.+'

}

IDEsandtexteditors

IDE集成开发环境和文本编辑器

无论使用什么编辑器,一定要构建一个良好的工程结构 编辑器每个人都有自己的选择,让你的编辑器根据工程结构和构建系统运作,那是你自己的责任。

当下首推AndroidStudio,因为他是由谷歌开发,最接近Gradle,默认使用最新的工程结构,已经到beta阶段(目前已经有release1.0了),它就是为Android开发定制的。

你也可以使用EclipseADT ,但是你需要对它进行配置,因为它使用了旧的工程结构和Ant作为构建系统。

你甚至可以使用纯文版编辑器如Vim,SublimeText,或者Emacs。

如果那样的话,你需要使用Gardle和adb命令行。

如果使用Eclipse集成Gradle不适合你,你只是使用命令行构建工程,或迁移到AndroidStudio中来吧。

无论你使用何种开发工具,只要确保Gradle和新的项目结构保持官方的方式构建应用程序,避免你的编辑器配置文件加入到版本控制。

例如,避免加入Ant build.xml文件。

特别如果你改变Ant的配置,不要忘记保持build.gradle是最新和起作用的。

同时,善待其他开发者,不要强制改变他们的开发工具和偏好。

类库

Jackson 是一个将java对象转换成JSON与JSON转化java类的类库。

Gson 是解决这个问题的流行方案,然而我们发现Jackson更高效,因为它支持替代的方法处理JSON:

流、内存树模型,和传统JSON-POJO数据绑定。

不过,请记住,Jsonkson库比起GSON更大,所以根据你的情况选择,你可能选择GSON来避免APP65k个方法限制。

其它选择:

 Json-smart and BoonJSON

网络请求,缓存,图片 执行请求后端服务器,有几种交互的解决方案,你应该考虑实现你自己的网络客户端。

使用 Volley或Retrofit。

Volley同时提供图片缓存类。

若果你选择使用Retrofit,那么考虑使用Picasso 来加载图片和缓存,同时使用OkHttp作为高效的网络请求。

Retrofit,Picasso和OkHttp都是有同一家公司开发(注:

是由Square 公司开发),所以它们能很好的在一起运行。

OkHttp同样可以和Volley在一起使用Volley.

RxJava 是函数式反应性的一个类库,换句话说,能处理异步的事件。

这是一个强大的和有前途的模式,同时也可能会造成混淆,因为它是如此的不同。

我们建议在使用这个库架构整个应用程序之前要谨慎考虑。

有一些项目是使用RxJava完成的,如果你需要帮助可以跟这些人取得联系:

TimoTuominen,OlliSalonen,AndreMedeiros,MarkVoit,AnttiLammi,VeraIzrailit,JuhaRistolainen.我们也写了一些博客:

 [1], [2], [3], [4].

如若你之前有使用过Rx的经历,开始从API响应应用它。

另外,从简单的UI事件处理开始运用,如单击事件或在搜索栏输入事件。

若对你的Rx技术有信心,同时想要将它应用到你的整体架构中,那么请在复杂的部分写好Javadocs文档。

请记住其他不熟悉RxJava的开发人员,可能会非常难理解整个项目。

尽你的的全力帮助他们理解你的代码和Rx。

Retrolambda 是一个在Android和预JDK8平台上的使用Lambda表达式语法的Java类库。

它有助于保持你代码的紧凑性和可读性,特别当你使用如RxJava函数风格编程时。

使用它时先安装JDK8,在AndroidStudio工程结构对话框中把它设置成为SDK路径,同时设置JAVA8_HOME和JAVA7_HOME环境变量,然后在工程根目录下配置build.gradle:

dependencies{

classpath'me.tatarka:

gradle-retrolambda:

2.4.+'

}

同时在每个module的build.gradle中添加

applyplugin:

'retrolambda'

android{

compileOptions{

sourceCompatibilityJavaVersion.VERSION_1_8

targetCompatibilityJavaVersion.VERSION_1_8

}

retrolambda{

jdkSystem.getenv("JAVA8_HOME")

oldJdkSystem.getenv("JAVA7_HOME")

javaVersionJavaVersion.VERSION_1_7

}

AndroidStudio提供Java8lambdas表带是代码提示支持。

如果你对lambdas不熟悉,只需参照以下开始学习吧:

∙任何只包含一个接口的方法都是"lambdafriendly"同时代码可以被折叠成更紧凑的语法

∙如果对参数或类似有疑问,就写一个普通的匿名内部类,然后让AndroidStatus为你生成一个lambda。

当心dex方法数限制,同时避免使用过多的类库 Androidapps,当打包成一个dex文件时,有一个65535个应用方法强硬限制[1] [2] [3]。

当你突破65k限制之后你会看到一个致命错误。

因此,使用一个正常范围的类库文件,同时使用dex-method-counts 工具来决定哪些类库可以再65k限制之下使用,特别的避免使用Guava类库,因为它包含超过13k个方法。

ActivitiesandFragments

Fragments应该作为你实现UI界面默认选择。

你可以重复使用Fragments用户接口来组合成你的应用。

我们强烈推荐使用Fragments而不是activity来呈现UI界面,理由如下:

∙提供多窗格布局解决方案 Fragments的引入主要将手机应用延伸到平板电脑,所以在平板电脑上你可能有A、B两个窗格,但是在手机应用上A、B可能分别充满整个屏幕。

如果你的应用在最初就使用了fragments,那么以后将你的应用适配到其他不同尺寸屏幕就会非常简单。

∙屏幕间数据通信 从一个Activity发送复杂数据(例如Java对象)到另外一个Activity,Android的API并没有提供合适的方法。

不过使用Fragment,你可以使用一个activity实例作为这个activity子fragments的通信通道。

即使这样比Activity与Activity间的通信好,你也想考虑使用EventBus架构,使用如 Otto 或者 greenrobotEventBus作为更简洁的实现。

如果你希望避免添加另外一个类库,RxJava同样可以实现一个EventBus。

∙Fragments一般通用的不只有UI 你可以有一个没有界面的fragment作为Activity提供后台工作。

进一步你可以使用这个特性来创建一个fragment包含改变其它fragment的逻辑 而不是把这个逻辑放在activity中。

∙甚至ActionBar都可以使用内部fragment来管理 你可以选择使用一个没有UI界面的fragment来专门管理ActionBar,或者你可以选择使用在每个Fragment中添加它自己的action来作为父Activity的ActionBar.参考.

很不幸,我们不建议广泛的使用嵌套的fragments,因为有时会引起matryoshkabugs。

我们只有当它有意义(例如,在水平滑动的ViewPager在像屏幕一样fragment中)或者他的确是一个明智的选择的时候才广泛的使用fragment。

在一个架构级别,你的APP应该有一个顶级的activity来包含绝大部分业务相关的fragment。

你也可能还有一些辅助的activity,这些辅助的activity与主activity通信很简单限制在这两种方法 Intent.setData() 或 Intent.setAction()或类似的方法。

Java包结构

Android应用程序在架构上大致是Java中的Model-View-Controller结构。

在Android中Fragment和Activity通常上是控制器类(换句话说,他们是用户接口的部分,同样也是Views视图的部分。

正是因为如此,才很难严格的将fragments(或者activities)严格的划分成控制器controlloers还是视图views。

最还是将它们放在自己单独的 fragments 包中。

只要你遵循之前提到的建议,Activities则可以放在顶级目录下。

若果你规划有2到3个以上的activity,那么还是同样新建一个activities包吧。

然而,这种架构可以看做是另一种形式的MVC,包含要被解析API响应的JSON数据,来填充的POJO的models包中。

和一个views包来包含你的自定义视图、通知、导航视图,widgets等等。

适配器Adapter是在数据和视图之间。

然而他们通常需要通过getView()方法来导出一些视图,所以你可以将adapters包放在views包里面。

一些控制器角色的类是应用程序级别的,同时是接近系统的。

这些类放在managers包下面。

一些繁杂的数据处理类,比如说"DateUtils",放在utils包下面。

与后端交互负责网络处理类,放在network包下面。

总而言之,以最接近用户而不是最接近后端去安排他们。

com.futurice.project

├─network

├─models

├─managers

├─utils

├─fragments

└─views

├─adapters

├─actionbar

├─widgets

└─notifications

资源文件Resources

∙命名 遵循前缀表明类型的习惯,形如type_foo_bar.xml。

例如:

fragment_contact_details.xml,view_primary_button.xml,activity_main.xml.

组织布局文件 若果你不确定如何排版一个布局文件,遵循一下规则可能会有帮助。

∙每一个属性一行,缩进4个空格

∙android:

id 总是作为第一个属性

∙android:

layout_**** 属性在上边

∙style 属性在底部

∙关闭标签/>单独起一行,有助于调整和添加新的属性

∙考虑使用Designtimeattributes设计时布局属性,AndroidStudio已经提供支持,而不是硬编码android:

text (译者注:

墙内也可以参考stormzhang的这篇博客链接)。

xmlversion="1.0"encoding="utf-8"?

>

xmlns:

android="

xmlns:

tools="

android:

layout_width="match_parent"

android:

layout_height="match_parent"

android:

orientation="vertical"

>

android:

id="@+id/name"

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

layout_alignParentRight="true"

android:

text="@string/name"

style="@style/FancyText"

/>

作为一个经验法则,android:

layout_****属性应该在layoutXML中定义,同时其它属性android:

**** 应放在stylerXML中。

此规则也有例外,不过大体工作的很好。

这个思想整体是保持layout属性(positioning,margin,sizing)和content属性在布局文件中,同时将所有的外观细节属性(colors,padding,font)放在style文件中。

例外有以下这些:

∙android:

id 明显应该在layout文件中

∙layout文件中android:

orientation对于一个LinearLayout布局通常更有意义

∙android:

text 由于是定义内容,应该放在layout文件中

∙有时候将android:

layout_width 和 android:

layout_height属性放到一个style中作为一个通用的风格中更有意义,但是默认情况下这些应该放到layout文件中。

使用styles 几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的。

在应用中对于大多数文本内容,最起码你应该有一个通用的style文件,例如:

textSize">@dimen/font_normal

textColor">@color/basic_black

应用到TextView中:

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="@string/price"

style="@style/ContentText"

/>

你或许需要为按钮控件做同样的事情,不要停止在那里。

将一组相关的和重复android:

****的属性放到一个通用的style中。

将一个大的style文件分割成多个文件 你可以有多个styles.xml 文件。

AndroidSDK支持其它文件,styles这个文件名称并没有作用,起作用的是在文件里xml的