吉游网提供最新游戏下载和手游攻略!

Android开发最佳实践手册是整个互联网上唯一的一本。被知名大公司所使用。建议收藏起来。

发布时间:2024-09-03浏览:27

本篇文章给大家谈谈Android开发最佳实践手册是整个互联网上唯一的一本。被知名大公司所使用。建议收藏起来。,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

安卓SDK

构建系统

项目概要

等级配置

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

类库

活动与片段

Java包结构

测试框架

模拟器

混淆配置

前言

概括

使用Gradle 及其推荐的项目结构

将密码和敏感数据放入gradle.properties中

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

使用Jackson 库解析JSON 数据

避免使用Guava并使用一些类库来避免65k方法的限制(Android程序中最多可以执行65536个方法)

使用Fragments 呈现UI 视图

仅使用Activity 来管理Fragment

布局布局是XML代码,组织好它们

布局XML 时,使用样式文件以避免使用重复的属性

使用多个样式文件以避免单个大样式文件

保持color.xml 简短且干燥(不要重复自己),只需定义调色板

始终使用dimens.xml DRY(不要重复自己),定义通用常量

不要制作很深的ViewGroup

使用WebView时避免在客户端进行处理并注意内存泄漏

使用Robolectric 单元测试和Robotium 进行UI 测试

使用Genymotion 作为模拟器

始终对项目使用ProGuard 和DexGuard 混淆

安卓SDK

将Android SDK 放置在主目录或其他独立于应用程序的位置。在安装一些包含SDK的IDE时,SDK可能会和IDE放在同一个目录下,当你需要升级(或重新安装)IDE或更换IDE时,这会很麻烦。此外,如果您的IDE 以普通用户而非root 身份运行,请避免将SDK 放置在需要sudo 权限的系统级目录中。

构建系统

您的默认编译环境应该是Gradle。 Ant有很多限制并且非常多余。使用Gradle,可以方便地完成以下任务:

构建不同版本应用程序的变体

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

管理和下载依赖项

自定义按键

更多的

与此同时,Google 正在积极开发Android Gradle 插件作为新的标准构建系统。

项目概要

有两种流行的结构:旧的Ant Eclipse ADT 项目结构和新的Gradle Android Studio 项目结构。您应该选择新的项目结构。如果您的项目仍在使用旧的结构,请考虑放弃并移植该项目。到新的结构。

旧结构

新结构

主要区别是:

新结构清楚地区分了“源集”(main、androidTest),这是一个Gradle 概念。例如,您可以在src 中添加源组“付费”和“免费”,这将成为应用程序的付费和免费模式的源代码。

当你的项目引用第三方项目库(例如library-foobar)时,有一个顶级包名app来区分你的应用程序和第三方库项目是非常有用的。然后settings.gradle不断引用这些库项目,app/build.gradle可以引用这些库项目。

等级配置

常用结构参考

Android 版Gradle 的Google 指南

小任务除了脚本语言(shell、Python、Perl等)之外,还可以使用Gradle来创建任务。请参阅Gradle 的文档以获取更多信息。

密码是您的应用程序发布版本时的密码

在build.gradle中,您需要定义signingConfigs。此时您应该避免以下情况:

不要这样做。这将显示在版本控制中。

SigningConfigs { release { storeFile file('myapp.keystore') storePassword 'password123' keyAlias 'thekey' keyPassword 'password789' }}

相反,创建一个未添加到版本控制系统的gradle.properties 文件。

KEYSTORE_PASSWORD=密码123KEY_PASSWORD=密码789

该文件由gradle 自动引入,您可以在buld.gradle 文件中使用它,例如:

SigningConfigs { release { try { storeFile file('myapp.keystore') storePassword KEYSTORE_PASSWORD keyAlias 'thekey' keyPassword KEY_PASSWORD } catch (ex) { throw new InvalidUserDataException('您应该在gradle.properties 中定义KEYSTORE_PASSWORD 和KEY_PASSWORD。') } }}

使用Maven依赖解决方案,而不是使用导入jar包解决方案。如果您在项目中明确使用jar 文件,那么它们可能会成为永久版本,例如2.1.1。下载jar包并更新是非常繁琐的。这个问题用Maven就很好解决了,这也是Android Gradle构建中推荐的做法。你可以指定一个版本范围,比如2.1.+,然后Maven会自动升级到指定的最新版本,例如:

依赖项{ 编译'com.netflix.rxjava:rxjava-core:0.19.+' 编译'com.netflix.rxjava:rxjava-android:0.19.+' 编译'com.fasterxml.jackson.core:jackson-databind:2.4.+' 编译'com. fastxml.jackson.core:jackson-core:2.4.+' 编译'com.fasterxml.jackson.core:jackson-annotations:2.4.+' 编译'com.squareup.okhttp:okhttp:2.0.+' 编译'com.squareup.okhttp:okhttp-urlconnection:2. 0.+'}

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

无论您使用什么编辑器,请务必构建良好的项目结构。每个人都有自己选择的编辑器。您有责任让您的编辑器根据项目结构和构建系统工作。

目前推荐Android Studio,因为它是由Google开发的,并且与Gradle最接近。默认采用最新的工程结构,已进入beta阶段(目前有1.0版本)。它是为Android开发定制的。

您还可以使用Eclipse ADT,但需要配置它,因为它使用旧的项目结构和Ant 作为构建系统。您甚至可以使用纯文本编辑器,例如Vim、Sublime Text 或Emacs。在这种情况下,您需要使用Gardle 和adb 命令行。

如果使用Eclipse 集成Gradle 不适合您,您可以只使用命令行构建项目,或者迁移到Android Studio。

无论您使用什么开发工具,只要确保Gradle 和新的项目结构保持构建应用程序的官方方式,并避免将编辑器配置文件添加到版本控制中即可。

例如,避免添加Ant build.xml 文件。特别是如果您更改Ant 的配置,请不要忘记使build.gradle 保持最新且功能正常。另外,善待其他开发人员,不要强迫改变他们的开发工具和偏好。

类库

Jackson 是一个类库,可以将Java 对象转换为JSON,并将JSON 转换为Java 类。 Gson 是解决此问题的流行解决方案,但我们发现Jackson 更高效,因为它支持处理JSON3360 流、内存树模型和传统JSON-POJO 数据绑定的替代方法。但是,请记住,Jsonkson 库比GSON 大,因此根据您的情况,您可以选择GSON 来避免APP 65k 方法限制。其他选项: Json-smart 和Boon JSON

RxJava 是一个用于功能反应性的库,换句话说,用于处理异步事件。这是一个强大且有前途的模型,但它也可能会令人困惑,因为它是如此不同。我们建议在使用此库构建整个应用程序之前仔细考虑。有一些项目是使用RxJava 完成的,如果您需要帮助,可以与这些人联系:Timo Tuominen、Olli Salonen、Andre Medeiros、Mark Voit、Antti Lammi、Vera Izrailit、Juha Ristolainen。我们还写了一些博客:[1]、[2]、[3]、[4]。

如果您之前有使用Rx 的经验,请从API 响应开始使用它。此外,从简单的UI 事件处理开始,例如搜索栏中的单击事件或输入事件。如果您对自己的Rx 技术充满信心,并希望将其应用到您的整体架构中,那么请针对复杂部分编写Javadocs 文档。请记住,不熟悉RxJava 的其他开发人员可能很难理解整个项目。尽力帮助他们理解你的代码和Rx。

Retrolambda 是一个在Android 和JDK8 之前的平台上使用Lambda 表达式语法的Java 类库。它有助于保持代码紧凑且可读,特别是当您使用RxJava 等函数式风格进行编程时。使用时,首先安装JDK8,在Android Studio项目结构对话框中设置为SDK路径,设置JAVA8_HOME和JAVA7_HOME环境变量,然后配置项目根目录下的build.gradle:

依赖项{ 类路径'me.tatarka:gradle-retrolambda:2.4.+'}

同时添加到各个模块的build.gradle中

apply plugin: 'retrolambda'android {compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}retrolambda { jdk System.getenv('JAVA8_HOME') oldJdk System.getenv('JAVA7_HOME') javaVersion JavaVersion.VERSION_1_7}

Android Studio 为Java8 lambda 提供代码提示支持。如果您不熟悉lambda,只需按照以下步骤即可开始:

任何仅包含接口的方法都是“lambda 友好的”,并且代码可以折叠成更紧凑的语法

如果对参数或类似内容有疑问,只需编写一个普通的匿名内部类,然后让Android Status 为您生成一个lambda。

注意dex方法数量的限制,避免使用过多的类库。 Android 应用程序在打包到dex 文件中时,具有65535 个应用程序方法的硬限制[1] [2] [3]。当超过65k 限制时,您将看到致命错误。因此,使用正常范围的库文件,并使用dex-method-counts 工具来确定在65k 限制下可以使用哪些库。特别避免使用Guava 库,因为它包含超过13k 的方法。

活动与片段

片段应该是实现UI 界面的默认选择。您可以重用Fragments 用户界面来编写您的应用程序。我们强烈建议使用Fragment 而不是Activity 来呈现UI 界面,原因如下:

提供多窗格布局解决方案

Fragments的引入主要是将移动应用扩展到平板电脑上,因此在平板电脑上你可能有两个窗格A和B,但在移动应用程序上A和B可能分别占满整个屏幕。如果您的应用程序从一开始就使用片段,那么将来使您的应用程序适应其他屏幕尺寸将非常简单。

屏间数据通信

Android 的API 没有提供一种合适的方法来将复杂数据(例如Java 对象)从一个Activity 发送到另一个Activity。但使用Fragments,您可以使用活动实例作为活动子片段的通信通道。即使这比活动到活动通信更好,您也可能需要考虑使用事件总线架构,使用Otto 或greenrobot EventBus 之类的东西来实现更简单的实现。如果你想避免添加另一个类库,RxJava还可以实现一个Event Bus。

Fragments 一般不仅用在UI 中

您可以将没有界面的片段作为Activity 来提供后台工作。此外,您可以使用此功能创建一个包含更改其他片段的逻辑的片段,而不是将此逻辑放置在活动中。

甚至ActionBar 也可以使用内部片段进行管理

你可以选择使用一个没有UI界面的fragment来专门管理ActionBar,也可以选择使用每个Fragment添加自己的action作为父Activity的ActionBar。参考。

不幸的是,我们不建议广泛使用嵌套片段,因为它们有时会导致俄罗斯套娃错误。我们仅在有意义时(例如,在类似屏幕的片段中的水平滑动ViewPager 中)或确实是一个明智的选择时广泛使用片段。

从架构层面来说,你的APP应该有一个顶级的Activity,其中包含大部分与业务相关的片段。您可能还进行一些辅助活动。这些辅助活动和主活动之间的通信仅限于这两个方法:Intent.setData() 或Intent.setAction() 或类似方法。

Java包结构

Android应用程序的架构大致是Java中的Model-View-Controller结构。在Android中,Fragment和Activity通常是控制器类(http://www.informit.com/articles/article.aspx?p=2126865)。换句话说,它们是用户界面的一部分,也是视图的一部分。

因此,很难将片段(或活动)严格划分为控制器或视图。最好将它们放在自己单独的片段包中。只要您遵循前面提到的建议,就可以将活动放置在顶级目录中。如果您计划进行2 或3 项以上的活动,也可以创建一个新的活动包。

然而,这种架构可以看作是MVC 的另一种形式,包含要从API 响应中解析的JSON 数据以填充POJO 的模型包。以及一个视图包,用于包含您的自定义视图、通知、导航视图、小部件等。 适配器适配器位于数据和视图之间。但是,它们通常需要通过getView() 方法导出一些视图,因此可以将adapters包放在views包中。

一些控制器角色类是应用程序级和系统范围的。这些类被放置在managers包下。一些复杂的数据处理类,例如“DateUtils”,放在utils包下。负责与后端交互的网络处理类放在network包下。

总之,将它们安排在最靠近用户的位置,而不是最靠近后端的位置。

com.futurice.project 网络 模型 管理器 utils 片段 视图 适配器 操作栏 小部件 通知

资源文件资源

命名遵循使用前缀指示类型的约定,例如type_foo_bar.xml。例如:fragment_contact_details.xml、view_primary_button.xml、activity_main.xml。

组织布局文件如果您不确定如何格式化布局文件,遵循一些规则可能会有所帮助。

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

android:id 始终是第一个属性

android:layout_**** 属性在上面

底部的样式属性

关闭标签/另起一行以帮助调整和添加新属性

考虑使用

设计时属性是设计时布局属性。 Android Studio已经提供了支持,而不是硬编码android:text(译者注:也可以参考墙内stormzhang的这篇博客链接)。

?xml 版本='1.0'编码='utf-8'?

根据经验,android:layout_**** 属性应在布局XML 中定义,而其他属性android:**** 应放置在样式器XML 中。这条规则也有例外,但通常效果很好。总体思路是在布局文件中保留布局属性(位置、边距、大小)和内容属性,同时将所有外观细节属性(颜色、填充、字体)放在样式文件中。

例外情况包括以下内容:

android:id 显然应该在布局文件中

布局文件中的android:orientation 通常对于LinearLayout 布局更有意义

由于android:text是定义内容,所以应该放在布局文件中。

有时,将android:layout_width 和android:layout_height 属性放入样式中作为通用样式更有意义,但默认情况下,这些属性应放置在布局文件中。

使用样式几乎每个项目都需要适当使用样式文件,因为视图具有重复的外观是很常见的。对于应用程序中的大多数文本内容,至少您应该有一个通用的样式文件,例如:

适用于TextView :

您可能想对按钮控件执行相同的操作,但不要就此止步。将一组相关且重复的android:**** 属性放入通用样式中。

将大样式文件拆分为多个文件您可以有多个styles.xml 文件。 Android SDK 支持其他文件。文件名样式无效。重要的是文件中xml的`标签。因此,您可以有多个样式文件styles.xml、style_home.xml、style_item_details.xml、styles_forms.xml。资源文件路径不需要对系统构建有意义。 res/values目录下的文件可以任意命名。

color.xml 是一个调色板。您的colors.xml 文件应该只将颜色名称映射到RGBA 值,而不是其他任何内容。不要用它来定义不同按钮的RGBA值。

不要这样做

#FFFFFF#2A91BD#5F5F5F#939393#FFFFFF#FF9D2F.#323232

使用这种格式,您可以轻松地开始重新定义RGBA 值,如果您需要更改基色,这会使事情变得复杂。同时,这些定义与某些环境相关,例如按钮或注释,应该放在按钮样式中而不是放在color.xml 文件中。

相反,请执行此操作:

#FFFFFF#DBDBDB#939393#5F5F5F#323232#27D34D#2A91BD#FF9D2F#FF432F

向应用程序设计者询问此调色板。该名称不需要与“green”、“blue”等相同。“brand_primary”、“brand_secondary”、“brand_negative”等名称也完全可以接受。像这样的颜色规范很容易修改或重构,使得应用程序中使用了多少种不同的颜色非常清楚。通常对于一个具有审美价值的UI来说,减少所使用的颜色种类是非常重要的。

像colors.xml 一样对待dimens.xml 文件。就像定义调色板一样,您还应该定义间距和字体大小的“调色板”。一个很好的例子如下所示:

22sp18sp15sp12sp40dp24dp14dp10dp4dp60dp40dp32dp

布局时写入margin和padding时,应该使用spacing_****大小格式进行布局,而不是像String字符串一样直接写入值。这样写会给你很多感觉,并且会让组织和改变风格或布局变得非常容易。

避免深层视图结构有时为了布局视图,您可能会尝试添加另一个LinearLayout。你可以这样解决:

即使你没有在布局文件中明确使用它,如果你在Java文件中从一个视图膨胀到其他视图,也可能会发生这种情况(这个膨胀无法翻译,理解一下即可)。

可能会引发一系列的问题。由于需要处理复杂的UI 树结构,您可能会遇到性能问题。它还可能会导致以下更严重的问题StackOverflowError。

因此,请尽量保持视图树尽可能干净:学习如何使用RelativeLayout、如何优化布局以及如何使用``标签。

小心WebView。如果你必须显示一个网页视图,比如一篇新闻文章,为了避免客户端处理HTML 的工作,最好请后端工程师协助并让他返回一个“纯”HTML。当WebView 保留在引用它们的Activity 中而不是绑定到ApplicationContext 时,也可能导致内存泄漏。使用简单文本或按钮时,避免使用WebView。最好使用TextView 或Button。

测试框架

Android SDK的测试框架仍处于起步阶段,尤其是UI测试方面。 Android Gradle 目前实现了一个名为connectedAndroidTest 的测试,该测试使用带有Android 帮助程序的JUnit 扩展。它可以运行您生成的JUnit 测试。

仅将Robolectric 用于单元测试,而不用于视图。为了加快开发速度,最需要提供“未连接到设备”的测试。它通常用于模型和视图模型的单元测试。然而,使用Robolectric 进行测试并不精确,并且不完全支持UI 测试。当你测试动画UI元素、对话框等时会出现问题,这主要是因为你“在黑暗中工作”(没有可控界面的测试)

_Robotium 使编写UI 测试变得非常容易。 _ 对于UI 测试,您不需要Robotium 来运行连接到设备的测试。但它可能对您有益,因为它有许多帮助程序类用于获取和分析视图以及控制屏幕。测试用例看起来很简单:

olo.sendKey(Solo.MENU);solo.clickOnText('更多'); //

searches for the first occurence of "More" and clicks on itsolo.clickOnText("Preferences");solo.clickOnText("Edit File Extensions");Assert.assertTrue(solo.searchText("rtf")); 模拟器 如果你全职开发Android App,那么买一个Genymotion emulatorlicense吧。 Genymotion 模拟器运行更快的秒帧的速度,比起典型的AVD模拟器。他有演示你APP的工具,高质量的模拟网络连接,GPS位置,等等。它同时还有理想的连接测试。 你若涉及适配使用很多不同的设备,买一个Genymotion 版权是比你买很多真设备便宜多的。 注意:Genymotion模拟器没有装载所有的Google服务,如Google Play Store和Maps。你也可能需 要测试Samsung指定的API,若这样的话你还是需要购买一个真实的Samsung设备。 混淆配置 ProGuard 是一个在Android项目中广泛使用的压缩和混淆打包的源码的工具。 你是否使用ProGuard取决你项目的配置,当你构建一个release版本的apk时,通常你应该配置gradle文件。 buildTypes { debug { minifyEnabled false } release { signingConfig signingConfigs.release minifyEnabled true proguardFiles 'proguard-rules.pro' }} 为了决定哪些代码应该被保留,哪些代码应该被混淆,你不得不指定一个或多个实体类在你的代码中。 这些实体应该是指定的类包含main方法,applets,midlets,activities,等等。 Android framework 使用一个默认的配置文件,可以在SDK_HOME/tools/proguard/proguard-android.txt 目录下找到。自定义的工程指定的 project-specific 混淆规则,如在my-project/app/proguard-rules.pro中定义, 会被添加到默认的配置中。 关于 ProGuard 一个普遍的问题,是看应用程序是否崩溃并报ClassNotFoundException 或者 NoSuchFieldException 或类似的异常, 即使编译是没有警告并运行成功。 这意味着以下两种可能: ProGuard 已经移除了类,枚举,方法,成员变量或注解,考虑是否是必要的。 ProGuard 混淆了类,枚举,成员变量的名称,但是这些名字又被拿原始名称使用了,比如通过Java的反射。 检查app/build/outputs/proguard/release/usage.txt文件看有问题的对象是否被移除了。 检查app/build/outputs/proguard/release/mapping.txt 文件看有问题的对象是否被混淆了。 In order to prevent ProGuard from stripping away needed classes or class members, add a keep options to your proguard config: 以防 ProGuard 剥离 需要的类和类成员,添加一个 keep选项在你的 proguard 配置文件中: -keep class com.futurice.project.MyClass { *; } 防止 ProGuard 混淆 一些类和成员,添加 keepnames: -keepnames class com.futurice.project.MyClass { *; } 查看this template's ProGuard config 中的一些例子。 更多例子请参考Proguard。 在构建项目之初,发布一个版本 来检查ProGuard规则是否正确的保持了重要的部分。 同时无论何时你添加了新的类库,做一个发布版本,同时apk在设备上跑起来测试一下。 不要等到你的app要发布 "1.0"版本了才做版本发布,那时候你可能会碰到好多意想不到的异常,需要一些时间去修复他们。 Tips每次发布新版本都要写 mapping.txt。每发布一个版本,如果用户遇到一个bug,同时提交了一个混淆过的堆栈跟踪。 通过保留mapping.txt文件,来确定你可以调试的问题。 DexGuard 若果你需要核心工具来优化,和专门混淆的发布代码,考虑使用DexGuard, 一个商业软件,ProGuard 也是有他们团队开发的。 它会很容易将Dex文件分割,来解决65K个方法限制问题。

用户评论

孤岛晴空

这也太夸大了些吧?“全网独一份”,哪个“最佳实践”又不是唯一真理!不过想了解一下大型企业是怎么用的Android开发的,倒是可以看看这个手册。

    有8位网友表示赞同!

强辩

期待很久了!一直在找关于高品质Android开发的资源,希望这份手册能让我学到真技能,而不是一些鸡汤话。

    有10位网友表示赞同!

今非昔比'

收藏了,之前遇到过不少Android开发难题,希望能在这个手册里找到解决方法!也想知道哪些大公司用的什么开发实践

    有8位网友表示赞同!

颓废人士

我还在读大学学习Android开发,这种“知名大企”的最佳实践对我来说实在太棒了!虽然可能有些技术细节比较进阶,但能够参考它们的思路是我最大的收获。

    有18位网友表示赞同!

灵魂摆渡人

说的这么牛也没试过啊,有没有大佬分享一下实际效果?真能解决開発各种难题吗? 希望能有更多实战案例。

    有10位网友表示赞同!

一纸愁肠。

我觉得开发实践还是要根据具体项目来决定吧,不能说哪个就是“最佳”。不过总的来说这种大公司积累的经验还是值得参考学习的。

    有12位网友表示赞同!

未来未必来

这个手册有没有针对不同的Android版本提供建议?比如最新的安卓13有什么特殊之处?

    有14位网友表示赞同!

浅嫣婉语

"全网独一份" 听起来有些虚假宣传,开发实践应该是不断迭代改进的。不过还是要看看这份手册究竟内容如何吧! 实际效果才是最重要的。

    有6位网友表示赞同!

有一种中毒叫上瘾成咆哮i

我一直都觉得学习编程最好的方法就是看代码实现,不如把这些“最佳实践”具体案例也分享出来?这样更能让开发者们真正理解和应用

    有8位网友表示赞同!

◆残留德花瓣

开发Android应用真的需要很多实践经验才能熟练掌握,希望这个手册能帮我梳理一下思路,找到一些提高效率的技巧!

    有12位网友表示赞同!

大王派我来巡山!

这份资料真值钱!安卓开发一直困扰我的一些问题或许在这本书中有答案。期待作者能够定期更新,适应最新的技术趋势

    有15位网友表示赞同!

﹎℡默默的爱

"知名大企" 感觉有些含糊其辞,哪家公司具体用过呢? 还是说一些更具体的案例,能让开发者更有共鸣

    有5位网友表示赞同!

你与清晨阳光

收藏!Android开发入门不久,看到这种经验分享非常激动。希望能系统学习这些最佳实践,提升自己的开发能力!

    有15位网友表示赞同!

来瓶年的冰泉

开发最好的实践取决于实际的项目情况吧。这个手册能提供一些参考思路也好,但不能说“全网独一份”。

    有18位网友表示赞同!

雨后彩虹

总觉得Android开发环境比较复杂,这种专门针对大型企业最佳实践的手册能够提高很多效率!期待学习它们的开发流程和经验

    有6位网友表示赞同!

你那刺眼的温柔

安卓开发我接触的不多,想深入了解一下。这份手册能让我快速掌握一些关键点吗? 或许可以先看看目录再来决定是否购买

    有5位网友表示赞同!

热点资讯