【譯文】配置 Android 項(xiàng)目系列1——小事情

說明:由于翻譯水平有限,可能會(huì)存在一些不恰當(dāng)?shù)牡胤剑瑲g迎指出,我會(huì)馬上改正。系列的剩余部分會(huì)陸續(xù)翻譯完晚凿。

本文是配置 Android 項(xiàng)目系列的一部分:

  1. Little Things That Matter
  2. Version Name & Code
  3. Static Code Analyses Tools
  4. Continuous Integration

我們?cè)谶@篇文章中討論的一切都可以在 template 項(xiàng)目中找到

gitignore

當(dāng)你在 Android Studio 中創(chuàng)建一個(gè)新的 Android 項(xiàng)目時(shí),它就已經(jīng)生成了 gitignore 文件塘辅,但是通常并不包含所有必要的規(guī)則晃虫。

為了快速生成和下載 gitignore 文件,我推薦你使用 gitignore.io 網(wǎng)站扣墩。只要輸入必要的關(guān)鍵詞哲银,例如 Android扛吞,Intellij,然后點(diǎn)擊生成按鈕荆责。

gitignore_io.png

查看 template 項(xiàng)目的 gitignore 文件滥比。

tools folder

如果你有一些第三方腳本、規(guī)則集或者其他和你項(xiàng)目相關(guān)的文件做院,不要放在根目錄下盲泛,會(huì)造成混亂。(特別是哪些使用項(xiàng)目視圖键耕,而不是 Android 視圖)

嘗試創(chuàng)建一個(gè)文件夾(例如:tools)寺滚,并把這些文件放入這個(gè)文件夾。

tools_folder.png

通常我會(huì)放入自定義的 gradle 腳本文件屈雄、混淆 (proguard) 規(guī)則和靜態(tài)代碼分析工具村视,例如:pmdfindbugs酒奶、lint蚁孔。

查看 template 項(xiàng)目的 tools 文件夾

flavors

Flavors 用于創(chuàng)建不同設(shè)置的構(gòu)建。在大多數(shù)情況下惋嚎,我會(huì)設(shè)置兩種風(fēng)格杠氢,它們的不同在于:

  • applicationId
  • versionCode / versionName
  • server endpoints
  • google services keys
  • ...
productFlavors {
    dev {
        signingConfig signingConfigs.debug
        versionCode gitVersionCodeTime
        versionName gitVersionName
    }

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

查看 template 項(xiàng)目的 productFlavors

keystore

密鑰庫是一個(gè)二進(jìn)制文件,包含一個(gè)或多個(gè)私鑰用于簽名你的應(yīng)用程序另伍。

當(dāng)你在 IDE 中運(yùn)行或者調(diào)試項(xiàng)目鼻百,Android Studio 會(huì)通過 Android SDK 工具生成一個(gè)調(diào)試證書自動(dòng)的簽名你的 APK。

使用本地調(diào)試密鑰庫時(shí)有幾個(gè)問題:

  • 365天期滿
  • 通過多臺(tái)電腦安裝應(yīng)用需要先卸載
  • 谷歌的服務(wù)需要密鑰庫 SHA-1 指紋

這就是為什么我通常生成調(diào)試密鑰庫提交到版本控制系統(tǒng)质况。

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

查看 template 項(xiàng)目的 signingConfigs

proguard

Android 上的混淆器用于三件事:

  • 縮小未使用的代碼愕宋,幫助你免于64K限制 (64k limit)
  • 優(yōu)化代碼和 APK
  • 混淆代碼,使你的 APK 難逆向工程

問題是结榄,混淆和代碼優(yōu)化顯著增加編譯時(shí)間,使調(diào)試更難囤捻。

這就是為什么最好是針對(duì)發(fā)布和調(diào)試構(gòu)建使用不同的混淆器規(guī)則:

  • rules-proguard.pro
  • rules-proguard-debug.pro
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
    }
}

對(duì)于調(diào)試構(gòu)建臼朗,混淆器規(guī)則必須具備以下內(nèi)容,強(qiáng)制忽略警告蝎土,跳過代碼混淆與優(yōu)化:

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

對(duì)于發(fā)布版本設(shè)置混淆器規(guī)則是很難的视哑,因?yàn)閹缀趺恳粋€(gè)庫都會(huì)有它自己特定的規(guī)則。幸好有開源庫 android-proguard-snippets誊涯,包含所有主要庫的混淆規(guī)則挡毅。

# Add project specific ProGuard rules here.

# Remove logs
-assumenosideeffects class android.util.Log {
   public static boolean isLoggable(java.lang.String, int);
   public static int v(...);
   public static int i(...);
   public static int w(...);
   public static int d(...);
   public static int e(...);
}

# Proguard configurations for common Android libraries:
# https://github.com/krschultz/android-proguard-snippets

查看 template 項(xiàng)目的 rules-proguard.prorules-proguard-debug.pro

strict mode

Android 的嚴(yán)格模式 (StrictMode) 幫助你檢測(cè)不同種類的問題:

  • 可以關(guān)閉的對(duì)象沒有關(guān)閉
  • 在主線程執(zhí)行文件讀取和網(wǎng)絡(luò)請(qǐng)求
  • 暴露 uri
  • ...

每當(dāng)檢測(cè)到這樣的問題,它可以顯示適當(dāng)?shù)娜罩净蜃寫?yīng)用程序崩潰暴构,這取決于你的配置跪呈。

我建議你在調(diào)試版本中打開它段磨,并且使用 detectAll 方法檢測(cè)各種問題。

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

以下是示例 log苹支,當(dāng)你忘記關(guān)閉 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)

查看 template 項(xiàng)目的 StrictMode

譯文

  1. 小事情
  2. 版本號(hào)
  3. 靜態(tài)代碼分析工具
  4. 持續(xù)集成
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末误阻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子究反,更是在濱河造成了極大的恐慌,老刑警劉巖精耐,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黍氮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沫浆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专执,“玉大人淮捆,你說我怎么就攤上這事本股∨嗜” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拄显,是天一觀的道長苟径。 經(jīng)常有香客問我,道長躬审,這世上最難降的妖魔是什么棘街? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮承边,結(jié)果婚禮上遭殉,老公的妹妹穿的比我還像新娘。我一直安慰自己博助,他們只是感情好险污,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著富岳,像睡著了一般蛔糯。 火紅的嫁衣襯著肌膚如雪拯腮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天渤闷,我揣著相機(jī)與錄音疾瓮,去河邊找鬼。 笑死飒箭,一個(gè)胖子當(dāng)著我的面吹牛狼电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦蹂,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼肩碟,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凸椿?” 一聲冷哼從身側(cè)響起削祈,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脑漫,沒想到半個(gè)月后髓抑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡优幸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年吨拍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网杆。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羹饰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碳却,到底是詐尸還是另有隱情队秩,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布馍资,位于F島的核電站座柱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冠胯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望置蜀。 院中可真熱鬧,春花似錦盯荤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崇堰,卻和暖如春涩咖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檩互。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工盾似, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人零院。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓告抄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親打洼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容