Android通過gradle 配置release與debug版本

前言

在項(xiàng)目中配置release和debug環(huán)境還是很有必要的玩讳,可以隨時(shí)打包線下和線上的版本并且在一部手機(jī)上同時(shí)開發(fā)線下app涩蜘,又可以體驗(yàn)觀察線上app的情況。

當(dāng)然熏纯,配置的主要思路都是一樣的同诫,但是具體細(xì)節(jié)可以有很多不同,文章只是按照思路實(shí)現(xiàn)樟澜,具體的細(xì)節(jié)有很多可以根據(jù)自己的喜好來配置误窖,都是可以的。
(1)在project項(xiàng)目結(jié)構(gòu)視圖中往扔,根目錄下創(chuàng)建一個(gè)config.gradle文件,用來配置一些項(xiàng)目公共的參數(shù)熊户,這樣其他部分直接引用就好萍膛,其實(shí)這部分完全可以在project的build.gradle里去配置或者project的gradle.properties等這些項(xiàng)目級(jí)別的都可以。

config.gradle文件內(nèi)容:

ext{
    url = [
            "debug":"https://......",
            "release":"https://......"
    ]
}

這里我們只設(shè)置線上線下服務(wù)器接口地址的變化部分(一般為服務(wù)器地址)嚷堡,當(dāng)然可以設(shè)置很多公共的參數(shù)蝗罗,比如版本號(hào)艇棕,相關(guān)sdk版本號(hào),但是這里我們以實(shí)現(xiàn)配置release和debug兩種版本app為目標(biāo)串塑。

(2)在project的build.gradle引用config.build(所以說可以直接定義在project的build.gradle這里面)
apply from: "config.gradle"

這段代碼寫在最外層就ok沼琉,不影響文件的其他部分內(nèi)容。

(3)在工程moudle的build.gradle中正式配置
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.dhasa.fun"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 2
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        sourceSets.main {
            jniLibs.srcDirs = ['libs']
        }
    }
    signingConfigs {
        release {
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
            storeFile file('C:/appsign/abc.jks')
            storePassword RELEASE_KEYSTORE_PASSWORD
        }
        debug {
            keyAlias DEBUG_KEY_ALIAS
            keyPassword DEBUG_KEY_PASSWORD
            storeFile file('C:/appsign/debugabc.jks')
            storePassword DEBUG_KEYSTORE_PASSWORD
        }
    }

    buildTypes {
        release {
            buildConfigField "String", "HostUrl", "\"${url["release"]}\""
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "easymeetingmanager_v${defaultConfig.versionName}.apk"
                }
            }
            manifestPlaceholders = [
                    //這里也是在AndroidManifest.xml中配置的app圖標(biāo)桩匪,同樣在這里寫了了不同的資源文件打瘪,從而實(shí)現(xiàn)了動(dòng)態(tài)配置
                    app_icon: "@mipmap/logo",
                    app_name: "@string/app_name_release"
            ]
        }
        debug {
            applicationIdSuffix '.debug'
            signingConfig signingConfigs.debug
            buildConfigField "String", "HostUrl", "\"${url["debug"]}\""
            manifestPlaceholders = [
                    //這里也是在AndroidManifest.xml中配置的app圖標(biāo),同樣在這里寫了了不同的資源文件傻昙,從而實(shí)現(xiàn)了動(dòng)態(tài)配置
                    app_icon: "@mipmap/logo_debug",
                    app_name: "@string/app_name_debug"
            ]
        }
    }
}

1闺骚、defaultConfig中是一些默認(rèn)的配置,無論是release還是debug都會(huì)執(zhí)行的部分妆档,其中包名applicationId還有版本號(hào)這些都可以配置到其他部分引入進(jìn)來僻爽。
2、signingConfigs翻譯過來簽名配置贾惦,分為release和debug兩部分胸梆,簽名需要使用不同的簽名,可以看到這部分很明顯是其他文件聲明好的须板,這里我寫在了gradle.properties文件中碰镜,這些值都是生成簽名文件時(shí)隨便定義的:

DEBUG_KEY_ALIAS=debuga
DEBUG_KEYSTORE_PASSWORD=debugmeet
DEBUG_KEY_PASSWORD=debugmeet
RELEASE_KEY_ALIAS=abcxy
RELEASE_KEYSTORE_PASSWORD=zwxy
RELEASE_KEY_PASSWORD=sss

3、buildTypes中同樣分成了release和debug兩部分逼纸,其中根據(jù)版本引用了不同的服務(wù)器地址洋措,不同的簽名,混淆配置文件杰刽,是否壓縮菠发,是否去除無用資源文件等等,其中:

  • buildConfigField是會(huì)在BuildConfig文件(這個(gè)文件在app->build->generated->source->buildConfig->包名->BuildConfig)中生成一個(gè)對應(yīng)類型的變量贺嫂,并且將設(shè)置好的值付給它(我們還經(jīng)常通過里面的布爾值DEBUG來判斷是否輸出日志)滓鸠,因?yàn)槭窃诰幾g期完成,java代碼中就可以這樣來引用:
public static final String COMMON_URL = BuildConfig.HostUrl;

當(dāng)然這也是在公共文件中聲明的第喳,可以在任何代碼處使用糜俗。

  • manifestPlaceholders,這個(gè)里面根據(jù)名字可以看到是可以和Manifest文件關(guān)聯(lián)起來的曲饱,上面代碼我們設(shè)置了不同版本app的圖標(biāo)悠抹,AndroidManifest中其他的需要?jiǎng)討B(tài)配置變量也可以通過對manifestPlaceholders數(shù)組配置相應(yīng)的鍵值對來實(shí)現(xiàn),但是這篇忽略這個(gè)不講了扩淀⌒ǖ校看一下在Manifest文件中的使用情況(這樣一來開發(fā)版本和線上版本從圖標(biāo)和名字上都可以區(qū)分了,這主要是幫助使用者清楚的區(qū)分):
<application
        android:allowBackup="true"
        android:icon="${app_icon}"
        android:label="${app_name}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ......
</application>
  • applicationIdSuffix '.debug'驻谆,注意buildTypes下debug中的這行代碼卵凑,可以看出是在之前applicaionId后面加個(gè)字符串庆聘,這樣才能打成兩個(gè)包名,而這也是在同一部手機(jī)上同時(shí)運(yùn)行開發(fā)版本和正式版本的關(guān)鍵
(4)也許設(shè)置完這些后應(yīng)該就可以打包出兩個(gè)app了勺卢,這時(shí)候要注意了伙判,還是可能存在問題,因?yàn)槟愕腶pplicationId為了app能在同一部手機(jī)上同時(shí)運(yùn)行黑忱,兩種打包出來的名字是不同的宴抚,如果你在app中用到了applicationId的部分同樣需要?jiǎng)討B(tài)替換,比如android7.0訪問文件時(shí)需要provider

在AndroidManifest.xml中:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
</provider>

在java代碼中:

public static final String PROVIDER_FILE = BuildConfig.APPLICATION_ID+".fileprovider";

這樣就ok了

(5)下面我們通過AS左下角的Build Variants 中app的release和deubug 打兩個(gè)包到手機(jī)上看一下效果(切換到目標(biāo)版本點(diǎn)運(yùn)行按鈕即可),如下圖:
切換debug和release版本.png
END
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃跷,一起剝皮案震驚了整個(gè)濱河市垃帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酱固,老刑警劉巖运悲,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡磁餐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泥张,你說我怎么就攤上這事〕疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵赠涮,是天一觀的道長别瞭。 經(jīng)常有香客問我,道長墙歪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮址愿,結(jié)果婚禮上省艳,老公的妹妹穿的比我還像新娘赖晶。我一直安慰自己,他們只是感情好涩堤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布白魂。 她就那樣靜靜地躺著肴掷,像睡著了一般台夺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痴脾,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天颤介,我揣著相機(jī)與錄音,去河邊找鬼。 笑死滚朵,一個(gè)胖子當(dāng)著我的面吹牛冤灾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辕近,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瞳购,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亏推?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤年堆,失蹤者是張志新(化名)和其女友劉穎吞杭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变丧,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽狗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痒蓬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童擎。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攻晒,靈堂內(nèi)的尸體忽然破棺而出顾复,到底是詐尸還是另有隱情,我是刑警寧澤鲁捏,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布芯砸,位于F島的核電站,受9級(jí)特大地震影響给梅,放射性物質(zhì)發(fā)生泄漏假丧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一动羽、第九天 我趴在偏房一處隱蔽的房頂上張望包帚。 院中可真熱鬧,春花似錦运吓、人聲如沸渴邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽几莽。三九已至,卻和暖如春宅静,著一層夾襖步出監(jiān)牢的瞬間章蚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纤垂,地道東北人矾策。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像峭沦,于是被迫代替她去往敵國和親贾虽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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