正確配置你的 Android 項目

簡評:優秀的 Android 項目從配置開始。: )

作者在這里介紹了一個 Android 項目應該有的配置,文中講到的內容大家都可以運用在自己的 Android 模板項目中。

gitignore

當你新建 Android 項目時,默認會生成 gitignore 文件,但并沒有包含所有必要的規則。這里推薦大家使用 gitignore.io 網站,只需要輸入關鍵字,比如 Android, Intellij 再點擊按鈕,就能得到一個標準的 gitignore 文件啦。

tools folder

如果你的項目有很多的第三方腳本,規則列表或其他的文件,不要隨意的將它們放在 root 目錄下,新建一個 tools 文件夾,把它們都放在里面。通常你可以放入自定義的 gradle 腳本文件,proguard 規則和靜態代碼分析工具,例如:pmd, findbugs, lint

flavors

Flavors 用來實現多渠道打包,作者自己通常是分為了 dev 和 prod 兩個 flavor:

productFlavors {
    dev {
        signingConfig signingConfigs.debug
        versionCode gitVersionCodeTime
        versionName gitVersionName
    }

    prod {
        signingConfig signingConfigs.release
        versionCode gitVersionCode
        versionName gitVersionName
    }
}

keystore

當你通過 Android Studio 運行或 debugging 你的項目時,Android Studio 會通過 Android SDK tools 自動生成 debug keystore 為你的應用簽名。

但使用默認的 debug keystore 會有下面幾個問題:

  • 有效期 365 天
  • 從不同計算機上安裝應用程序需要先卸載
  • google 服務需要 keystore 的 SHA-1 fingerprint

所以,建議開發者自己生成 debug keystore 并提交到版本控制系統中。

signingConfigs {
   debug {
       keyAlias 'androiddebugkey'
       keyPassword 'android'
       storePassword 'android'
       storeFile file('../keystore/debug.keystore')
   }
   release {
       ...
   }
} 

proguard

Android proguard 主要有三個用途:

  • 消除未使用的代碼 - 幫助你避免 64k 限制
  • 優化代碼和 APK
  • 模糊代碼 - 讓 APK 難以被逆向工程

但是代碼混淆和優化顯著增加了編譯的時間,不利于平時的開發調試。這也是為什么推薦針對 release 和 debug 使用不同的 proguard 規則。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                "$project.rootDir/tools/rules-proguard.pro"
        signingConfig signingConfigs.release
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                "$project.rootDir/tools/rules-proguard-debug.pro"
        signingConfig signingConfigs.debug
    }
}

對于用于 debug 的 proguard 文件,需要加上以下規則來強制 proguard 忽略掉警告、代碼混淆和優化:

# Add project specific ProGuard rules here.
-dontobfuscate
-dontoptimize
-ignorewarnings

對于 release 的 proguard 文件設置規則就比較復雜了,因為幾乎每一個庫都有自己獨特的規則。這里推薦一個開源項目:android-proguard-snippets,里面包含了幾乎所有主流庫的 proguard 規則。

strict mode

Android StrictMode能幫助開發者檢測應用中可能出現的多種問題:

  • 可關閉的對象沒有關閉
  • 在主線程中執行了文件讀取或網絡請求
  • URI 暴露
  • ...

這里建議開發者在 debug build 時通過 *detectAll *方法檢測所有類型的問題:

if (BuildConfig.DEBUG) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());
}

像是忘記關閉 SQLiteCursor 這類問題出現時,日志中就會有提示:

StrictMode: 
A resource was acquired at attached stack trace but never released. 
See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
        at dalvik.system.CloseGuard.open(CloseGuard.java:184)
        at android.database.CursorWindow.<init>(CursorWindow.java:111)
        at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
        at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
        at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
        at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
        at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
        at com.dd.template.MainActivity.onCreate(MainActivity.java:124)

原文:Configuring Android Project?—?Little Things That Matter

歡迎關注:知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。

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

推薦閱讀更多精彩內容