22
33## 摘要
44
5- * [ 前言] ( #前言 )
6- * [ AS规范] ( #AS规范 )
7- * [ 命名规范] ( #命名规范 )
8- * [ 资源文件规范] ( #资源文件规范 )
9- * [ 版本统一规范] ( #版本统一规范 )
10- * [ 第三方库规范] ( #第三方库规范 )
11- * [ 注释规范] ( #注释规范 )
12- * [ 测试规范] ( #测试规范 )
13- * [ RN规范] ( #RN规范 )
14- * [ 其他的一些规范] ( #其他的一些规范 )
5+ * [ 1 前言] (#1 前言)
6+ * [ 2 AS规范] (#2 AS规范)
7+ * [ 3 命名规范] (#3 命名规范)
8+ * [ 4 资源文件规范] (#4 资源文件规范)
9+ * [ 5 版本统一规范] (#5 版本统一规范)
10+ * [ 6 第三方库规范] (#6 第三方库规范)
11+ * [ 7 注释规范] (#7 注释规范)
12+ * [ 8 测试规范] (#8 测试规范)
13+ * [ 9 RN规范] (#9 RN规范)
14+ * [ 10 其他的一些规范] (#10 其他的一些规范)
1515
1616
17- ### 前言
17+ ### 1 前言
1818
1919为了利于项目维护以及规范开发,促进成员之间Code Review的效率,故提出以下开发规范,如有更好建议,欢迎到GitHub提issue,原文地址: [ 安卓开发规范(updating)] [ 安卓开发规范(updating) ]
2020
2121
22- ### AS规范
22+ ### 2 AS规范
2323
2424工欲善其事,必先利其器。
2525
26261 . 尽量使用最新版的IDE进行开发;
27272 . 编码格式统一为** UTF-8** ;
28- 3 . 编辑完.java、.xml等文件后一定要 ** 格式化** (缩进对齐与AS默认一致即可);
28+ 3 . 编辑完` .java ` , ` .xml ` 等文件后一定要 ** 格式化** (缩进对齐与AS默认一致即可);
29294 . 删除多余的import,减少警告出现,可利用AS的` Optimize Imports ` 快捷键;
30305 . AS常用开发插件可以参考这里~[ AS常用开发插件] [ AS常用开发插件 ]
3131
3232
33- ### 命名规范
33+ ### 3 命名规范
3434
35- #### 1. 包名
35+ 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。但 ` alibaba ` , ` taobao ` , ` youku ` , ` hangzhou ` 等国际通用的名称,可视同英文。
36+
37+ #### 3.1 包名
3638
3739包名全部小写,连续的单词只是简单地连接起来,不使用下划线。
3840
39- 采用反域名命名规则,全部使用小写字母。一级包名是顶级域名,通常为com, edu, gov, net, org等 ,二级包名为公司名,三级包名根据应用进行命名,四级包名为模块名或层级名。
41+ 采用反域名命名规则,全部使用小写字母。一级包名是顶级域名,通常为 ` com ` , ` edu ` , ` gov ` , ` net ` , ` org ` 等 ,二级包名为公司名,三级包名根据应用进行命名,四级包名为模块名或层级名。
4042
4143| 包名 | 此包中包含 |
4244| :--------------------------------------- | :----------------------------- |
5254| com.xx.应用名称缩写.view (或者 com.xx.应用名称缩写.widget ) | 自定义的View类等 |
5355| com.xx.应用名称缩写.service | Service服务 |
5456| com.xx.应用名称缩写.receiver | BroadcastReceiver服务 |
55- | com.xx.应用名称缩写.confing | 所有的配置相关的类 |
57+ | com.xx.应用名称缩写.config | 所有的配置相关的类 |
5658
57- > 注意:如果项目采用MVP,所有M、V、P抽取出来的接口都放置在相应模块的i包下,所有的实现都放置在相应模块的impl下
59+ > 注意:如果项目采用MVP,所有M、V、P抽取出来的接口都放置在相应模块的i包下,所有的实现都放置在相应模块的impl下
5860
5961
60- #### 2. 类名
62+ #### 3.2 类名
6163
6264类名都以` UpperCamelCase ` 风格编写。
6365
6466类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。
6567
6668名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
6769
68- | 类 | 描述 | 例如 |
69- | :-------------- | :--------------------------------------- | :--------------------------------------- |
70- | Activity 类 | Activity为后缀标识 | 欢迎页面类WelcomeActivity |
71- | Adapter类 | Adapter 为后缀标识 | 新闻详情适配器 NewDetailAdapter |
72- | 解析类 | Parser为后缀标识 | 首页解析类HomePosterParser |
73- | 工具方法类 | Utils或Manager为后缀标识(与系统或第三方的Utils区分)或功能+Utils | 线程池管理类:ThreadPoolManager日志工具类:LogUtils(Logger也可)打印工具类:PrinterUtils |
74- | 数据库类 | 以DBHelper后缀标识 | 新闻数据库:NewDBHelper |
75- | Service类 | 以Service为后缀标识 | 时间服务TimeServiceBroadcast |
76- | Receiver类 | 以Receiver为后缀标识 | 推送接收JPushReceiver |
77- | ContentProvider | 以Provider为后缀标识 | |
78- | 自定义的共享基础类 | 以Base开头 | BaseActivity,BaseFragment |
70+ | 类 | 描述 | 例如 |
71+ | :----------------- | :--------------------------------------- | :--------------------------------------- |
72+ | Activity 类 | Activity为后缀标识 | 欢迎页面类WelcomeActivity |
73+ | Adapter类 | Adapter 为后缀标识 | 新闻详情适配器 NewDetailAdapter |
74+ | 解析类 | Parser为后缀标识 | 首页解析类HomePosterParser |
75+ | 工具方法类 | Utils或Manager为后缀标识(与系统或第三方的Utils区分)或功能+Utils | 线程池管理类:ThreadPoolManager日志工具类:LogUtils(Logger也可)打印工具类:PrinterUtils |
76+ | 数据库类 | 以DBHelper后缀标识 | 新闻数据库:NewDBHelper |
77+ | Service类 | 以Service为后缀标识 | 时间服务TimeService |
78+ | BroadcastReceiver类 | 以Receiver为后缀标识 | 推送接收JPushReceiver |
79+ | ContentProvider类 | 以Provider为后缀标识 | ShareProvider |
80+ | 自定义的共享基础类 | 以Base开头 | BaseActivity,BaseFragment |
7981
8082测试类的命名以它要测试的类的名称开始,以Test结束。例如:HashTest 或 HashIntegrationTest。
8183
@@ -85,7 +87,7 @@ interface Runnable , interface Accessible。
8587> 注意:如果项目采用MVP,所有Model、View、Presenter的接口都以I为前缀,不加后缀,其他的接口采用上述命名规则。
8688
8789
88- #### 3. 方法名
90+ #### 3.3 方法名
8991
9092方法名都以` lowerCamelCase ` 风格编写。
9193
@@ -104,9 +106,9 @@ interface Runnable , interface Accessible。
104106| resetXX() | 重置数据 |
105107| clearXX() | 清除数据 |
106108| removeXX() | 移除数据或者视图等,如removeView(); |
107- | drawXXX() | 绘制数据或效果相关的,使用draw前缀标识 |
109+ | drawXX() | 绘制数据或效果相关的,使用draw前缀标识 |
108110
109- #### 4. 常量名
111+ #### 3.4 常量名
110112
111113常量名命名模式为` CONSTANT_CASE ` ,全部字母大写,用下划线分隔单词。那,到底什么算是一个常量?
112114
@@ -119,6 +121,7 @@ static final ImmutableListNAMES = ImmutableList.of("Ed", "Ann");
119121static final Joiner COMMA_JOINER = Joiner . on(' ,' ); // because Joiner is immutable
120122static final SomeMutableType [] EMPTY_ARRAY = {};
121123enum SomeEnum { ENUM_CONSTANT }
124+
122125// Not constants
123126static String nonFinal = " non-final" ;
124127final String nonStatic = " non-static" ;
@@ -129,7 +132,7 @@ static final String[] nonEmptyArray = {"these", "can", "change"};
129132```
130133
131134
132- #### 5. 非常量字段名
135+ #### 3.5 非常量字段名
133136
134137非常量字段名以` lowerCamelCase ` 风格的基础上改造为如下风格:基本结构为` scopeVariableNameType ` 。
135138
@@ -186,13 +189,13 @@ public class MyClass {
186189> 注意:所有的VO(值对象)统一采用标准的lowerCamelCase风格编写,所有的DTO(数据传输对象)就按照接口文档中定义的字段名编写。
187190
188191
189- #### 6. 参数名
192+ #### 3.6 参数名
190193
191194参数名以` lowerCamelCase ` 风格编写。
192195参数应该避免用单个字符命名。
193196
194197
195- #### 7. 局部变量名
198+ #### 3.7 局部变量名
196199
197200局部变量名以` lowerCamelCase ` 风格编写,比起其它类型的名称,局部变量名可以有更为宽松的缩写。
198201
@@ -201,30 +204,30 @@ public class MyClass {
201204即使局部变量是final和不可改变的,也不应该把它示为常量,自然也不能用常量的规则去命名它。
202205
203206
204- #### 8. 临时变量
207+ #### 3.8 临时变量
205208
206209临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。 如: for (int i = 0; i < len ; i++)。
207210
208211
209- #### 9. 类型变量名
212+ #### 3.9 类型变量名
210213
211214类型变量可用以下两种风格之一进行命名:
212215
213216单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
214217
215- 以类命名方式(参考2. 类名),后面加个大写的T(如:RequestT, FooBarT)。
218+ 以类命名方式(参考3.2 类名),后面加个大写的T(如:RequestT, FooBarT)。
216219
217220
218221更多还可参考~[ 阿里巴巴Java开发手册] [ 阿里巴巴Java开发手册 ]
219222
220223
221- ### 资源文件规范
224+ ### 4 资源文件规范
222225
223- #### 1. 资源布局文件(XML文件(layout布局文件))
226+ #### 4.1 资源布局文件(XML文件(layout布局文件))
224227
225228全部小写,采用下划线命名法
226229
227- ##### 1) contentview 命名
230+ ##### 4.1.1 contentView 命名
228231
229232必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
230233
@@ -235,22 +238,22 @@ public class MyClass {
235238例如:` activity_main.xml `
236239
237240
238- ##### 2) Dialog命名:` dialog_描述.xml `
241+ ##### 4.1.2 Dialog命名:` dialog_描述.xml `
239242
240243例如:` dialog_hint.xml `
241244
242245
243- ##### 3) PopupWindow命名:` ppw_描述.xml `
246+ ##### 4.1.3 PopupWindow命名:` ppw_描述.xml `
244247
245248例如:` ppw_info.xml `
246249
247250
248- ##### 4) 列表项命名:` item_描述.xml `
251+ ##### 4.1.4 列表项命名:` item_描述.xml `
249252
250253例如:` item_city.xml `
251254
252255
253- ##### 5) 包含项命名:` 模块_(位置)描述.xml `
256+ ##### 4.1.5 包含项命名:` 模块_(位置)描述.xml `
254257
255258例如:` activity_main_head.xml ` 、` activity_main_bottom.xml `
256259
@@ -259,7 +262,7 @@ public class MyClass {
259262例如:` xxxx_title.xml `
260263
261264
262- #### 2. 资源文件(图片drawable文件夹下)
265+ #### 4.2 资源文件(图片drawable文件夹下)
263266
264267全部小写,采用下划线命名法,加前缀区分
265268
@@ -316,7 +319,7 @@ public class MyClass {
316319> 注意:使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要规范。
317320
318321
319- #### 3. 动画文件(anim文件夹下)
322+ #### 4.3 动画文件(anim文件夹下)
320323
321324全部小写,采用下划线命名法,加前缀区分。
322325
@@ -347,13 +350,13 @@ public class MyClass {
347350| ` shrink_to_middle ` | 中间缩小 |
348351
349352
350- #### 4. values中name命名
353+ #### 4.4 values中name命名
351354
352- ##### 1) colors.xml
355+ ##### 4.4.1 colors.xml
353356
354357colors的name命名使用下划线命名法,在你的` colors.xml ` 文件中应该只是映射颜色的名称一个ARGB值,而没有其它的。不要使用它为不同的按钮来定义ARGB值。
355358
356- * 不要这样做*
359+ ** 不要这样做* *
357360
358361``` xml
359362 <resources >
@@ -367,9 +370,9 @@ colors的name命名使用下划线命名法,在你的`colors.xml`文件中应
367370 <color name =" comment_shadow" >#323232</color >
368371```
369372
370- 使用这种格式,你会非常容易的开始重复定义RGBA值 ,这使如果需要改变基本色变的很复杂。同时,这些定义是跟一些环境关联起来的,如` button ` 或者` comment ` , 应该放到一个按钮风格中,而不是在` color.xml ` 文件中。
373+ 使用这种格式,你会非常容易的开始重复定义ARGB值 ,这使如果需要改变基本色变的很复杂。同时,这些定义是跟一些环境关联起来的,如` button ` 或者` comment ` , 应该放到一个按钮风格中,而不是在` color.xml ` 文件中。
371374
372- 相反,这样做:
375+ ** 相反,这样做**
373376
374377``` xml
375378 <resources >
@@ -393,7 +396,7 @@ colors的name命名使用下划线命名法,在你的`colors.xml`文件中应
393396向应用设计者那里要这个调色板,名称不需要跟"green", "blue", 等等相同。 "brand_primary", "brand_secondary", "brand_negative" 这样的名字也是完全可以接受的。 像这样规范的颜色很容易修改或重构,会使应用一共使用了多少种不同的颜色变得非常清晰。 通常一个具有审美价值的UI来说,减少使用颜色的种类是非常重要的。
394397
395398
396- ##### 2) dimens.xml
399+ ##### 4.4.2 dimens.xml
397400
398401像对待colors.xml一样对待dimens.xml文件 与定义颜色调色板一样,你同时也应该定义一个空隙间隔和字体大小的“调色板”。 一个好的例子,如下所示:
399402
@@ -425,7 +428,7 @@ colors的name命名使用下划线命名法,在你的`colors.xml`文件中应
425428布局时在写 margins 和 paddings 时,你应该使用spacing_xxxx尺寸格式来布局,而不是像对待String字符串一样直接写值。 这样写会非常有感觉,会使组织和改变风格或布局是非常容易。
426429
427430
428- ##### 3) strings.xml
431+ ##### 4.4.3 strings.xml
429432
430433strings的name命名使用下划线命名法,采用以下规则:模块名+逻辑名称
431434
@@ -440,7 +443,7 @@ strings的name命名使用下划线命名法,采用以下规则:模块名+
440443` loading ` 加载文字
441444
442445
443- ##### 4) styles.xml
446+ ##### 4.4.4 styles.xml
444447
445448几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的,将所有的外观细节属性(colors, padding, font)放在style文件中。 在应用中对于大多数文本内容,最起码你应该有一个通用的style文件,例如:
446449
@@ -467,7 +470,7 @@ strings的name命名使用下划线命名法,采用以下规则:模块名+
467470** 将一个大的style文件分割成多个文件** , 你可以有多个` styles.xml ` 文件。Android SDK支持其它文件,` styles ` 这个文件名称并没有作用,起作用的是在文件 里xml的` <style> ` 标签。因此你可以有多个style文件` styles.xml ` ,` style_home.xml ` ,` style_item_details.xml ` ,` styles_forms.xml ` 。 不同于资源文件路径需要为系统构建起的有意义,在` res/values ` 目录下的文件可以任意命名。
468471
469472
470- #### 5. layout中的id命名
473+ #### 4.5 layout中的id命名
471474
472475命名模式为:` view缩写_模块名_逻辑名 ` ,比如btn_main_search
473476使用 AndroidStudio 的插件 ButterKnife Zelezny,生成注解非常方便,或者也可以使用Android Code Generator插件。
@@ -476,14 +479,14 @@ strings的name命名使用下划线命名法,采用以下规则:模块名+
476479如果想对资源文件进行分包可以参考我这篇文章~[ Android Studio下对资源进行分包] [ Android Studio下对资源进行分包 ]
477480
478481
479- ### 版本统一规范
482+ ### 5 版本统一规范
480483
481484Android开发存在着众多版本的不同,比如compileSdkVersion、minSdkVersion、targetSdkVersion以及项目中依赖第三方库的版本,不同的module及不同的开发人员都有不同的版本,所以需要一个统一版本规范的文件。
482485
483486具体可以参考我写的这篇博文~[ Android开发之版本统一规范] [ Android开发之版本统一规范 ]
484487
485488
486- ### 第三方库规范
489+ ### 6 第三方库规范
487490
488491别再闭门造车了,用用最新最火的技术吧,安利一波~[ Android 流行框架查速表] [ Android 流行框架查速表 ] ,顺便带上自己的干货~[ Android开发人员不得不收集的代码] [ Android开发人员不得不收集的代码 ]
489492
@@ -492,11 +495,11 @@ Android开发存在着众多版本的不同,比如compileSdkVersion、minSdkVe
492495个人推荐team使用Retrofit, RxAndroid, OkHttp, Glide/Fresco, Gson/Fastjson, EventBus/AndroidEventBus, GreenDao,(Dagger2, Tinker)。
493496
494497
495- ### 注释规范
498+ ### 7 注释规范
496499
497500为了让他人可以容易看懂你的代码,请在关键地方做好注释。
498501
499- #### 1. 类注释
502+ #### 7.1 类注释
500503
501504每个类完成后应该有作者姓名和联系方式的注释,对自己的代码负责。
502505
@@ -510,6 +513,9 @@ Android开发存在着众多版本的不同,比如compileSdkVersion、minSdkVe
510513 * version: 1.0
511514 * </pre>
512515 */
516+ public class WelcomeActivity {
517+ ...
518+ }
513519```
514520
515521具体可以在AS中自己配制,Setting → Editor → File and Code Templates → Includes → File Header,输入
@@ -524,15 +530,12 @@ Android开发存在着众多版本的不同,比如compileSdkVersion、minSdkVe
524530 * version: 1.0
525531 * </pre>
526532 */
527- public class WelcomeActivity {
528- ...
529- }
530533```
531534
532535这样便可在每次新建类的时候自动加上该注释。
533536
534537
535- #### 2. 方法注释
538+ #### 7.2 方法注释
536539
537540每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释,在方法前一行输入/\*\* 回车,AS便会帮你生成模板,我们只需要补全参数即可,如下所示。
538541
@@ -552,7 +555,7 @@ public static byte[] bitmap2Bytes(Bitmap bitmap, CompressFormat format) {
552555}
553556```
554557
555- #### 3. 块注释
558+ #### 7.3 块注释
556559
557560块注释与其周围的代码在同一缩进级别。它们可以是` /* ... */ ` 风格,也可以是` // ... ` 风格(** // 后最好带一个空格** )。对于多行的` /* ... */ ` 注释,后续行必须从` * ` 开始, 并且与前一行的` * ` 对齐。以下示例注释都是OK的。
558561
@@ -567,19 +570,19 @@ public static byte[] bitmap2Bytes(Bitmap bitmap, CompressFormat format) {
567570> Tip:在写多行注释时,如果你希望在必要时能重新换行(即注释像段落风格一样),那么使用/\* ... \* /。
568571
569572
570- ### 测试规范
573+ ### 8 测试规范
571574
572575业务开发完成之后,开发人员做单元测试,单元测试完成之后,保证单元测试全部通过同时单元测试代码覆盖率达到一定程度(这个需要开发和测试约定,理论上越高越好),开发提测。
573576
574577// TODO...
575578
576579
577- ### RN规范
580+ ### 9 RN规范
578581
579582// TODO...
580583
581584
582- ### 其他的一些规范
585+ ### 10 其他的一些规范
583586
5845871 . 合理布局,有效运用` <merge> ` , ` <ViewStub> ` , ` <include> ` 标签
5855882 . 相关联的方法尽量放在一起
0 commit comments