AndroidStudio 多渠道打包實(shí)踐總結(jié)


寫在前面的話

公司之前使用Ant打包的,一個(gè)包平均要10分鐘堕战,三四個(gè)包下來,一個(gè)小時(shí)過去了拍霜,作為一名有追求的程序員嘱丢,這是不能忍受的,所以老大安排我對(duì)打包腳本進(jìn)行改造祠饺。

本次改造包括以下內(nèi)容:

  1. 編譯器由IDEA向AndroidStudio轉(zhuǎn)換
  2. 增加多渠道打包
  3. 修改打包后的apk文件名
  4. 備份混淆后的mapping文件

接下來就按照這幾塊來細(xì)說一下多渠道打包的事

編譯器由IDEA向AndroidStudio轉(zhuǎn)換

公司的項(xiàng)目原本是在IDEA上開發(fā)的屿讽,這款軟件是后臺(tái)開發(fā)的神器,AS在其基礎(chǔ)上增加了一些新功能吠裆。編譯的管理也不是Gradle伐谈,所以老大想轉(zhuǎn)到AS開發(fā),然后用Gradle试疙。
在轉(zhuǎn)的過程中也遇到了一些問題诵棵。總結(jié)來說這些問題可以分為:分包祝旷,多個(gè)jar包重復(fù)引用履澳,低版本Android support包缺少一些方法嘶窄,uses-sdk的兼容問題。我把異常信息貼上來就行了,本文重點(diǎn)不在這里距贷。

多jar重復(fù)引用
Error:Execution failed for task ':_2C:transformClassesWithJarMergingForRelease'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: io/agora/rtc/IRtcEngineEventHandler$AudioVolumeInfo.class

分包
Error:Execution failed for task ':_2C:transformClassesWithDexForRelease'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

版本過低柄冲,缺少方法
Error:(263, 22) 錯(cuò)誤: 找不到符號(hào)
符號(hào):   方法 addDrawerListener(Main)
位置: 類型為DrawerLayout的變量 mDrawerLayout
    
將依賴的minSdkVersion改為與項(xiàng)目一致
<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="22"
    tools:overrideLibrary="org.ffmpeg.android,android.support.v7.recyclerview,android.support.coreui,
        android.support.compat,android.support.v4,android.support.fragment,android.support.mediacompat,
        android.support.coreutils,android.support.v13"/>

增加多渠道打包

除了要增加多渠道打包外,還需要在多渠道中修改一些東西忠蝗,具體修改的內(nèi)容如下:

1现横、首先不同的應(yīng)用需要修改applicationId(百度地圖,友盟統(tǒng)計(jì)阁最,訊飛語音的App_key)
2戒祠、用到shareSDK,不同的渠道要替換現(xiàn)在assets這個(gè)目錄下面的文件。
3速种、不同的應(yīng)用的圖標(biāo)替換 
4姜盈、應(yīng)用數(shù)據(jù)的SD卡存儲(chǔ)目錄 
5、應(yīng)用的AAS接口地址
6配阵、修改生成的apk名字和備份mapping 文件

1 修改applicationId 馏颂。修改友盟,微信等第三方App_Key等動(dòng)態(tài)數(shù)據(jù)都是通過 manifestPlaceholders 占位符的形式進(jìn)行修改 貼一下圖看一下就懂了

不同的渠道有不同的applicationId,然后修改應(yīng)用的名字棋傍,App_Key PERMISSION這個(gè)字段是由于項(xiàng)目中用到了自定義權(quán)限救拉,所以要根據(jù)applicationId進(jìn)行修改。到此舍沙,第一步完成了,是不是很快剔宪?

2 用到shareSDK,不同的應(yīng)用要替換現(xiàn)在assets這個(gè)目錄下面的文件拂铡。

3 不同的應(yīng)用的圖標(biāo)替換

處理這個(gè)問題實(shí)質(zhì)就是資源文件的替換(包括assets 和res 文件的合并)

多說無益,看圖把

這里我用了相對(duì)路徑葱绒,相對(duì)于App項(xiàng)目感帅,這樣子提交到svn的話就不用修改路徑了。通過為每一個(gè)渠道指定assets和res的目錄達(dá)到編譯的時(shí)候動(dòng)態(tài)合并資源

4 應(yīng)用數(shù)據(jù)的SD卡存儲(chǔ)目錄

5 應(yīng)用的AAS接口地址

這個(gè)項(xiàng)的要用到buildConfigField 和BuildConfig地淀,在buildConfigField的參數(shù)會(huì)在編譯的時(shí)候生成到BuildConfig中失球,每一個(gè)渠道都會(huì)生成一個(gè)BuildConfig,通過它來達(dá)到動(dòng)態(tài)修改SD卡存儲(chǔ)目錄和AAS接口地址 帮毁。

老規(guī)矩实苞,上圖

這個(gè)是在build.gradle中定義的


看看BuildConfig中的定義


說完這個(gè)后我還想說一個(gè),如何在這個(gè)BuildConfig中生成一個(gè)對(duì)象烈疚,

解決這個(gè)問題的話就想想我們平時(shí)實(shí)例化一個(gè)對(duì)象是怎么做的,包名+類 類名 = new 包名+類(),然后看看上圖黔牵,就明了。寫全路徑是為了解決導(dǎo)包的問題爷肝。

6 修改生成的apk名字和備份mapping 文件
//App同級(jí)目錄中新建一個(gè)APK文件夾

def apkUrl = file('../APK')
applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    //修改apk名字并輸出到指定位置
                    def fiName
                    if (variant.productFlavors[0].name == "internal") {
                        fiName = "Xiaolaba_a_build_${variant.productFlavors[0].name}_${releaseCode}.apk"
                    } else {
                        fiName = "School_a_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_${releaseCode}.apk"
                    }
                    output.outputFile = new File(apkUrl, fiName)
                    //備份mapping文件
                    if (variant.getBuildType().isMinifyEnabled()) {
                        variant.assemble.doLast {
                            copy {
                                from variant.mappingFile
                                into "${rootDir}/APK"
                                rename { String fileName ->
                                    "mapping-${fiName}.txt"
                                }
                            }
                        }
                    }
                }

            }

總結(jié)

到此猾浦,多渠道的打包就已經(jīng)完成了陆错。不過還想提一下如何令build.gradle 這個(gè)文件如何變得優(yōu)雅起來

首先,在app的build.gradle中新建一個(gè)config.gradle

其次 在build.gradle中引入config.gradle金赦,project代表當(dāng)前的build.gradle 定義好這些參數(shù)后就可以用了音瓷。

這是我在項(xiàng)目中用到的config.gradle xxxxx代表一些敏感信息,所以在這里隱去
ext {
    android = [
            compileSdkVersion: 23,
            buildToolsVersion: "26.0.0",
            minSdkVersion    : 8,
            targetSdkVersion : 23
    ]
    //基礎(chǔ)配置
    dependency = [
            gridlayout  : 'com.android.support:gridlayout-v7:23.4.0',
            recyclerview: 'com.android.support:recyclerview-v7:23.4.0',
            multidex    : 'com.android.support:multidex:1.0.0',
            gson        : 'com.google.code.gson:gson:2.7',
            support     : 'com.android.support:support-v13:23.4.0'
    ]
    //業(yè)務(wù)地址
    urlSetting = [
            ethernet_addr: "xxxxx",
            dev_addr     : "xxxxx",
            school_addr     : "xxxxx",
            tyd_qdmy_addr:"xxxxx"

    ]
    //多渠道相關(guān)
    flavorsSetting = [
            app_id_tyd       : "xxxxx",
            app_name_tyd     : "xxxxx",

            app_id_qdmy      : "xxxxx",
            app_name_qdmy    : "xxxxx",

            app_id_school    : "xxxxx",
            app_name_school  : "xxxxx",
            app_name_internal: "xxxxx"
    ]

    //版本相關(guān)
    def versionCode = getVersionCode(releaseTimeAndVersionCode())
    def versionName = getVersionName()

    versionSettting = [
            versionCode: versionCode,
            versionName: versionName
    ]

}


def releaseTimeAndVersionCode() {
    String time = new Date().format("yyMMdd", TimeZone.getTimeZone("UTC"))
    return time.substring(1, time.length())
}

def getVersionCode(String version) {
    return Integer.parseInt(version)
}

def getVersionName() {
    def versionFile = file('version.properties')
    if (versionFile.exists()) {
        def Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionFile))
        def versionCode = versionProps['versionName'].toString()
        return versionCode
    } else {
        throw new GradleException("Could not find version.properties!")
    }
}

好了夹抗,多渠道打包總結(jié)就到此結(jié)束了绳慎。有不明白的地請(qǐng)留言。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兔朦,一起剝皮案震驚了整個(gè)濱河市偷线,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沽甥,老刑警劉巖声邦,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異摆舟,居然都是意外死亡亥曹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門恨诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳瞪,“玉大人,你說我怎么就攤上這事照宝∩呤埽” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵厕鹃,是天一觀的道長兢仰。 經(jīng)常有香客問我,道長剂碴,這世上最難降的妖魔是什么把将? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮忆矛,結(jié)果婚禮上察蹲,老公的妹妹穿的比我還像新娘。我一直安慰自己催训,他們只是感情好洽议,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漫拭,像睡著了一般绞铃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫂侍,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天儿捧,我揣著相機(jī)與錄音荚坞,去河邊找鬼。 笑死菲盾,一個(gè)胖子當(dāng)著我的面吹牛颓影,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懒鉴,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼诡挂,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了临谱?” 一聲冷哼從身側(cè)響起璃俗,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悉默,沒想到半個(gè)月后城豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抄课,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年唱星,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟磨。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡间聊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵拘,到底是詐尸還是另有隱情哎榴,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布僵蛛,位于F島的核電站尚蝌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墩瞳。R本人自食惡果不足惜驼壶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一氏豌、第九天 我趴在偏房一處隱蔽的房頂上張望喉酌。 院中可真熱鬧,春花似錦泵喘、人聲如沸泪电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽相速。三九已至,卻和暖如春鲜锚,著一層夾襖步出監(jiān)牢的瞬間突诬,已是汗流浹背苫拍。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺隙,地道東北人绒极。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蔬捷,于是被迫代替她去往敵國和親垄提。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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

  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng)周拐,請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,142評(píng)論 8 72
  • 1铡俐、為什么要進(jìn)行多渠道打包? 安卓應(yīng)用商店(一個(gè)商店也叫做一個(gè)渠道妥粟,如豌豆莢审丘,360手機(jī)助手,應(yīng)用寶)眾多罕容,大大小...
    閑庭閱讀 5,379評(píng)論 1 13
  • 參考 中文官網(wǎng)構(gòu)建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,366評(píng)論 0 16
  • Gradle對(duì)于很多開發(fā)者來說有一種既熟悉又陌生的感覺备恤,他是離我們那么近,以至于我每天做項(xiàng)目都需要他锦秒,但是他又是離...
    阿_希爸閱讀 9,582評(píng)論 10 199
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,280評(píng)論 25 707