美文网首页Android开发干货
Android项目规范文档

Android项目规范文档

作者: 黄海佳 | 来源:发表于2017-04-24 14:50 被阅读157次
    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"

    相关文章

      网友评论

      • 勤知:总结的很到位,赞一个

      本文标题:Android项目规范文档

      本文链接:https://www.haomeiwen.com/subject/pqkpzttx.html