[Android] Android 开发规范

Posted by xiuyuantech on 2026-03-19

Google官方Java代码风格参考规范链接,中文翻译参考版链接
本文档用于指导开发人员在项目开发过程中类名、资源文件名、变量名等开发约定以及命名规范,方便工程的后期维护,提高代码整体质量、可读性。

命名规范

注意:即使纯拼音命名方式也要避免采用。但alibaba、taobao、youku、hangzhou等国际通用的名称,可视同英文。

  1. 包命名

    规则:包名全部小写,采用反域名命名规则,一级包名是顶级域名,通常为com, edu, gov, net, org等,二级包名,通过为公司名或部门名或者个人名,三级包名通常为项目名,四级包名为模块名或者层级名。以下是从层级包名来划分android项目中采用的包划分结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    com.domain.xxx.activity  //用户界面中所有的Activity类
    com.domain.xxx.fragment //界面中所有的Fragment类
    com.domain.xxx.adapter //界面中所有的Adapter类(适配器类)
    com.domain.xxx.view //自定义的View类
    com.domain.xxx.service //后台Service类
    com.domain.xxx.util //项目中常用的公共工具类(网络, IO, 日志等)
    com.domain.xxx.bean //实体模型类
    com.domain.xxx.db //数据库操作相关的类
    com.domain.xxx.config //所有的配置相关的类
    com.domain.xxx.api //网络api接口相关de 类
  2. 类命名

    规则:采用大驼峰式命名法,首字母大写,尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称包含单词缩写,则单词缩写的每个字母均应大写。以下列举的是android中几种最为常用的类的命名。

    1
    2
    3
    4
    5
    6
    7
    class LoginActivity;     //activity类
    class DiscoverFragment; //fragment类
    class AnalysisService; //service类
    class WakeupRankAdapter; //adapter类
    class StringUtils; //工具类
    class UserBean; //模型类
    class ApiImpl; //接口实现
  3. 接口命名

    规则:命名规则与类命名一样采用大驼峰式命名法,首字母大写,多以able, ible, er结尾。

    1
    2
    3
    interface Comparable;
    interface Accessible;
    interface OnClickListener;

    注意:如果项目采用MVP/MVI,所有Model、View、Presenter/Intent的接口都以I为前缀,不加后缀,其他的接口采用上述命名规则。

  4. 方法

    规则:采用小驼峰命名法,首字母小写,方法名采用动词或动名词结构。方法的命名应该与方法的真正行为具有对应关系,下面给出一些方法名的动词前缀标示的建议。

    方法名 描述
    getXX() 获取某个属性的返回值
    setXX() 设置某个属性值
    initXX() 初始化方法,如初始化布局initView()
    isXX() 判断是否true的方法;
    checkXX() 与isXX意义等价
    processXX() 处理数据
    updateXX() 更新数据
    saveXX() 保存数据
    addXX() 添加数据
    deleteXX() 删除数据
    resetXX() 重置数据
    clearXX() 清除数据
    removeXX() 移除数据或者视图等,如removeView();
    drawXX() 绘制数据或者视图
  5. 常量

    规则:常量使用全大写字母加下划线的方式命名。

    1
    2
    public static final int TAG= "tag";
    public static final int START_CLASS_NOT_FOUND = -2;
  6. 变量

    规则:采用小驼峰命名法,首字母小写。变量名应简短且能描述其用途,尽量避免拼音,无意义地缩写。除非是临时变量,否则不建议使用单个字符的变量名,如i, j, k。对于变量命名,还有一种风格是google的以字母m为前缀(m为member缩写),在android 源码中随处可见。

    1
    2
    private int userName;  //java的一般性风格
    private int mUserName; //google的成员变量风格,m为member的缩写

    更多还可参考阿里巴巴Java开发手册
    注意:所有的VO(值对象)统一采用标准的lowerCamelCase风格编写,所有的DTO(数据传输对象)就按照接口文档中定义的字段名编写。

  1. 控件变量名

    规则:首先需要满足第6条变量的规则, 模式:逻辑名 + view缩写

    1
    2
    Button sendNewsBtn;
    TextView passwordTxt;
  2. 控件ID

    规则:view缩写_模块名_逻辑名

    1
    android:id="@+id/btn_news_send"  //样例
    View 缩写
    TextView txt
    EditText edit
    Button btn
    ImageButton ibtn
    ImageView img
    ListView lv
    RadioGroup rgroup
    RadioButton rbtn
    ProgressBar rbar
    SeekBar seek
    CheckBox cb
    Spinner spinner
    TableLayout table
    TableRow row
    LinearLayout ll
    RelativeLayout rl
    ScrollView scroll
    SearchView search
    TabHost thost
    TabWidget twidget
  3. layout的文件命名

    规则:全部小写,采用下划线命名法。layout文件命名:组件类型_{模块_}功能.xml

    1
    activity_news_title.xml //样例
    命名规范 组件类型
    activity_{模块_}功能 Activity命名格式
    fragment_{模块_}功能 Fragment命名格式
    dialog_{模块_}功能 Dialog命名格式
    popup_{模块_}功能 PopupWindow命名格式
    item_list_{模块_}功能 ListView的item命名格式
    item_grid_{模块_}功能 GridView的item命名格式
  4. drawable的文件命名

    模式:前缀{_控件}{_范围}{_后缀},控件、范围、后缀可选

    1
    bg_login_pressed.png //样例
    drawable 命名细则
    图标类 添加ic前缀
    背景类 添加bg前缀
    分隔类 添加div前缀
    默认类 添加def前缀
    区分状态时,默认状态 添加normal后缀
    区分状态时,按下时的状态 添加pressed后缀
    区分状态时,选中时的状态 添加selected后缀
    区分状态时,不可用时的状态 添加disable后缀
    多种状态的 添加selector后缀
  5. 动画的文件命名

    规则:模块名{范围}动画类型_动画方向。

    1
    login_fade_in.xml //样例
    动画命名 描述
    fade_in 淡入
    fade_out 淡出
    push_down_in 从下方推入
    push_down_out 从下方推出
    slide_in_from_top 从头部滑动进入
    zoom_enter 变形进入
    shrink_to_middle 中间缩小
  6. strings.xml

    模式:activity名_{范围_}逻辑名

    1
    <string name="login_username">用户名</string> //样例
  7. colors.xml

    模式:前缀{_控件}{_范围}{_后缀}, 控件、范围、后缀可选。

    1
    <color name="bg_login">#FFFFFF</color> //样例
    colors 命名细则
    背景颜色 添加bg前缀
    文本颜色 添加text前缀
    分割线颜色 添加div前缀
    区分状态时,默认状态的颜色 添加normal后缀
    区分状态时,按下时的颜色 添加pressed后缀
    区分状态时,选中时的颜色 添加selected后缀
    区分状态时,不可用时的颜色 添加disable后缀

代码风格

原则

  • 不要直接忽略Exceptions,例如下面的示例:

    1
    2
    3
    4
    5
    void setServerPort(String value) {
    try {
    serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) { }
    }

    正确的做法应该如下:

    1
    2
    3
    4
    5
    6
    7
    void setServerPort(String value) throws ConfigurationException {
    try {
    serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
    throw new ConfigurationException("Port " + value + " is not valid.");
    }
    }
  • import采用完全限定名

    1
    2
    //import foo.*; //不提倡
    import foo.Bar; //正确做法
  • 括号风格

    不提倡:

    1
    2
    if (condition)
    body();

    正确做法:

    1
    2
    3
    if (condition){
    body();
    }
  • 使用空格来缩进

    使用4个空格缩进来代表块,而绝不使用tab键; 使用8个空格来代表行包裹,包括函数调用。

注释规范

  • 类注释

    每个类完成后应该有作者姓名和联系方式的注释,对自己的代码负责。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * <pre>
    * author : Blankj
    * e-mail : xxx@xx
    * time : 2017/03/07
    * desc : xxxx描述
    * version: 1.0
    * </pre>
    */
    public class WelcomeActivity {
    ...
    }

    具体可以在AS中自己配制,Settings → Editor → File and Code Templates → Includes → File Header,输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /**
    * <pre>
    * author : ${USER}
    * e-mail : xxx@xx
    * time : ${YEAR}/${MONTH}/${DAY}
    * desc :
    * version: 1.0
    * </pre>
    */

    这样便可在每次新建类的时候自动加上该头注释。

  • 方法注释

    每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释。
    在方法前一行输入/** + 回车或者设置Fix doc comment(Settings → Keymap → Fix doc comment)快捷键,AS便会帮你生成模板,我们只需要补全参数即可,如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
    *
    * @param hasChanged
    * @return
    *
    */
    public boolean onChange(boolean hasChanged) {
    // 发送更新UI的消息
    mHandler.sendMessage(mHandler.obtainMessage(0x2));
    return true;
    }
  • 块注释

    块注释与其周围的代码在同一缩进级别。它们可以是/* … /风格,也可以是// …风格(//后最好带一个空格)。
    对于多行的/
    /注释,后续行必须从开始, 并且与前一行的*对齐。以下示例注释都是OK的。

    1
    2
    3
    4
    /*
    * This is // And so /* Or you can
    * okay. // is this. * even do this. */
    */

    注释不要封闭在由星号或其它字符绘制的框架里。Tip:在写多行注释时,如果你希望在必要时能重新换行(即注释像段落风格一样),那么使用/* ... */。

  • 资源文件注释

    1
    2
    3
    4
    <!--红色 -->
    <color name="red">#FF0000</color>
    <!--深蓝色 -->
    <color name="dark_blue">#0079FF</color>

总结

  • 好的命名规则能够提高代码质量,使得新人加入时降低理解难度;

  • 规矩终究是死的,适合团队的才是最好的;

  • 命名规范需要团队齐心协力来维护,在团队里谁都不可能独善其身;

  • 刚刚开始可能会有些不习惯,持之以恒,总会成功的。