Android开发技术框架和编码规范
2017年11月23日
目录
8.4. 卡片式设计将会变得更频繁.............................................................................. 23
第一章 绪论
1.1概述
Android开发技术框架和编码规范
1.2目的
统一规范AndroidStudio编辑环境下android的编码风格和标准。此为最基本的编码要求规范,包括文件、注释、命名规范,必须完全遵守。
1.3适用范围
适用于安卓手机APP项目。
第二章 IDE选择
2.2 IDE使用AndroidStudio2.3
2.2 Android-Sdk配置:
android {
compileSdkVersion 24
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "org.loader.myapplication"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
classpath 'com.android.tools.build:gradle:2.3.3'
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
第三章 框架与第三方选择
3.1网络框架使用对Okhttp3.0进行封装过后的okhttputils
3.2分享及第三方推送、统计使用友盟Android 社会化组件SDK v6.4.5
3.3 Json数据解析使用GsonFormat插件
3.4 二维码相关使用zxing
3.5可点击+滑动导航栏使用ViewPage+Fragment,可点击+不可滑动导航栏使用FragmentTransaction+FrameLayout
3.6 上拉刷新、仿ios按钮、仿ios时间地址选择等使用自定义组件
3.7 注解、页面绑定,java使用xutils,kotlin自带了
3.8 图片加载使用glide
3.9 地图使用百度地图sdk
3.10 支付使用支付宝、微信sdk
3.11 即时通讯使用网易云信sdk
3.12 开发模式使用model+view+control
第四章 命名注释规范
4.1 命名规范
4.1.1 包命名
命名规则:包名采用域后缀倒置的加上自定义的包名,采用小写字母,都应该以com.*(公司名)开头(不包括一些特殊原因)。在部门内部应该规划好包名的范围,防止产生冲突。部门内部产品使用部门的名称加上模块名称。产品线的产品使用产品的名称加上模块的名称。
说明:除特殊原因包结构都必须以com.*开头,已有项目包结构不做调整.
格式:
Com.公司名.应用名称缩写.模块名称
eg:com.xx.应用名称缩写.activity 页面用到的Activity类 (activitie层级名用户界面层)
com.xx.应用名称缩写.base 基础共享的类
com.xx.应用名称缩写.adapter 页面用到的Adapter类 (适配器的类)
com.xx.应用名称缩写.util 此包中包含:公共工具方法类(util模块名)
com.xx.应用名称缩写.bean 下面可分:vo、po、dto 此包中包含:JavaBean类
com.xx.应用名称缩写.model 此包中包含:模型类
com.xx.应用名称缩写.db 数据库操作类
com.xx.应用名称缩写.view 自定义的View类等
com.xx.应用名称缩写.service Service服务
com.xx.应用名称缩写.receiver BroadcastReceiver服务
com.xx.应用名称缩写.mylistener listener接口
4.1.2 类和接口命名
规则一:命名必须使用驼峰规则,即每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法,类名和接口使用类意义完整的英文描述,不允许出现无意义的单词,如(FirstActivity),应该为(LauncherActivity)。
示例:ChatActivity,LogManager, LogConfig
规则二:常用组件类的命名以组件名加上组件类型名结尾。
示例:
Application 类型的,命名以Application结尾——MTApplication
Activity类型的,命名以Activity结尾——LoginActivity
fragment类型的,建议命名以fragment结尾——CourseFragment
adapter类型的,建议命名以adapter结尾——ContactDetailAdapter
bean 类型的,请求体,建议命名以Req结尾-GetMMSListReq,消息返回提,建议以Resp结尾-BackupProgressResp。
4.1.3 方法命名
规则一:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写,并且方法名使用类意义完整的英文描述。
示例:
publicvoid addNewOrder();
规则二:方法中,存取属性的方法采用set 和get方法,动作方法采用动词和动宾结构,类的布尔型的判断方法一般要求方法名使用单词is或has做前缀。
格式:
set + 属性名()
get + 非布尔属性名()
动词()
动词 + 宾语()
is + 布尔属性名()
示例:
publicvoid setVisible(boolean);
publicString getType();
publicvoid show();
publicvoid addKeyListener(Listener);
publicboolean isFinished();
规则三:如果函数名超过15 个字母,可采用以去掉元音字母的方法或者以行业内约定俗成的缩写方式缩写函数名。
示例:
getCustomerInformation() 改为 getCustomerInfo()
4.1.4 属性名
规则一:属性名使用意义完整的英文描述,变量名应简短且富于描述,第一个单词的字母使用小写,剩余单词首字母大写其余字母小写的大小写混合法。尽量避免单个字符的变量名,除非是一次性的临时变量。
示例:
privatecustomerName;
privateorderNumber;
privatesmpSession;
规则二:含有集合意义的属性命名,尽量包含其复数的意义。
示例:
customers, orderItems
4.1.5 常量名
规则一:常量名使用全大写的英文描述,英文单词之间用下划线分隔开,并且使用static final修饰。
示例:
public static final int MAX_VALUE = 1000;
public static final String DEFAULT_START_DATE ="2001-12-08";
4.1.6 layout 命名
规则一:layoutxml 的命名必须以 全部单词小写,单词间以下划线分割,并且使用名词或名词词组,即使用 模块名_功能名称 来命名。
示例:
person_login.xml
4.1.7 id 命名
规则一:layout中所使用的id必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,并且要求能够通过id直接理解当前组件要实现的功能。
示例:
@+id/book_name_show
@+id/book_name_edit
4.1.8 资源命名
规约:layout中所使用的所有资源(如drawable,style等)命名必须以全部单词小写,单词间以下划线分割,并且尽可能的使用名词或名词组,即使用 模块名_用途 来命名。如果为公共资源,如分割线等,则直接用用途来命名
示例:
home_icon_username.png
home_icon_confirm.png
line.png或default_image.png
Home_register_sumbit_bg_selector
4.2 注释规范
4.2.1 基本原则
源程序注释量必须在30%以上。由于每个文件的代码注释不一定都可以达到30%,建议以一个系统内部模块作为单位进行检查。
4.2.2基本概念
Java 程序有两类注释:实现注释(implementationcomments)和文档注释(documentcomments)。实现注释是使用/*...*/和//界定的注释。文档注释(被称为"doc comments")由/**...*/界定。文档注释可以通过javadoc工具转换成HTML 文件。
4.2.3文件注释
规则一:包的注释:写入一个名为package.html 的HTML格式的说明文件放入包所在路径。包的注释内容:简述本包的作用、详细描述本包的内容、产品模块名称和版本、公司版权。(目前不涉及到对外开放源码,可以暂时不添加)
说明:方便JavaDoc收集,方便对包的了解
示例:
/*
* 文件名
* 包含类名列表
* 版本信息,版本号
* 创建日期。
* 版权声明
*/
4.2.4 类注释
规则一:类和接口的注释放在class 或者interface 关键字之前,import关键字之后。注释主要是一句话功能简述与功能详细描述。类注释使用“/** */”注释方式
说明:方便JavaDoc收集,没有import可放在package之后。注释可根据需要列出:作者、内容、功能、与其它类的关系等。功能详细描述部分说明该类或者接口的功能、作用、使用方法和注意事项,每次修改后增加作者和更新版本号和日期,@since表示从那个版本开始就有这个类或者接口。
/**
* @author: ${USER} [作者](必须)
* @email: [邮箱,可选]
* @createDate:${DATE}.
* @description: 〈功能详细描述〉
* @modificator: [修改者]
* @version:1.0 [版本号, 创建时间]
*/
4.2.5方法注释
规则一:每一个方法都要包含 如下格式的注释 包括当前方法的用途,当前方法参数的含义,返回参数的含义。
示例:
/**
* <判断对象是否为null>
* @param 需要判断的对象
* @return 为null返回true,否则返回false
*/
public static boolean isNull(Object obj)
{
return (null ==obj) ? true : false;
}
4.2.6类变量注释
规则一:成员变量和常量需要使用java doc形式的注释,以说明当前变量或常量的含义,注释方式为“/** */”。
示例:
/**
* 密码输入框
*/
private EditText passwrodET;
4.2.7其他注释
规则一:方法内部的注释 如果需要多行 使用/*…… */形式,如果为单行是用//……形式的注释。不要再方法内部使用 java doc 形式的注释“/**……**/”。
关键跳转需要在代码上方加上注释
示例:
@Override
public void onClick(View v)
{
switch(v.getId())
{
/*
* 响应返回按钮
*/
caseR.id.title_back_layout:
// 关闭当前页面
finish();
break;
/*
* 响应登陆按钮
*/
caseR.id.login:
break;
/*
* 响应注册按钮
*/
caseR.id.title_call_layout:
break;
/*
* 响应忘记密码按钮
*/
caseR.id.forget_password:
break;
default:
break;
}
}
4.2.8 XML注释
规则一:如果当前layout或资源需要被多处调用,或为公共使用的layout(若list_item),则需要在xml写明注释。要求注释清晰易懂。
第五章 编码规范
5.1对象释放
规则一:数据库操作、IO操作等需要使用结束close()的对象必须在try-catch-finally 的finally中close(),如果有多个IO对象需要close(),需要分别对每个对象的close()方法进行try-catch,防止一个IO对象关闭失败其他IO对象都未关闭。
示例:
try
{
// ... ...
}
catch(IOExceptionioe)
{
//... ...
}
finally
{
try
{
out.close();
}
catch (IOException ioe)
{
//... ...
}
try
{
in.close();
}
catch (IOException ioe)
{
//... ...
}
}
规则二:集合中的数据如果不使用了应该及时释放,尤其是可重复使用的集合。
说明:由于集合保存了对象的引用,虚拟机的垃圾收集器就不会回收。
5.2 异常处理
规则一:系统非正常运行产生的异常捕获后,如果不对该异常进行处理,则应该记录日志。
说明:此规则指通常的系统非正常运行产生的异常,不包括一些基于异常的设计。若有特殊原因必须用注释加以说明。
示例:
try
{
//.... ...
}
catch(IOException ioe)
{
logger.error(ioe);
}
5.3 魔鬼数字
规则一:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量或者枚举来代替。
示例:如下的程序可读性差。
if(state == 0)
{
state = 1;
... // program code
}
应改为如下形式:
privatefinal static int TRUNK_IDLE = 0;
privatefinal static int TRUNK_BUSY = 1;
privatefinal static int TRUNK_UNKNOWN = -1;
if(state == TRUNK_IDLE)
{
state = TRUNK_BUSY;
... // program code
}
5.4 控制台输出
规则一:不要使用System.out和系统logger进行控制台打印,应该使用统一封装的工具类(如:公共日志工具)进行统一记录或者打印。
说明:代码发布的时候可以统一关闭控制台打印,代码调试的时候又可以打开控制台打印,方便调试。
规则二:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。
5.5 类的定义
规则一:一个文件不要定义两个类(并非指内部类)。
说明:方便程序的阅读与代码的维护
5.6 判断语句
规则一:判断语句不要使用”*== true”来判断为真
说明:方便阅读,减少没有必要的计算
以下错误:
if(ok == true)
{
……
}
以下正确:
if(ok)
{
……
}
规则二:常量放在equals的前面,防止空指针异常。
示例:
if (“abc”.equals(bean.getName()))
{
……
}
说明:如果为bean.getName().equals(“abc”),当bean.getName()为null时,则会抛出空指针异常。
5.7 向上转型
规则一:不要写没有必要的向上强制转型。
说明:没必要写的向上强制转型会浪费性能,增加代码阅读难度
示例:以下错误:
FileInputStreamfis = new FileInputStream(f);
InputStreamis = (InputStream)fis;
5.8 重复代码
规则一:如果多段代码重复做同一件事情,那么在方法的划分上可能存在问题。
说明:若此段代码各语句之间有实质性关联并且是完成同一件功能的,那么可考虑把此段代码构造成一个新的方法。
5.9 代码复杂度
规则一:不要使用难懂的技巧性很高的语句,除非很有必要时。
说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于设计与算法。
规则二:明确方法功能,精确(而不是近似)地实现方法设计。一个函数仅完成一件功能,即使简单功能也编写方法实现。
说明:虽然为仅用一两行就可完成的功能去编方法好象没有必要,但用方法可使功能明确化,增加程序可读性,亦可方便维护、测试。
规则三:类中成员函数的圈复杂度不大于15。
规则四:一个方法只完成一项功能,在定义系统的公用接口方法外的方法应尽可能的缩小其可见性。避免用一个类是实例去访问其静态变量和方法。避免在一个较长的方法里提供多个出口:
示例:
//不要使用这钟方式,当处理程序段很长时将很难找到出口点
if(condition)
{
return A;
}
else
{
return B;
}
//建议使用如下方式
String result = null;
if(condition)
{
result = A;
}
else
{
result = B;
}
return result;
5.10 枚举的使用
规则一:2.3之前的枚举效率很低,后面google优化了,枚举可以放心使用,效率没有太大差别。
5.11 参数和返回值
规则一:避免过多的参数列表,尽量控制在5 个以内,若需要传递多个参数时,当使用一个容纳这些参数的对象进行传递,以提高程序的可读性和可扩展性。参数类型和返回值尽量接口化,以屏蔽具体的实现细节,提高系统的可扩展性,例如:
public void joinGroup(List userList){}
public List listAllUsers(){}
第六章 性能与安全
6.1 基本原则
性能的提升并不是一蹴而就的,而是由良好的编程积累的,虽然任何良好的习惯和经验所提升的性能都十分有限,甚至微乎其微,但良好的系统性能却是由这些习惯等积累而成,android性能优化涉及到大篇幅的介绍跟讲解,这边只是简单列举出几个。
6.2String 与StringBuffer
不要使用如下String 初始化方法:String str = new String(“abcdef”);这将产生两个对象,应当直接赋值:String str = “abcdef”;
在处理可变String 的时候要尽量使用StringBuffer 类,StringBuffer类是构成String类的基础。String类将StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用StringBuffer 来实现大部分的工作,当工作完成后将StringBuffer 对象再转换为需要的String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer 对象和她的append()方法。如果我们用String 对象代替StringBuffer 对象的话,将会花费许多不必要的创建和释放对象的CPU 时间。
6.3 集合
避免使用Vector 和 HashTable 等旧的集合实现,这些实现的存在仅是为了与旧的系统兼容,而且由于这些实现是同步的,故而在大量操作时会带来不必要的性能损失。在新的系统设计中不当出现这些实现,使用ArrayList 代替Vector,使用HashMap 代替HashTable。
若却是需要使用同步集合类,当使用如下方式获得同步集合实例:
Map map =Collections.synchronizedMap(new HashMap());
由于数组、ArrayList 与 Vector 之间的性能差异巨大,故在能使用数组时不要使用ArrayList,尽量避免使用Vector。
我们经常会使用到HashMap这个容器,它非常好用,但是却很占用内存,Android提供了内存效率更高的ArrayMap。
6.4 对象
避免在循环中频繁构建和释放对象。不再使用的对象应及时销毁。如无必要,不要序列化对象。
6.5 同步
在不需要同步操作时避免使用同步操作类,如能使用ArrayList 时不要使用Vector。尽量少用同步方法,避免使用太多的synchronized 关键字。尽量将同步最小化,即将同步作用到最需要的地方,避免大块的同步块或方法等。
6.6避免使用Static对象
因为static的生命周期过长,使用不当很可能导致leak,在Android中应该尽量避免使用static对象。
6.7layout嵌套层次
你可以在手机打开 设置—->开发者选项—->显示GPU过度绘制,这个开关的作用是按不同颜色值来显示布局的过度绘制,绘制的层次从最优到最差:蓝,绿,淡红,红。一般布局层次不宜过多,一般保持在绿色为比较优的界面布局。
减少布局层次可以从以下几个方面:
1.实现复杂的布局时,尽量使用RelativeLayout,由于 RelativeLayout 所需要的嵌套层次少,控件平铺是最终努力的方向,这样性能会好一些。
2.ViewStub的使用,viewStub是一个轻量级的页面,我们通常使用它来做预加载处理,来改善页面加载速度和提高流畅性,ViewStub本身不会占用层级,它最终会被它指定的层级取代。 看到页面布局里面很多gone的控件,即使是将某一个控件的visibility属性设置为不可见的gone,在整个页面加载过程中还是会加载此控件的。
第七章 工程目录
│ .gitignore
│ build.gradle
│ gradle.properties
│ local.properties
│ MyApplication.iml
│ settings.gradle
├─.gradle
├─.idea
├─app
│ │ .gitignore
│ │ app.iml
│ │ build.gradle
│ │ proguard-rules.pro
│ ├─build
│ ├─libs
│ └─src
│ ├─androidTest
│ ├─main
│ │ │ AndroidManifest.xml
│ │ ├─java
│ │ │ └─org
│ │ │ └─loader
│ │ │ └─myapplication
│ │ │ MainActivity.java
│ │ └─res
│ │ ├─drawable
│ │ ├─layout
│ │ │ activity_main.xml
│ │ ├─mipmap-hdpi
│ │ ├─mipmap-mdpi
│ │ ├─mipmap-xhdpi
│ │ ├─mipmap-xxhdpi
│ │ ├─mipmap-xxxhdpi
│ │ └─values
│ │ colors.xml
│ │ strings.xml
│ │ styles.xml
├─build
└─gradle
第八章 UI风格
简洁、易用
8.1 隐藏菜单
需要使用的功能有很多,我们可以利用滑动菜单栏,将必要的功能显示,不必要的功能隐藏起来。越来越多的导航菜单都在做减法,让显示的功能尽可能的变少,只有特定的需要使用的选项还保留在上面。
8.2. 指纹解锁的完全控制
指纹解锁初登场时,仅仅被用于解锁。手动输入密码,事实上已经成为过去。在网络飞速发展的现在我们需要更加简单快捷的途径。虽然这一技术已经进化,我想在接下来的一年,这一技术也将会得到更加飞速的发展
8.3. 模糊背景图片
使主要内容更加显眼,读起来也会更加轻松。具有魅力的可访问内容,也会让你网站的转换率变得更好。
8.4. 卡片式设计将会变得更频繁
卡片型设计,对于在移动终端上查看网页十分友好这点已被证实。实际上,越来越多的手机网页已经开始逐渐尝试使用这种方法。
将内容分割、调整内容放置在合适的地方、与相关联的信息放在一起表示等等这样的想法用卡片式设计是十分方便的。另外,在使用卡片型设计时,用户只能选择特定的动作,所以设计可以专注于你觉得必要的内容上进行。
由于卡片型设计,用户可以上传属于自己的多媒体(例如Twitter 的动画或图片等等),可以为你的网站创造更多的流量。
8.5. 娱乐与个性化
文化是界面设计变更的重要因素。
8.6. 纸质化设计
纸质化设计是2014年在Google 上发表的较为新颖的视觉语言。一经发布便马上在互联网上流传开来,对于移动终端设计来说是革命性的发现。
在今天很多优秀的APP或网页设计都利用了简约的效果来表现出纸质化设计。同时纸质化设计,与常年被使用的卡片化设计也有着密不可分的关系
8.7. 精挑细选的配色
少即是多
无论何时都必须保持简洁,尤其是在于颜色打交道的时候。
同色系,类似色,邻近色,:能够保持页面的统一,和谐。纯度的不同来区分轻重
对比色,遵循规律,大统一,小对比。在暖色调中,处理冷色调,降低其纯度。反之相同
中性色,整个颜色的融合。
第九章 打包相关
9.1 签名使用jks签名
http://blog.csdn.net/yy1300326388/article/details/48344411
9.2 混淆
https://www.cnblogs.com/zhen-android/p/6014336.html
9.3 加固使用腾讯的乐加固
http://wiki.open.qq.com/wiki/%E5%BA%94%E7%94%A8%E5%8A%A0%E5%9B%BA
第十章 app应用市场市场
主要以腾讯应用宝市场与华为市场为主,下面较全面地列举了国内常用的安卓市场:
百度应用中心 http://app.baidu.com
小米 http://market.xiaomi.com/dev
安智市场 http://dev.anzhi.com
360 http://dev.app.360.cn/app/list
机锋市场 http://dev.gfan.com
OPPO http://store.nearme.com.cn
腾讯应用宝 http://open.qq.com/
掌上应用汇 http://dev.appchina.com/market/dev/main.action
魅族应用商店 http://developer.meizu.com
乐商店 http://developer.lenovomm.com
优亿市场 http://dev.eoemarket.com
酷安 http://www.coolapk.com
木蚂蚁 http://dev.mumayi.com
非凡软件 http://u.crsky.com
沃商店 http://dev.wo.com.cn
豌豆荚 http://www.wandoujia.com
淘宝应用中心/pp助手http://dev.pp.cn
乐视 http://open.letv.com/
搜狗应用市场 http://zhushou.sogou.com/
华为 http://developer.huawei.com/
N多市场 http://nduoa.com/developer/apk/index
易用汇 http://dev.anzhuoapk.com
三星应用商店 http://seller.samsungapps.com
网易应用商店 http://m.163.com/dev/
锤子 http://dev.smartisan.com
安卓网 http://pt.pc6.com/member/
冒泡堂 http://cp.mopo.com
历趣 http://dev.liqucn.com
多特下载 http://www.duote.com/soft/56884.html
移动MM http://dev.10086.cn/?fw=501010
当乐安致 http://www.d.cn/appsubmit.html
酷派 http://www.coolmart.net.cn/developer/coolmart/index.jsp
zol http://xiazai.zol.com.cn/author/login.php
泡椒 http://www.paojiao.cn/
中兴汇天地 http://apps.ztems.com/
酷派 http://dev.yulong.com/
西西软件园 http://www.cr173.com/public.html
木子软件 http://www.muzisoft.com/open/
迅游网 http://www.yxdown.com/AboutUs/swhz.html
斯凯冒泡市场 http://open.mopo.com/
安卓在线 http://www.androidonline.net/
易优市场 http://www.eomarket.com/
飞流 http://dev.feiliu.com/reg/regnoticecom
阿里云 http://appdev.yunos.com/#myapp/spu_list
谷歌应用市场https://play.google.com/apps/publish/signup