Gradle多版本/多環(huán)境打包

本文開發(fā)環(huán)境:

  • Android Studio 3.1.4 Build #AI-173.4907809, built on July 24, 2018
  • JRE: 1.8.0_152-release-1024-b02 amd64
  • JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
  • Windows 10 10.0

一、概述

App開發(fā)過程中,基本都需要多個(gè)環(huán)境寞冯,比如開發(fā)環(huán)境develop,測(cè)試環(huán)境check梭稚,生產(chǎn)環(huán)境product。各個(gè)環(huán)境下絮吵,網(wǎng)絡(luò)請(qǐng)求的url會(huì)有所區(qū)別弧烤,一般我們通過baseUrl進(jìn)行切換。

  • 開發(fā)環(huán)境用于程序員開發(fā)和自測(cè)蹬敲;
  • 測(cè)試環(huán)境用于測(cè)試人員測(cè)試使用暇昂,環(huán)境配置和生產(chǎn)環(huán)境完全相同;
  • 生產(chǎn)環(huán)境即正式環(huán)境粱栖,也就是用戶所使用的環(huán)境话浇。

每個(gè)環(huán)境下,app還可以分為debug版本和release版本闹究。

  • debug版本下幔崖,apk無需混淆,可以多一些打印日志的操作渣淤。
  • release版本下赏寇,文件混淆,隱藏日志打印价认。

Android Studio中嗅定,多版本/多環(huán)境等需求都可以通過配置gradle文件來解決。

二用踩、實(shí)踐

debug和release版本的區(qū)分通過buildTypes

1. 新建一個(gè)demo工程渠退,AS默認(rèn)生成的gradle只有release版本。
defaultConfig {
    applicationId "com.allsunny.packagedemo"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

demo中的默認(rèn)applicationId 為com.allsunny.packagedemo脐彩,我們知道碎乃,在Android系統(tǒng)中,同一個(gè)app只能安裝一個(gè)惠奸,系統(tǒng)就是根據(jù)applicationId來判斷是否為同一個(gè)apk梅誓。我們要想在一臺(tái)手機(jī)中同時(shí)安裝debug和release版本,就要修改applicationId 。

2.我們將其略加修改梗掰,添加混淆和debug版本嵌言。debug版本下增加字段applicationIdSuffix用來修改applicationId
    buildTypes {
        //調(diào)試版本,無混淆
        debug {
            //為debug版本的包名添加.debug后綴
            applicationIdSuffix ".debug"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }

修改完成后及穗,我們可以通過選擇Build Variant來選擇不同的打包環(huán)境和打包版本摧茴,目前只有兩個(gè)版本debug和release。如圖所示:

1.png

我們選擇release后編譯打包拥坛。
因?yàn)槲覀儸F(xiàn)在有debug和release兩個(gè)版本蓬蝶,release無法再使用默認(rèn)的簽名文件,所以我們要自己生成一個(gè)jks簽名文件猜惋,release包使用新生成的正式簽名文件來簽名。否則會(huì)報(bào)錯(cuò):

the apk for your currently selected variant(app-release-unsigned.apk)is not signed.
Please specity a signing configuration for this variant(release)

配置簽名文件方案:https://blog.csdn.net/l_lhc/article/details/77963683
配置完成后培愁,AS會(huì)自動(dòng)在release{...}中生成 signingConfig signingConfigs.config著摔。然后就可以正常編譯打包了。至此定续,多版本的配置就完成了谍咆。接下來我們來看多環(huán)境的gradle配置。

環(huán)境的區(qū)分通過productFlavors

productFlavors {
    //開發(fā)環(huán)境
    develop {
        applicationIdSuffix ".dev"       //applicationId "com.allsunny.packagedemo.dev"
        buildConfigField("int", "ENV_TYPE", "1")
        manifestPlaceholders = ["app_name": "開發(fā)環(huán)境", "app_launcher_icon": "@mipmap/ic_launcher_dev"]
    }

    //生產(chǎn)環(huán)境
    product {
        buildConfigField("int", "ENV_TYPE", "2")
        manifestPlaceholders = ["app_name": "生產(chǎn)環(huán)境", "app_launcher_icon": "@mipmap/ic_launcher"]
    }
}

編譯后如果報(bào)如下錯(cuò)誤:

All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

則在android{...}中添加 flavorDimensions "default"

android {
    flavorDimensions "default"
    ......
    }

目前demo中只添加了開發(fā)環(huán)境和生產(chǎn)環(huán)境私股,開發(fā)者可以自主添加測(cè)試環(huán)境摹察。我們?cè)赿evelop環(huán)境中增加了applicationIdSuffix ".dev" ,這樣就可以在同一臺(tái)手機(jī)中同時(shí)安裝4個(gè)apk包了倡鲸。分別是:

  • 開發(fā)環(huán)境debug版本供嚎,包名com.allsunny.packagedemo.dev.debug
  • 開發(fā)環(huán)境release版本,包名com.allsunny.packagedemo.dev
  • 生產(chǎn)環(huán)境debug版本峭状,包名com.allsunny.packagedemo.debug
  • 生產(chǎn)環(huán)境debug版本克滴,包名com.allsunny.packagedemo

buildConfigField表示在編譯生成的BuildConfig文件當(dāng)中添加字段屬性“ENV_TYPE”,我們可以在代碼當(dāng)中根據(jù)BuildConfig.ENV_TYPE的值來判斷apk是處于開發(fā)環(huán)境(1== BuildConfig.ENV_TYPE)還是生產(chǎn)環(huán)境(2==BuildConfig.ENV_TYPE)优床。

manifestPlaceholders中定義的屬性字段會(huì)替換AndroidManifest當(dāng)中的相關(guān)屬性劝赔,我們目前替換了app名稱和icon。在manifest文件中需做對(duì)應(yīng)修改:

    <application
        android:allowBackup="true"
        android:icon="${app_launcher_icon}"
        android:label="${app_name}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

編譯后在Build Variant中可以看到可以生成4個(gè)apk版本了:

2.png

我們?cè)陧撁嬷袑虴NV_TYPE打印出來:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvPackageName = findViewById(R.id.tv_package_name);
        tvPackageName.setText("packageName = " + getApplication().getPackageName() + "\n\n"
                + "ENV_TYPE = " + BuildConfig.ENV_TYPE);
    }

顯示頁面如圖所示:


3.jpg
4.jpg
5.jpg

至此胆敞,我們就完成了多版本和多環(huán)境的gradle文件配置着帽。

三、注意:

  1. 網(wǎng)上的第三方推送一般以按包名唯一區(qū)分移层,已上線的app有集成推送模塊的仍翰,要根據(jù)不同包名申請(qǐng)多個(gè)賬號(hào)。防止把測(cè)試的推送信息推送給正式用戶幽钢。
  2. 微信的分享也是根據(jù)包名來進(jìn)行驗(yàn)證的歉备,所以測(cè)試分享模塊時(shí)候,要將環(huán)境改為生產(chǎn)環(huán)境的release版本匪燕。
  3. 在代碼中使用到provider的地方蕾羊,也需要根據(jù)包名做對(duì)應(yīng)的修改喧笔,比如:
        <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>
 Matisse.from(this)
     .choose(MimeType.ofImage())
     .showSingleMediaType(true)
     .countable(false)
     .capture(true)
     .captureStrategy(new CaptureStrategy(true, mContext.getPackageName() + ".fileprovider"))
     .maxSelectable(1)
     .thumbnailScale(0.85f)
     .imageEngine(new GlideEngine())
     .forResult(REQUEST_CODE_CHOOSE);

四、demo下載地址:

https://download.csdn.net/download/akirah/10610665

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末龟再,一起剝皮案震驚了整個(gè)濱河市书闸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌利凑,老刑警劉巖浆劲,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異哀澈,居然都是意外死亡牌借,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門割按,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膨报,“玉大人,你說我怎么就攤上這事适荣∠帜” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵弛矛,是天一觀的道長够吩。 經(jīng)常有香客問我,道長丈氓,這世上最難降的妖魔是什么周循? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮扒寄,結(jié)果婚禮上鱼鼓,老公的妹妹穿的比我還像新娘。我一直安慰自己该编,他們只是感情好迄本,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著课竣,像睡著了一般嘉赎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上于樟,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天公条,我揣著相機(jī)與錄音,去河邊找鬼迂曲。 笑死靶橱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播关霸,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼传黄,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了队寇?” 一聲冷哼從身側(cè)響起膘掰,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佳遣,沒想到半個(gè)月后识埋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡零渐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年窒舟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵盼。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辜纲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拦耐,到底是詐尸還是另有隱情,我是刑警寧澤见剩,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布杀糯,位于F島的核電站,受9級(jí)特大地震影響苍苞,放射性物質(zhì)發(fā)生泄漏固翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一羹呵、第九天 我趴在偏房一處隱蔽的房頂上張望骂际。 院中可真熱鬧,春花似錦冈欢、人聲如沸歉铝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽太示。三九已至,卻和暖如春香浩,著一層夾襖步出監(jiān)牢的瞬間类缤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工邻吭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留餐弱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像膏蚓,于是被迫代替她去往敵國和親瓢谢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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