Android 開發規范總結

個人總結的 Android 開發規范,其中控件縮寫及 Android 資源文件命名部分不是很確定,有待商榷。Java 部分編程風格請參考:Google Java 命名規范。

2017-02-13 更新:2017年開春之際,誠意獻上重磅大禮:阿里巴巴Java開發手冊,首次公開阿里官方Java代碼規范標準。這套Java統一規范標準將有助于提高行業編碼規范化水平,幫助行業人員提高開發質量和效率、大大降低代碼維護成本。點此下載

約定

  1. 統一調整 IDE 的編碼方式為 UTF-8
    01
  2. 統一調整 IDE 的 Tab 縮進為 4 個空格
    0
  3. 花括號不要單獨一行,和它前面的代碼同一行。而且,花括號與前面的代碼之間用一個空格隔開。

    public void method() { // Good 
     
    } 
     
    public void method()
    { // Bad
    } 
     
    public void method(){ // Bad
     
    }
    
  4. 空格的使用:if、else、for、switch、while等邏輯關鍵字與后面的語句留一個空格隔開。

    // Good
    if (booleanVariable) {
        // TODO while booleanVariable is true
    } else {
        // TODO else
    }
     
    // Bad
    if(booleanVariable) {
        // TODO while booleanVariable is true
    }else {
        // TODO else
    }
    
    // 運算符兩邊各用一個空格隔開。
    int result = a + b; //Good, = 和 + 兩邊各用一個空格隔開
    int result=a+b; //Bad,=和+兩邊沒用空格隔開
    
    // 方法的每個參數之間用一個空格隔開。
    public void method(String param1, String param2); // Good,param1后面的逗號與String之間隔了一個空格
    public void method(param1, param2); // Good,方法調用時,param1后面的逗號與param2之間隔了一個空格
    public void method(param1,param2); // Bad,沒有用一個空格隔開
    
  5. 空行的使用,拒絕拖沓無分割,關聯代碼段放一塊并與后面代碼分割

    • 兩個方法之間
    • 方法內的兩個邏輯段之間
    • 方法內的局部變量和方法的第一條邏輯語句之間
    • 常量和變量之間
    • 方法名和方法內第一條語句不要有空格
  6. Activity.onCreate(),Fragment.onActivityCreated(),作為程序入口,不要寫入太多代碼,盡量保持只調用 initXXX() 方法,簡單明了展示調用過程。如:initData(),initView()??稍?BaseActivity 、 BaseFragment 中實現 init 執行順序,子類實現,即 模板方法模式。

  7. Application 中只執行應用初始化相關操作,盡量不要涉及業務邏輯。如有,請單獨剝離。參考第 6 條

  8. 單個方法體不要過長,最好不要超過一屏,豎屏顯示器請無視~

  9. 一行聲明一個變量,不要一行聲明多個變量,這樣有利于寫注釋。

  10. 代碼任何地方不要拼錯單詞

  11. 代碼必須格式化

    Windows:CTRL + ALT + L
    Mac:OPTION + COMMAND + L
    
  12. 文字大小的單位統一用 sp,元素大小的單位統一用 dp;應用中的字符串統一在 /values/strings.xml 中定義;顏色值統一在 /values/colors.xml 中定義;菜單定義統一放在 /menu/****.xml 中;自定義View 屬性統一在 /values/attrs.xml 中;自定義drawable 文件統一在 /drawable/****.xml 中;自定義樣式統一在 /values/styles.xml。

  13. 調用方法保持“臨近原則”,被調用的方法,放在調用方法下方

  14. 用好 TODO 標記

    • 記錄想法,記錄功能點,開發過程中可以利用 TODO 記錄一下臨時想法或為了不打擾思路留下待完善的說明
    • 刪除無用 TODO ,開發工具自動生成的 TODO ,或則已經完善的 TODO ,一定要刪除。
  15. 處理“魔法數字”等看不懂的神秘數字

    • 代碼中不要出現數字,特別是一些標識不同類型的數字。
    • 所有意義數字全部抽取到 Constant 公共類中,避免散布在各位類中。
    • 所有有意義的字符串公共常量全部抽取到 Constant 公共類中

命名規范

命名除了要遵守以下規范,還得見名知意。

類和接口命名

使用大駝峰規則,用名詞或名詞詞組命名,每個單詞的首字母大寫。
以下為幾種常用類的命名:

  • Activity 類,命名以 Activity 為后綴,如:LoginActivity
  • Fragment 類,命名以 Fragment 為后綴,如:LoginFragment
  • Service 類,命名以 Service 為后綴,如:DownloadService
  • Adapter 類,命名以 Adapter 為后綴,如:CouponAdapter
  • 工具類,命名以 Util 為后綴,如:EncryptUtil
  • 模型類,命名以 Info 為后綴,如:UserInfo
  • 接口實現類,命名以 Impl 為后綴,如:ApiImpl

方法命名

使用小駝峰規則,用動詞命名,第一個單詞的首字母小寫,其他單詞的首字母大寫。以下為幾種常用方法的命名:

  • 初始化方法,命名以 init 開頭,例:initView()
  • 按鈕點擊方法或 Activity 跳轉方法,命名以 to 開頭,例:toLogin()、toMainActivity()
  • 設置方法,命名以 set 開頭,例:setData()
  • 具有返回值的獲取方法,命名以 get 開頭,例:getData()
  • 通過異步加載數據的方法,命名以 load 開頭,例:loadData()
  • 布爾型的判斷方法,命名以 is 或 has ,或具有邏輯意義的單詞如 equals ,例:isEmpty()

常量命名

全部為大寫單詞,單詞之間用下劃線分開。常量一般放在 Constant

  • Intent 參數以 PARAM_EXTRA 開頭
// Intent 參數
public final static String PARAM_EXTRA_ID = "id";

public final static int PAGE_SIZE = 20;

變量命名

使用駝峰規則,首字母必須小寫,使用名詞或名詞詞組。要求簡單易懂,富于描述,不允許出現無意義或錯誤單詞。

  • 普通成員變量命名以 mCamelCase 樣式命名,靜態變量以 sCamelCase 命名
  • boolean 類型的成員變量命名可以不遵循第一條,以 lowerCamelCase 樣式命名
  • 控件變量命名都已 控件縮寫 + 控件作用 來命名,如:登錄按鈕命名為 mBtnLogin;
  • 參數變量、臨時變量都已 lowerCamelCase 樣式命名
public class MainActivity extends Activity {

    private Button mBtnLogin;
    private boolean isLaunch;
    
    private boolean isEmpty(String text) {
        // Todo...
    }
}

補充:如果你使用 Android Studio 為開發工具,則可以通過如下方式設置變量前綴
![屏幕快照 2017-03-14 下午1.57.59](http://odsdowehg.bkt.clouddn.com/屏幕快照 2017-03-14 下午1.57.59.png)

控件縮寫

常見控件縮寫約定如下:

  • 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 命名

控件縮寫_含義

<!-- 這是標題欄的標題 -->
<TextView
    android:id="@+id/tv_header_title"
    ... />
 
<-- 這是登錄按鈕 -->
<Button
    android:id="@+id/btn_login"
    ... />

布局文件命名

  • Activity 布局:activity_類名.xml,建議使用 Android Studio 生成(Command + N)
    ![屏幕快照 2017-03-14 下午1.59.31 w300](http://odsdowehg.bkt.clouddn.com/屏幕快照 2017-03-14 下午1.59.31.png)

  • Fragment 布局:fragment_類名.xml

  • 控件布局:widget_控件名.xml 或 layout_控件名.xml

  • Adapter Item 布局:item_適配器名.xml

strings.xml 命名

類型{范圍}功能,范圍可選。
以下為幾種常用的命名:

  • 頁面標題,命名格式為:title_頁面
  • 按鈕文字,命名格式為:btn_按鈕事件
  • 標簽文字,命名格式為:label_標簽文字
  • 選項卡文字,命名格式為:tab_選項卡文字
  • 消息框文字,命名格式為:toast_消息
  • 編輯框的提示文字,命名格式為:hint_提示信息
  • 圖片的描述文字,命名格式為:desc_圖片文字
  • 對話框的文字,命名格式為:dialog_文字
  • menu 的 item 文字,命名格式為:menu_文字

colors.xml 命名

前綴{控件}{范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個。

  • 背景顏色,添加 bg 前綴
  • 文本顏色,添加 text 前綴
  • 分割線顏色,添加 div 前綴
  • 區分狀態時,默認狀態的顏色,添加 normal 后綴
  • 區分狀態時,按下時的顏色,添加 pressed 后綴
  • 區分狀態時,選中時的顏色,添加 selected 后綴
  • 區分狀態時,不可用時的顏色,添加 disable 后綴

如:bg_loading_selected

drawable的命名

  • 圖標類,添加 ic 前綴
  • 背景類,添加 bg 前綴
  • 分隔類,添加 div 前綴
  • 默認類,添加 def 前綴
  • 區分狀態時,默認狀態,添加 normal 后綴
  • 區分狀態時,按下時的狀態,添加 pressed 后綴
  • 區分狀態時,選中時的狀態,添加 selected 后綴
  • 區分狀態時,不可用時的狀態,添加 disable 后綴
  • 多種狀態的,添加 selector 后綴(一般為 ListView 的 selector 或按鈕的 selector )

如:ic_launcher_pressed

注釋規范

類和接口注釋

類和接口統一添加javadoc注釋,格式如下:

/**
 * 類或接口的描述信息
 *
 * @author ${USER}
 * @date ${DATE}
 */
 public interface Login {
 
 }

方法注釋

下面幾種方法,都必須添加注釋,說明該方法的用途和參數說明,以及返回值。如不添加注釋,方法和參數命名都要見名知意

  • 接口中定義的所有方法
  • 抽象類中自定義的抽象方法
  • 抽象父類的自定義公用方法
  • 工具類的公用方法
/**
 * 登錄
 *
 * @param loginName 登錄名
 * @param password 密碼
 * @param listener 回調監聽器
 */
public void login(String loginName, String password, ActionCallbackListener listener);

變量和常量注釋

下面幾種情況下的常量和變量,都要添加注釋說明,優先采用 右側// 來注釋,若注釋說明太長則在上方添加注釋。

  • 接口中定義的所有常量
  • 公有類的公有常量
  • 枚舉類定義的所有枚舉常量
  • 實體類的所有屬性變量
public static final int TYPE_CASH = 1; // 現金券
public static final int TYPE_DEBIT = 2; // 抵扣券
public static final int TYPE_DISCOUNT = 3; // 折扣券
 
private int id; // 券id
private String name; // 券名稱
private String introduce; // 券簡介

發布及安全

版本管理

版本管理一般使用 Git

  • 打包前必須pull一下代碼
  • 打包發版后,打上tag,push代碼
  • 打包后記得保存未加密過的包和mapping文件
  1. 建議使用 Git 進行版本管理,正式打包前先 pull 一下代碼,保證發布版本為最新代碼;版本發布后,打 tag 并 push 到服務器

  2. 正式版本需要打開 混淆,防止被反編譯,gradle 項目在 buildTypes 中配置,混淆的配置文件為 proguard-android.txt

    //必須在productFlavors之后
    buildTypes {
       release {
           //開啟混淆
           minifyEnabled true
           //打包時移除不用資源
           shrinkResources true
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           //不同渠道使用不同的簽名
           signingConfig signingConfigs.sign
       }
    
       debug {
           signingConfig signingConfigs.sign
       }
    }
    
  3. 正式版本發布時需要關閉 Log ,防止 Log 調試信息的打印造成重要數據泄露。一般思路為封裝 LogUtil,在其中根據 BuildConfig.Debug 判斷是否輸出日志

  4. 測試第三方SDK時,如對簽名有要求,可以在 debug 時使用正式簽名

  5. 正式發布版本時,可用第三方工具加密,如:360加密、愛加密,加密后最好測試下,可能會有兼容性問題

  6. 打包后記得保存未加密的包并保存 mapping 文件(列出了原始的類,方法和字段名與混淆后代碼間的映射)

其它

  1. 控制語句

    • 減少條件嵌套,不要超過3層
    // Bad
    if(obj != null) { doSomething(); }
    // Good
    if(obj == null) { return; } doSomething();
    
    • if語句必須用{}包括起來,即便是只有一句
  • 方法
    • 拆分臃腫方法,每個方法只作一件事
    • 做同一個邏輯的方法,盡量靠近放到一塊,方便查看
    • 盡量不要使用 try catch 處理業務邏輯
    • 使用JSON工具類,不要手動解析和拼裝數據,如:Gson
  • 重構相關書籍
    • 《重構-改善既有代碼的設計》

參考

關于 colors.xml 和 drawable 命名很久之前摘自某篇博文,忘記具體鏈接了,如有侵權,請聯系我~

郵箱:1025263614@qq.com

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容