Android项目规范文档

1.项目结构

现在的MVP模式越来越流行。就默认采用了。如果项目比较小的话:

  • app——Application Activity Fragment Presenter等的顶级父类

  • config——API,常量表等

  • model——数据层
    —— entities——数据模型

  • presenter——MVP的P

  • service——服务

  • ui——MVP的V

  • utils——工具类集合

  • widget——各个可复用View集合

如果项目比较大,上面的方式一定会造成presenter和view里近百个文件。看瞎眼系列。推荐下列方式:

  • app

  • config

  • model
    —— entities

  • module——将界面层以功能模块分配包。
    —— launch
    —— main
    —— account
    —— news
    —— music
    ……

  • utils

  • widget

2.配置主题

对于不遵守Material Design的项目无视这一步。
1.先在color.xml中写好需要的颜色:

<resources> 
  <color name="Orange">#ff5722</color> 
  <color name="DeepPurple">#673AB7</color> 
  <color name="DeepPurple900">#311B92</color> 
  <color name="White">#fff</color> 
  <color name="Gray">#888888</color> 
  <color name="Gray100">#dddddd</color> 
  <color name="Gray600">#999999</color>
</resources>

注意color.xml是配色表。应该是描述颜色而不是对字体颜色,背景颜色等的定义。这样能防止相近的颜色重复定义。而导致界面颜色不统一。

2.在style.xml里定义主题:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> 
  <!-- Customize your theme here. --> 
  <item name="colorPrimary">@color/DeepPurple</item> 
  <item name="colorPrimaryDark">@color/DeepPurple900</item> 
  <item name="colorAccent">@color/Orange</item>
</style>

<style name="AppTheme" parent="AppTheme.Base"></style>

在res目录下,创建一个values-v21目录,再创建一个style.xml:

<style name="AppTheme" parent="AppTheme.Base">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
    <item name="android:statusBarColor">?colorPrimaryDark</item>
</style>

然后在AndroidManifest.xml文件中修改application的theme属性为上面定义的AppTheme.即可实现沉浸式状态栏。

3.依赖库与SDK

常选的库:

  • gradle-retrolambda
    Android的lambda表达式插件

  • Glide
    Android最屌图片加载库

  • butterknife
    View注解库和配套插件[android-butterknife-zelezny]

  • (https://github.com/avast/android-butterknife-zelezny)

  • okhttp
    网络请求

  • 'com.android.support:design:23.0.1'
    谷歌Material Design控件库

  • EasyRecyclerView
    支持下拉上拉刷新等功能全面的RecyclerView

  • SwipeBackHelper
    Activity滑动关闭支持库,能达到微信效果

  • RxJava
    观察者模式的事件消息交互框架

  • RxAndroid
    支持在Android 中通过Rx切换到主线程

  • RxBus
    提供如EventBus一般使用的Rx框架

  • RxPermissions
    提供在Rx上来管理Android M (Android6.0)的动态权限框架

  • RxLifecycle
    解决Rx因为观察者在订阅后Fragment持有context导致内存泄漏的问题

  • Eventbus
    翻译为事件总线,用于解决android中的事件交互和回调.同Rx一样也是观察者模式

  • retrofit
    android中的通讯注解框架,用于发送http请求.配合Rx能达到高效的开发速度

  • BaseRecyclerViewAdapterHelper
    如名字一样他是RecyclerView的适配器超类库.支持各种姿势写adapter,轻松减少大量重复代码.

  • AndroidAutoLayout
    国内大神张鸿洋出的布局框架.很不错.减少大量布局调优工作

  • zxing
    老牌二维码扫描框架

  • compressor
    图片压缩框架,压缩率很高.支持配置.Api友好

  • RxBinding
    可以实现数据层与View层的绑定,当数据发生变化,View会自动更新UI。还有其他功能非常强大(MVVM)

  • PhotoView
    可根据手势进行缩放的图像库,这个也很常见

  • AndroidImageSlider
    展示头部Banner的库,动画效果很多,不过需要依赖picasso和nineoldandroids这两个库
  • FlycoTabLayout
    样式比TabLayout多样的Tab库

  • ijkplayer
    B站出品的视频解码库

  • DanmakuFlameMaster
    同样B站出品的弹幕库

  • ShineButton
    炫酷效果的点击按钮,主要用于显示收藏之类的动画

  • Android-SpinKit
    集成多种动画效果的Drawable,之前有看源码觉得代码封装得挺好,动画不仅仅只能用在View上

  • Tinker
    微信Android热补丁方案,功能强大,和其它热修补方案对比看这里wiki

  • Jsoup
    抓取网页数据

  • SwitchButton
    SwitchButton按钮

  • MaterialSpinner
    一个通用的Spinner

  • TagLayout
    标签布局功能,还可以单独作为特殊点击效果的按钮

  • Tiny
    图片处理框架,让你压缩图片等不再是问题

  • transitions framework
    动画框架

融云——即时通讯
友盟——数据统计,推送,意见反馈,自动更新,第三方分享及登录,社区
七牛——云存储
Mob——短信验证
Bmob——做后台不求人

依赖这一大堆库和SDK以后。建议在合适的时机初始化他们,而不是全堆在Application的onCreate()里面。这样会导致启动时间过长。启动后也会较卡。虽然是不会影响功能正常使用。

4.配置Gradle

某些SDK运行时需要检查签名是否正确。所以在debug模式时也必须用正式KEY签名。而把签名放进版本控制不是明智的做法。所以推荐下面的做法:在app的gradle加入下面代码

Properties props = new Properties()
props.load(new FileInputStream(file("signing.properties")))
android { 
  signingConfigs { 
    release{ 
      keyAlias props['KEY_ALIAS'] 
      keyPassword props['KEY_PASSWORD'] 
      storeFile file(props['KEYSTORE_FILE']) 
      storePassword props['KEYSTORE_PASSWORD'] 
    } 
   } 
  buildTypes { 
    release { 
      signingConfig signingConfigs.release 
    } 
    debug { 
        signingConfig signingConfigs.release 
      } 
   }
}

在app的gradle文件同级目录新建signing.properties文件,里面填入你的key的相应信息

KEYSTORE_FILE = C:\\Users\\Mr.Jude\\Documents\\Android\\HelloWorld.jksKEYST
ORE_PASSWORD = xxxxxx
KEY_ALIAS = xxxxxx
KEY_PASSWORD = xxxxxx

将signing.properties添加进忽略目录。其他人pull下来代码后。自己新建signing.properties填入相应信息后即可编译成功。

5.制定开发规范
命名规范
  • 包名全部采用小写

  • 常量、枚举等均采用大写形式,用下划线区分各单词。使用static final

private static final String TAG = "XXXX"
  • 类名、接口名、枚举名。第一个和后面的单词都要第一个字母大写
MainActivity,InstalledAppDetails
  • 资源文件命名
activity_main
fragment_account
item_person
include_toolbar
view_progress

不过对于庞大项目的开发。近百个activity开头的layout列表还是会眼瞎。所以那种情况会在前面加上模块名。
id命名,例

btn_send
tv_name
list_persons
et_password
  • 然后用butterknife的插件生成变量会自动将下划线变成驼峰命名
    变量命名:以m开头。例
mAdapter
  • 注意图片文件命名只能用小写字母、数字,否则会导致R文件无法编译出来

  • 继承自安卓组件的类,一般采用父类名作为后缀,

class LoginActivity extends Activity{}
  • 自定义异常必须以Exception结尾

  • 全局变量添加所有者前缀:实例成员变量前缀m(表示member),类静态变量前缀s(表示static)

protected ContentResolver mContentResolver;
  • 控件变量添加组件前缀,控件前缀+控件属性,控件缩写
button->btnLogin,或者bt_login;
  • 全局名称mBtnNext局部名称
btnNext
  • 构造方法采用递增方式(参数多的写在后面),参数少的调用参数多的构造函数。这样也减少初始化代码。比如开源库
PagerSlidingTabStrip
编码规范
  • 源文件编码格式为 UTF-8。

  • 服务端可以实现的,就不要放在客户端

  • 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大

  • 处理应用全局异常和错误,将错误以邮件的形式发送给服务端

  • 图片的.9处理

  • 使用静态变量方式实现界面间共享要慎重

  • 单元测试(逻辑测试、界面测试)

  • 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突

  • activity中在一个View.OnClickListener中处理所有的逻辑

  • strings.xml中使用%1$s实现字符串的通配

  • 数据一定要效验,例如字符型转数字型,如果转换失败一定要有缺省值;

  • 服务端响应数据是否有效判断

  • 对于未完成的方法,使用TODO加以标记

  • 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记
    若代码存在严重问题或仅用于调试,使用FIXME加以标记

  • values目录下文件名称较固定,不得随意更改

提交规范
  • 代码及时更新,不要和服务器有太大的差别,减少merge的log

  • 提交代码时,如果出现冲突,必须仔细分析解决,才可提交

  • 提交代码之前先在本地进行测试,确保项目能编译通过,且能够正常运行,本地没有验证的代码原则上不允许提交

  • 必须保证服务器上的版本是正确的,项目有错误时,不要进行提交
    提交之前先更新代码

  • 提交时注意不要提交本地自动生成的文件,比如我们AndroidStudio项目中的 idea,build文件夹是不需要提交的

  • 不要提交自己不明白的代码

  • 提前协调好项目组成员的工作计划,减少冲突

  • 对提交的信息尽量写得详细,方便后续定位问题;最好使用提交模板

[CAUSE]     :
[SOLUTION]  :
[REVIEW]    : Own
[SIDEEFFECT]: without side effects
[PROJECT]   : V3
[CR]        :V3 SM-2182
[MODULAR]   :
modified:   src/com/android/settings/applications/InstalledAppDetails.java
架构设计规范

为了避免合作开发写的代码风格迥异。或做出了多套开发模式。下面是个例子。毕竟是为了高效开发而制定的。适合自己项目的才是最好。

  • 所有Activity继承BaseActivity

  • 所有Fragment继承BaseFragment

  • 所有Presenter继承BasePresenter
    这样利于生命周期管理。也可以方便的全局修改。命名,例

AccountFragment
UserDetailActivity
  • 通过引入 Event Bus(事件总线,这个项目使用的是otto)。它允许我们在Data Layer中发送事件,以便View Layer中的多个组件都能够订阅到这些事件。比如DataManager 中的退出登录方法可以发送一个事件,订阅这个事件的多个Activity在接收到该事件后就能够更改它们的UI视图,从而显示一个登出状态。 当然你也可以有很多的选择,EventBus,Otto,自定义RxBus等。减少回调。

  • 定好网络请求写法。文件存储方式与位置。写好项目所使用的类库框架用法。

  • 对于有键盘的页面,默认不弹键盘
android:windowSoftInputMode="stateHidden|adjustResize" 
维护性

1.代码规范 2.框架稳定性 3.封装 4.耦合

扩展性:

1.抽象接口 2.元素重用 3.单一职责 4.替换性 5.耦合

安全性:

1.数据安全性 数据安全就包括数据抓取、数据拦截以及数据修改 2.操作安全性 避免对一个操作重复执行

6.style 文件

针对style文件越来越大,可以将其分离如styles.xml, styles_home.xml, styles_item_details.xml, styles_forms.xml不同的资源目录在res/values中是任意的

7.意识到WebView的问题
  • 加载网页时不要处理HTML文件
  • 避免使用WebView显示简单的Text和Button
8.测试框架
  • Android Gradle发布了connectedAndroidTest ,是JUnit的一个扩展,可以测试程序员创建的JUnit Test
  • 使用** Robolectric**进行单元测试,而非UI测试
  • 使用Robotium进行UI测试

其他

android:screenOrientation="portrait"  //强制竖屏(只针对activity)
android:exported="true"//在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。(四大组件都有这个属性)
android:launchMode="singleTask"//主界面

android:largeHeap="true"  //可以使用的最大内存值
android:hardwareAccelerated="true"  //启动硬件加速,(占用内存)
android:windowSoftInputMode="adjustPan|stateHidden"//输入法问题
android:supportsRtl="true"//支持从右到左right-to-left )的布局
android:process="com.github.obsessive.simplifyreader.application"   //应用进程

android:animateLayoutChanges="true"//View的伸展动画
android:hardwareAccelerated="true"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,426评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 女儿的寒假作业,因为我的疏漏,听错了老师的要求,导致了数学作业少做了两个周的练习。 有一天女儿回来,有些沮丧,说老...
    典奇nvc阅读 1,800评论 3 2
  • 人这一辈子,真的不容易。事业成败,名利得失,生活好坏,幸福与否……谁也避之不开,这些无不让人彷徨、抉择、苦恼、郁闷...
    朋友如天阅读 1,933评论 1 6