前言
一份合格的代碼不該只知足於實現功能, 更應該遵循良好的規範. 遵循良好的代碼規範有利於: java
提高程序穩定性, 減小代碼隱患, 下降故障率;
加強可擴展性, 大幅提升維護效率;
統一標準, 提高多人協做效率;
方便新人快速上手, 在項目組人員發生變更時保證項目進度;
這裏梳理一下Android開發過程當中須要注意的一些地方, 包括多個部分, 另外根據約束力強弱分爲兩類: android
強制: 若是不遵照會致使代碼嚴重混亂, 後期維護複雜, 甚至會出現嚴重bug;
推薦: 若是不遵照可能會致使代碼描述不清, 理解困難, 致使功能越多維護越難的問題;
系統設計
強制: git
不容許出現兩段相同的邏輯塊, 必須抽出爲公共方法, 差別性使用參數控制, 避免修改時多處修改致使遺漏;
不容許出現兩段相同的處於同一邏輯組的複雜佈局, 必須抽爲單獨的include/merge;
不容許父類中出現子類具體方法, 若是須要的話能夠父類定義抽象方法, 交由子類實現;
不容許Activity內多Fragment之間的直接溝通, 必須經過Activity中轉;
推薦: 面試
推薦使用MVP或者MVVM架構;
推薦使用Kotlin語言;
採用模塊分類方式替代文件類別方式, 方便快速查找模塊相關內容, 例: LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter等所屬同一登陸模塊的文件放入一個文件夾, 而不是全部activity放入一個文件夾, 全部adapter放入一個文件夾.
命名方式
強制: 算法
不容許出現中文命名方式;
java/kotlin文件使用大駝峯方式, 例: LoginActivity.kt, NewsAdapter.kt, NewsBean.java;
layout/drawable/anim/style等resource文件使用小寫+下劃線的方式, 例: login_activity.xml, login_logo.png;
類定義使用大駝峯方式, 例: class LoginPresenter {}, class NewsBean {};
對象使用小駝峯方式, 例: LoginPresenter loginPresenter, NewsBean newsBean;
靜態常量使用全大寫+下劃線的方式, 例: public static final boolean IS_RELESAE = true;
Kotlin使用的佈局中的控件id必須使用小駝峯方式, 例: android:id=」@+id/tvLogin」
推薦: 數據庫
文件/資源命名時採用 模塊+類型 的方式, 以便迅速查找相關內容, 例如登陸頁面: LoginActivity.kt, login_activity.xml, login_logo.png, 網絡錯誤, #f3f3f3
java使用的佈局中的id名建議使用小駝峯方式, 而且使用控件類型縮寫開頭, 例: android:id=」@+id/tvLogin」, 附錄經常使用控件縮寫:
可見性
強制: json
全部新定義的類/方法, 默認寫成private, 只有在其餘類須要引用時再看狀況標爲public, protected, package-private;緩存
推薦: 安全
java定義的父類中定義的方法若是子類重寫會致使問題時, 添加final關鍵字;bash
註釋相關
類/複雜或者不能從方法名字看出意圖的方法必須添加註釋, 當類/方法添加註釋時, 必須使用此類型註釋:
/**
* Created by XXX on 2019/6/19.
* 描述此類做用, 邏輯複雜的說明一下主要思路
*/
public class LoginPresenter {
/**
* 用於進行網絡請求
* @params xxx XXX
*/
public void do LoginRequest(...){
}
}
複製代碼
變量註釋不容許使用與類/方法一致的註釋形式;
方法註釋中不容許出現@params, @return的參數描述錯誤的狀況, 必須實時更新;
推薦:
一段邏輯建議使用//的方式;
方法/參數建議添加 @Nullable, @NotNull, @UiThread 等註解;
代碼風格
此git目錄下同時存有 AndroidCodeStyleSetting.jar 配置文件, 用於AndroidStudio導入後按照統一風格進行代碼的格式化.
若是沒有編寫代碼時隨時格式化代碼的習慣, 能夠在AndroidStudio版本控制提交窗口右側Before Commit中勾選Reformat code選項.
Android基本組件
強制:
Intent通訊時不容許傳遞超過1M的數據, 能夠採用外部Presenter中轉或者EventBus傳遞的方式;
Intent隱式啓動時必須檢查目標是否存在, 不然會出現目標未找到崩潰: if (getPackageManager().resolveActivity(intent, PackageManager.MATCHDEFAULT ONLY) != null);
Activity/Service/BroadcastReceiver內若是有耗時操做, 必須採用多線程進行處理;
應用內部發送廣播時, 只能使用LocalBroadcastManager.getInstance(this).sendBroadcast(intent), 不容許 context.sendBroadcast(intent), 避免外部應用攔截;
不容許在Application中緩存數據, 全局的共享數據可使用某presenter存儲, 或者使用SharedPreference讀寫;
Activity或者Fragment中動態註冊BroadCastReceiver時,registerReceiver和unregisterReceiver必需要成對出現;
推薦:
Activity#onPause/onStop中結合isFinishing的判斷來執行資源的釋放, 必免放在執行時機較晚的Activity#onDestroy()中執行;
不要在Activity#onPause中執行耗時操做, 這樣會致使界面跳轉卡頓, 能夠放入Activity#onStop中執行;
UI/佈局
強制:
佈局xml優先使用ConstraintLayout, 能夠保證無嵌套的狀況下完成包括部分控件同時顯隱需求在內的99%的佈局要求;
不容許使用ScrollView包裹ListView/GridView/ExpandableListVIew等列表View, 複雜多項式列表可使用多ItemType進行處理;
推薦:
在Activity中顯示對話框或彈出浮層時, 儘可能使用DialogFragment, 而非Dialog/AlertDialog, 便於隨Activity生命週期管理彈窗的生命週期;
進程/線程/消息推送
強制:
存在多進程的狀況時, Application中的初始化代碼要根據進程分別處理, 避免初始化沒必要要的業務;
新建線程時, 必須經過線程池的方式, 不容許採用new Thread()的方式;
Activity/Fragment中使用Handler時, 必須使用靜態內部類+WeakReferences方式或者在onStop中調用handler.removeCallbacksAndMessages;
推薦:
多進程間共享數據使用ContentProvider替代SharedPreferences#MODE_MULTI_PROCESS;
文件/數據庫
強制:
使用系統API獲取文件路徑, 避免手拼字符串, 例: android.os.Environment#getExternalStorageDirectory(), Context#getFilesDir(), 錯誤示例: File file = new File(「/mnt/sdcard/Download/Album」, name);
當使用外部存儲時, 必須檢查外部存儲的可用性: Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
數據庫Cursor使用以後必須關閉, 以避免內存泄漏;
推薦:
SharedPreference僅存儲簡單數據類型, 不要存儲複雜數據, 如json數據/Bitmap編碼等;
SharedPreference提交數據時, 儘可能使用Editor#apply(), 而非Editor#commit();
圖片/動畫
強制:
加載大圖時必須在子線程中處理, 不然會卡UI;
在Activity.onPause()/onStop()中關閉當前activity正在執行的動畫;
推薦:
Android圖片建議轉化爲WebP格式, 能夠減小APK體積;
動畫儘可能不要使用AnimationDrawable, 佔用很是多內存;
使用ARGB_565代替ARGB_888, 減小內存佔用;
當Animation執行結束時, 調用View.clearAnimation()釋放相關資源;
安全性
強制:
上線包必須混淆;
加解密的祕鑰/鹽不容許硬編碼到代碼中, 以防反編譯獲取;
Https處理時必須校驗證書, 不容許直接接受任意證書;
使用Android的AES/DES/DESede加密算法時, 不要使用默認的加密模式ECB, 應顯示指定使用CBC/CFB加密模式;
禁止把敏感信息打印到log中;
在應用發佈時必須確保android:debuggable爲false;
必須利用X509TrustManager子類中的checkServerTrusted函數效驗服務器端證書的合法性,
必須將android:allowbackup屬性設置爲false, 防止adb backup導出應用數據;
最後
感謝你們能耐着性子,看完我囉哩囉嗦的文章。
願與各位堅守在Android開發崗位的同胞們互相交流學習,共同進步!
在這裏我也分享一份本身收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記 ,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料 幫助你們學習提高進階,也節省你們在網上搜索資料的時間來學習,也能夠分享給身邊好友一塊兒學習
若是你有須要的話,能夠點贊+評論 ,關注我