Android Gradle配置小技巧

目錄

版本管理

比如像compileSdkVersion這種的可以通過一個單獨的gradle文件來進(jìn)行管理如下柄冲,新建一個version.gradle文件吻谋,在里面定義一些配置的變量

ext{
    appCompileSdkVersion = 30
    appBuildToolsVersion = "30.0.3"
    appMinSdkVersion = 21
    appTargetSdkVersion = 30
    appVersionCode = 1
    appVersionName = "1.0"
}

build.gradle文件中引用并使用定義的變量

//引入version.gradle文件
apply from:"../version.gradle"
android {
    compileSdkVersion appCompileSdkVersion
    buildToolsVersion appBuildToolsVersion

    defaultConfig {
        applicationId "com.itfitness.gradletest"
        minSdkVersion appMinSdkVersion
        targetSdkVersion appTargetSdkVersion
        versionCode appVersionCode
        versionName appVersionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

修改生成的apk名稱

我們可以通過遍歷applicationVariants來對生成的apk文件修改名字

applicationVariants.all{variant ->
        //遍歷variant的outputs,一般每個variant的outputs有debug和release兩個
        variant.outputs.all {
            //判斷文件是以.apk結(jié)尾的就修改文件名
            if(outputFileName.endsWith(".apk")){
                outputFileName  = "itfitness_V" + versionName + "(" + versionCode + ").apk"
            }
        }
    }

隱藏簽名文件信息

我們平時可能會將簽名文件的信息配置在signingConfigs中现横,這樣如果將代碼提交到遠(yuǎn)程的代碼倉庫就可能被別人看到漓拾,因此我們可以通過配置properties文件的方式將簽名信息放在自己本地的電腦上,然后通過讀取配置信息來實現(xiàn)與以前同樣的效果戒祠,代碼如下:

signingConfigs{
        def signInfo = new ConfigSlurper().parse(new File("G:/signInfo.properties").toURI().toURL())
        release{
            storeFile file(signInfo.storeFilePath)
            keyAlias signInfo.keyAlias
            keyPassword signInfo.keyPassword
            storePassword signInfo.storePassword
        }
    }

其中我的signInfo.properties在G盤



signInfo.properties文件的內(nèi)容如下

storeFilePath = "G:/testjks.jks"
keyAlias = 'testjks'
keyPassword = 'testjks'
storePassword = 'testjks'

動態(tài)配置AndroidManifest的信息

首先我們需要在module的build.gradle文件中配置一個productFlavor骇两,然后在manifestPlaceholders 屬性中配置我們自定義的信息,如下

productFlavors{
        itfitness{
            manifestPlaceholders = [
                    "MY_KEY":"Itfitness",
                    "APP_NAME":"Itfitness應(yīng)用"
            ]
        }
    }

然后我們就可以在AndroidManifest文件中通過${}來引用了姜盈,比如我這是加了一個meta-data并且修改了應(yīng)用名稱

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itfitness.androidgradledemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${APP_NAME}"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AndroidGradleDemo">
        <meta-data android:name="MY_KEY" android:value="${MY_KEY}"/>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

然后可以在代碼中獲取meta-data

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        val myKey = appInfo.metaData.getString("MY_KEY")
        myKey?.let {
            Log.e("MetaData",myKey)
        }
    }
}

添加BuildConfig常量

我們可以在productFlavor中通過buildConfigField來添加BuildConfig常量脯颜,如下

productFlavors{
        itfitness{
            buildConfigField 'String','MYNAME','"Itfitness"'
            manifestPlaceholders = [
                    "MY_KEY":"Itfitness",
                    "APP_NAME":"Itfitness應(yīng)用"
            ]
        }
    }

注意這里的三個值的意義分別是:類型、名稱贩据、常量值,這三個值生成了BuildConfig常量的時候都是純替換的闸餐,因此如果是字符串類型的值也要在單引號中加入雙引號饱亮,否則就會出錯,如下所示



另外注意如果修改了builde.gradle文件后沒有生成BuildConfig常量的話就需要Make Project一下



這里BuildConfig常量也可以在BuildType中定義如:
buildTypes {
        release {
            minifyEnabled false
            buildConfigField 'int','M_VERSION','999'
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            buildConfigField 'int','M_VERSION','666'
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

動態(tài)添加自定義資源

我們可以在build.gradle文件中動態(tài)添加些string舍沙、color等資源近上,如下

 productFlavors{
        itfitness{
            resValue 'color','ColorItfitness','#FF0000'
            buildConfigField 'String','MYNAME','"Itfitness"'
            manifestPlaceholders = [
                    "MY_KEY":"Itfitness",
                    "APP_NAME":"Itfitness應(yīng)用"
            ]
        }
    }

然后我們Make Project后就可以找到


Java編譯選項

我們可以通過配置compileOptions來指定Java的編譯選項,如下:

compileOptions {
        encoding = 'utf-8' //源文件編碼
        sourceCompatibility JavaVersion.VERSION_1_8 //源代碼編譯級別
        targetCompatibility JavaVersion.VERSION_1_8 //字節(jié)碼生成的版本
    }

Dex選項配置

有的時候我們打包會提示java.lang.OutOfMemoryError: GC overhead limit exceeded拂铡,這是因為我們打包生成apk用的是dx工具壹无,當(dāng)我們代碼太多的時候葱绒,默認(rèn)分配給dx工具的內(nèi)存就不足以打包apk了,這時我們可以通過配置dexOptions來解決這個問題斗锭,如下:

 dexOptions{
        javaMaxHeapSize '4g'
    }

另外還有一些其他的可配置項地淀,如
incremental屬性:是一個boolean類型的屬性,用來配置是否啟用dx的增量模式岖是,默認(rèn)為false帮毁,增量模式雖然速度更快一點,但是可能會有一些限制豺撑,因此要慎用

 dexOptions{
        incremental true
    }

jumboMode屬性:boolean類型的屬性烈疚,有時候我們的程序項目工程比較大,代碼太多聪轿,函數(shù)超過了65535個爷肝,5.0以上那就需要強制開啟jumbo模式才可以構(gòu)建成功

 dexOptions{
        jumboMode true
    }

preDexLibraries屬性:boolean類型的屬性,用來配置是否預(yù)執(zhí)行dex Libraries庫工程陆错,開啟后會大大提高增量構(gòu)建的速度灯抛,不過可能會影響clean的構(gòu)建速度。默認(rèn)為true危号,但是如果我們需要使用dx的--multi-dex選項生成多個dex牧愁,這導(dǎo)致和庫工程有沖突的時候,需要將該屬性設(shè)為false
threadCount屬性:integer類型外莲,用來配置Android Gradle運行dx命令使用的線程數(shù)猪半,適當(dāng)?shù)木€程數(shù)量可以提高dx的效率:

dexOptions{
        threadCount 2
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市偷线,隨后出現(xiàn)的幾起案子磨确,更是在濱河造成了極大的恐慌,老刑警劉巖声邦,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏奥,死亡現(xiàn)場離奇詭異,居然都是意外死亡亥曹,警方通過查閱死者的電腦和手機邓了,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳瞪,“玉大人骗炉,你說我怎么就攤上這事∩呤埽” “怎么了句葵?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我乍丈,道長剂碴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任轻专,我火速辦了婚禮忆矛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铭若。我一直安慰自己洪碳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布叼屠。 她就那樣靜靜地躺著瞳腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镜雨。 梳的紋絲不亂的頭發(fā)上嫂侍,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音荚坞,去河邊找鬼挑宠。 笑死,一個胖子當(dāng)著我的面吹牛颓影,可吹牛的內(nèi)容都是我干的各淀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼诡挂,長吁一口氣:“原來是場噩夢啊……” “哼碎浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起璃俗,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奴璃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后城豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苟穆,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年唱星,在試婚紗的時候發(fā)現(xiàn)自己被綠了雳旅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡间聊,死狀恐怖岭辣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甸饱,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站叹话,受9級特大地震影響偷遗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驼壶,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一氏豌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧热凹,春花似錦泵喘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碟渺,卻和暖如春鲜锚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苫拍。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工芜繁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绒极。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓骏令,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垄提。 傳聞我的和親對象是個殘疾皇子榔袋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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