個(gè)人總結(jié)的 Android 開發(fā)規(guī)范,其中控件縮寫及 Android 資源文件命名部分不是很確定,有待商榷。Java 部分編程風(fēng)格請參考:Google Java 命名規(guī)范。
2017-02-13 更新:2017年開春之際,誠意獻(xiàn)上重磅大禮:阿里巴巴Java開發(fā)手冊,首次公開阿里官方Java代碼規(guī)范標(biāo)準(zhǔn)。這套Java統(tǒng)一規(guī)范標(biāo)準(zhǔn)將有助于提高行業(yè)編碼規(guī)范化水平,幫助行業(yè)人員提高開發(fā)質(zhì)量和效率、大大降低代碼維護(hù)成本。點(diǎn)此下載
約定
-
統(tǒng)一調(diào)整 IDE 的編碼方式為 UTF-801
-
統(tǒng)一調(diào)整 IDE 的 Tab 縮進(jìn)為 4 個(gè)空格0
-
花括號不要單獨(dú)一行,和它前面的代碼同一行。而且,花括號與前面的代碼之間用一個(gè)空格隔開。
public void method() { // Good } public void method() { // Bad } public void method(){ // Bad } -
空格的使用:if、else、for、switch、while等邏輯關(guān)鍵字與后面的語句留一個(gè)空格隔開。
// Good if (booleanVariable) { // TODO while booleanVariable is true } else { // TODO else } // Bad if(booleanVariable) { // TODO while booleanVariable is true }else { // TODO else } // 運(yùn)算符兩邊各用一個(gè)空格隔開。 int result = a + b; //Good, = 和 + 兩邊各用一個(gè)空格隔開 int result=a+b; //Bad,=和+兩邊沒用空格隔開 // 方法的每個(gè)參數(shù)之間用一個(gè)空格隔開。 public void method(String param1, String param2); // Good,param1后面的逗號與String之間隔了一個(gè)空格 public void method(param1, param2); // Good,方法調(diào)用時(shí),param1后面的逗號與param2之間隔了一個(gè)空格 public void method(param1,param2); // Bad,沒有用一個(gè)空格隔開 -
空行的使用,拒絕拖沓無分割,關(guān)聯(lián)代碼段放一塊并與后面代碼分割
- 兩個(gè)方法之間
- 方法內(nèi)的兩個(gè)邏輯段之間
- 方法內(nèi)的局部變量和方法的第一條邏輯語句之間
- 常量和變量之間
- 方法名和方法內(nèi)第一條語句不要有空格
Activity.onCreate(),F(xiàn)ragment.onActivityCreated(),作為程序入口,不要寫入太多代碼,盡量保持只調(diào)用 initXXX() 方法,簡單明了展示調(diào)用過程。如:initData(),initView()。可在 BaseActivity 、 BaseFragment 中實(shí)現(xiàn) init 執(zhí)行順序,子類實(shí)現(xiàn),即 模板方法模式。
Application 中只執(zhí)行應(yīng)用初始化相關(guān)操作,盡量不要涉及業(yè)務(wù)邏輯。如有,請單獨(dú)剝離。參考第 6 條
單個(gè)方法體不要過長,最好不要超過一屏,豎屏顯示器請無視~
一行聲明一個(gè)變量,不要一行聲明多個(gè)變量,這樣有利于寫注釋。
代碼任何地方不要拼錯(cuò)單詞
-
代碼必須格式化
Windows:CTRL + ALT + L Mac:OPTION + COMMAND + L 文字大小的單位統(tǒng)一用 sp,元素大小的單位統(tǒng)一用 dp;應(yīng)用中的字符串統(tǒng)一在
/values/strings.xml中定義;顏色值統(tǒng)一在/values/colors.xml中定義;菜單定義統(tǒng)一放在/menu/****.xml中;自定義View 屬性統(tǒng)一在/values/attrs.xml中;自定義drawable 文件統(tǒng)一在/drawable/****.xml中;自定義樣式統(tǒng)一在/values/styles.xml。調(diào)用方法保持“臨近原則”,被調(diào)用的方法,放在調(diào)用方法下方
-
用好 TODO 標(biāo)記
- 記錄想法,記錄功能點(diǎn),開發(fā)過程中可以利用 TODO 記錄一下臨時(shí)想法或?yàn)榱瞬淮驍_思路留下待完善的說明
- 刪除無用 TODO ,開發(fā)工具自動(dòng)生成的 TODO ,或則已經(jīng)完善的 TODO ,一定要?jiǎng)h除。
-
處理“魔法數(shù)字”等看不懂的神秘?cái)?shù)字
- 代碼中不要出現(xiàn)數(shù)字,特別是一些標(biāo)識(shí)不同類型的數(shù)字。
- 所有意義數(shù)字全部抽取到 Constant 公共類中,避免散布在各位類中。
- 所有有意義的字符串公共常量全部抽取到 Constant 公共類中
命名規(guī)范
命名除了要遵守以下規(guī)范,還得見名知意。
類和接口命名
使用大駝峰規(guī)則,用名詞或名詞詞組命名,每個(gè)單詞的首字母大寫。
以下為幾種常用類的命名:
- Activity 類,命名以 Activity 為后綴,如:
LoginActivity - Fragment 類,命名以 Fragment 為后綴,如:
LoginFragment - Service 類,命名以 Service 為后綴,如:
DownloadService - Adapter 類,命名以 Adapter 為后綴,如:
CouponAdapter - 工具類,命名以 Util 為后綴,如:
EncryptUtil - 模型類,命名以 Info 為后綴,如:
UserInfo - 接口實(shí)現(xiàn)類,命名以 Impl 為后綴,如:
ApiImpl
方法命名
使用小駝峰規(guī)則,用動(dòng)詞命名,第一個(gè)單詞的首字母小寫,其他單詞的首字母大寫。以下為幾種常用方法的命名:
- 初始化方法,命名以 init 開頭,例:initView()
- 按鈕點(diǎn)擊方法或 Activity 跳轉(zhuǎn)方法,命名以 to 開頭,例:toLogin()、toMainActivity()
- 設(shè)置方法,命名以 set 開頭,例:setData()
- 具有返回值的獲取方法,命名以 get 開頭,例:getData()
- 通過異步加載數(shù)據(jù)的方法,命名以 load 開頭,例:loadData()
- 布爾型的判斷方法,命名以 is 或 has ,或具有邏輯意義的單詞如 equals ,例:isEmpty()
常量命名
全部為大寫單詞,單詞之間用下劃線分開。常量一般放在 Constant 類
- Intent 參數(shù)以 PARAM_EXTRA 開頭
// Intent 參數(shù)
public final static String PARAM_EXTRA_ID = "id";
public final static int PAGE_SIZE = 20;
變量命名
使用駝峰規(guī)則,首字母必須小寫,使用名詞或名詞詞組。要求簡單易懂,富于描述,不允許出現(xiàn)無意義或錯(cuò)誤單詞。
- 普通成員變量命名以
mCamelCase樣式命名,靜態(tài)變量以sCamelCase命名 -
boolean 類型的成員變量命名可以不遵循第一條,以
lowerCamelCase樣式命名 - 控件變量命名都已 控件縮寫 + 控件作用 來命名,如:登錄按鈕命名為 mBtnLogin;
- 參數(shù)變量、臨時(shí)變量都已
lowerCamelCase樣式命名
public class MainActivity extends Activity {
private Button mBtnLogin;
private boolean isLaunch;
private boolean isEmpty(String text) {
// Todo...
}
}
補(bǔ)充:如果你使用 Android Studio 為開發(fā)工具,則可以通過如下方式設(shè)置變量前綴

控件縮寫
常見控件縮寫約定如下:
- TextView: tv
- EditText: edt
- Button: btn
- RadioButton: rb
- ImageButton: ib
- ImageView: iv
- RelativeLayout/LinearLayout/FrameLayout: rl , ll , fl
- ListView: lv
- WebView: web
- CheckBox: cbx
控件 id 命名
控件縮寫_含義
<!-- 這是標(biāo)題欄的標(biāo)題 -->
<TextView
android:id="@+id/tv_header_title"
... />
<-- 這是登錄按鈕 -->
<Button
android:id="@+id/btn_login"
... />
布局文件命名
Activity 布局:activity_類名.xml,建議使用 Android Studio 生成(Command + N)
Fragment 布局:fragment_類名.xml
控件布局:widget_控件名.xml 或 layout_控件名.xml
Adapter Item 布局:item_適配器名.xml
strings.xml 命名
類型{范圍}功能,范圍可選。
以下為幾種常用的命名:
- 頁面標(biāo)題,命名格式為:title_頁面
- 按鈕文字,命名格式為:btn_按鈕事件
- 標(biāo)簽文字,命名格式為:label_標(biāo)簽文字
- 選項(xiàng)卡文字,命名格式為:tab_選項(xiàng)卡文字
- 消息框文字,命名格式為:toast_消息
- 編輯框的提示文字,命名格式為:hint_提示信息
- 圖片的描述文字,命名格式為:desc_圖片文字
- 對話框的文字,命名格式為:dialog_文字
- menu 的 item 文字,命名格式為:menu_文字
colors.xml 命名
前綴{控件}{范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個(gè)。
- 背景顏色,添加 bg 前綴
- 文本顏色,添加 text 前綴
- 分割線顏色,添加 div 前綴
- 區(qū)分狀態(tài)時(shí),默認(rèn)狀態(tài)的顏色,添加 normal 后綴
- 區(qū)分狀態(tài)時(shí),按下時(shí)的顏色,添加 pressed 后綴
- 區(qū)分狀態(tài)時(shí),選中時(shí)的顏色,添加 selected 后綴
- 區(qū)分狀態(tài)時(shí),不可用時(shí)的顏色,添加 disable 后綴
如:bg_loading_selected
drawable的命名
- 圖標(biāo)類,添加 ic 前綴
- 背景類,添加 bg 前綴
- 分隔類,添加 div 前綴
- 默認(rèn)類,添加 def 前綴
- 區(qū)分狀態(tài)時(shí),默認(rèn)狀態(tài),添加 normal 后綴
- 區(qū)分狀態(tài)時(shí),按下時(shí)的狀態(tài),添加 pressed 后綴
- 區(qū)分狀態(tài)時(shí),選中時(shí)的狀態(tài),添加 selected 后綴
- 區(qū)分狀態(tài)時(shí),不可用時(shí)的狀態(tài),添加 disable 后綴
- 多種狀態(tài)的,添加 selector 后綴(一般為 ListView 的 selector 或按鈕的 selector )
如:ic_launcher_pressed
注釋規(guī)范
類和接口注釋
類和接口統(tǒng)一添加javadoc注釋,格式如下:
/**
* 類或接口的描述信息
*
* @author ${USER}
* @date ${DATE}
*/
public interface Login {
}
方法注釋
下面幾種方法,都必須添加注釋,說明該方法的用途和參數(shù)說明,以及返回值。如不添加注釋,方法和參數(shù)命名都要見名知意
- 接口中定義的所有方法
- 抽象類中自定義的抽象方法
- 抽象父類的自定義公用方法
- 工具類的公用方法
/**
* 登錄
*
* @param loginName 登錄名
* @param password 密碼
* @param listener 回調(diào)監(jiān)聽器
*/
public void login(String loginName, String password, ActionCallbackListener listener);
變量和常量注釋
下面幾種情況下的常量和變量,都要添加注釋說明,優(yōu)先采用 右側(cè)// 來注釋,若注釋說明太長則在上方添加注釋。
- 接口中定義的所有常量
- 公有類的公有常量
- 枚舉類定義的所有枚舉常量
- 實(shí)體類的所有屬性變量
public static final int TYPE_CASH = 1; // 現(xiàn)金券
public static final int TYPE_DEBIT = 2; // 抵扣券
public static final int TYPE_DISCOUNT = 3; // 折扣券
private int id; // 券id
private String name; // 券名稱
private String introduce; // 券簡介
發(fā)布及安全
版本管理
版本管理一般使用 Git
- 打包前必須pull一下代碼
- 打包發(fā)版后,打上tag,push代碼
- 打包后記得保存未加密過的包和mapping文件
建議使用 Git 進(jìn)行版本管理,正式打包前先 pull 一下代碼,保證發(fā)布版本為最新代碼;版本發(fā)布后,打 tag 并 push 到服務(wù)器
-
正式版本需要打開 混淆,防止被反編譯,gradle 項(xiàng)目在 buildTypes 中配置,混淆的配置文件為 proguard-android.txt
//必須在productFlavors之后 buildTypes { release { //開啟混淆 minifyEnabled true //打包時(shí)移除不用資源 shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //不同渠道使用不同的簽名 signingConfig signingConfigs.sign } debug { signingConfig signingConfigs.sign } } 正式版本發(fā)布時(shí)需要關(guān)閉 Log ,防止 Log 調(diào)試信息的打印造成重要數(shù)據(jù)泄露。一般思路為封裝 LogUtil,在其中根據(jù) BuildConfig.Debug 判斷是否輸出日志
測試第三方SDK時(shí),如對簽名有要求,可以在 debug 時(shí)使用正式簽名
正式發(fā)布版本時(shí),可用第三方工具加密,如:360加密、愛加密,加密后最好測試下,可能會(huì)有兼容性問題
打包后記得保存未加密的包并保存 mapping 文件(列出了原始的類,方法和字段名與混淆后代碼間的映射)
其它
-
控制語句
- 減少條件嵌套,不要超過3層
// Bad if(obj != null) { doSomething(); } // Good if(obj == null) { return; } doSomething();- if語句必須用{}包括起來,即便是只有一句
- 方法
- 拆分臃腫方法,每個(gè)方法只作一件事
- 做同一個(gè)邏輯的方法,盡量靠近放到一塊,方便查看
- 盡量不要使用 try catch 處理業(yè)務(wù)邏輯
- 使用JSON工具類,不要手動(dòng)解析和拼裝數(shù)據(jù),如:Gson
- 重構(gòu)相關(guān)書籍
- 《重構(gòu)-改善既有代碼的設(shè)計(jì)》
參考
關(guān)于 colors.xml 和 drawable 命名很久之前摘自某篇博文,忘記具體鏈接了,如有侵權(quán),請聯(lián)系我~

