多渠道打包的兩種方式總結(jié)

一呀洲、友盟多渠道打包

1. 按照友盟官方文檔說明,渠道信息通常需要在AndroidManifest.xml中配置如下值:

<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

統(tǒng)計(jì)的重點(diǎn)就是value值Channel_ID舌涨,即渠道標(biāo)識(shí)蛛株,例如:360,qq翰苫,wandoujia等等止邮,在這里不直接寫出某個(gè)渠道名,而是寫一個(gè)占位符奏窑,我們會(huì)在build.gradle中進(jìn)行設(shè)置导披,之后gradle編譯的時(shí)候會(huì)動(dòng)態(tài)的替換掉這個(gè)占位符。代碼如下:

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${CHANNEL_VALUE}" />

2. 在app的build.gradle的android{}中添加如下內(nèi)容:

android {
    flavorDimensions "default"
    productFlavors {
        web {}
        baidu {}
        c360 {}
        qq {}
        wandoujia {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }

}

也可以單獨(dú)設(shè)置:

android {  
    flavorDimensions "default"
    productFlavors {
        web {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "web "]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu "]
        }
        c360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360 "]
        }
        qq {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq "]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }  
}

productFlavors是android節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)埃唯。你需要打什么渠道的包撩匕,就在這里按友盟的要求用渠道名給UMENG_CHANNEL_VALUE賦值。上面這個(gè)配置的作用就是墨叛,為每個(gè)渠道包產(chǎn)生不同的 UMENG_CHANNEL_VALUE 的值止毕。

3. 自定義APK名稱,多渠道打包

    //自定義APK名稱,多渠道打包
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            variant.productFlavors.each { flavor ->
                def project = "cpm"
                def separator = "_"
                def buildType = variant.variantData.variantConfiguration.buildType.name
                def versionName = variant.versionName
                def versionCode = variant.versionCode
                def date = new Date()
                def formattedDate = date.format('yyyyMMdd')

                def apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + ".apk"
                if (buildType == "release") {
                    apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + separator + formattedDate + ".apk"
                }

                output.outputFileName = apkName
            }
        }
    }

output.outputFileName是apk輸出位置模蜡,其它的是自定義apk名稱,最終輸出位置如下圖:

image.png

app–>build–>outputs–>apk

4. 配置簽名信息扁凛,代碼如下:

Properties props = new Properties()
props.load(project.rootProject.file('local.properties').newDataInputStream())

android {
    signingConfigs {
            release {
                storeFile file(props['release.keystore'])
                storePassword '123456'
                keyAlias '123456'
                keyPassword '123456'
            }
        }
    }

storeFile file(props[‘release.keystore’])是我的keystore位置忍疾,在local.properties中添加如圖代碼:

image.png

5. 執(zhí)行打包命令

到這一步,所有配置已經(jīng)完成谨朝,從此以后我們就可以用一行命令打出N個(gè)包啦膝昆!
我們只需在Android Studio的命令行Terminal下輸入以下命令即可:

  • linux下打包全部的Release版渠道包:
./gradlew assembleRelease
  • windows下打包全部的Release版渠道包
gradlew.bat assembleRelease
  • 如果想要Debug的包:
gradlew.bat assembleDebug
  • 如果只要豌豆莢的包:
gradlew.bat assemblewandoujia
  • 如果只要豌豆莢的Release版:
gradlew.bat assemblewandoujiaRelease

6. build.gradle 總的配置文件,供參考:

apply plugin: 'com.android.application'

Properties props = new Properties()
props.load(project.rootProject.file('local.properties').newDataInputStream())

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    flavorDimensions "default"
    defaultConfig {
        applicationId "com.exmple.myApp"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        multiDexEnabled true
        versionCode 11000
        versionName "1.1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            storeFile file(props['release.keystore'])
            storePassword '123456'
            keyAlias '123456'
            keyPassword '123456'
        }
    }

    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.release
        }
        //線上環(huán)境
        release {
            debuggable false
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }

    lintOptions {
        ignoreWarnings true
        checkReleaseBuilds false
    }

    repositories {
        flatDir {
            dirs 'libs'
        }
    }

    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir "src/main/jniLibs"
    }

    productFlavors {
        web {}
        baidu {}
        c360 {}
        qq {}
        oppo {}
        vivo {}
        huawei {}
        mi {}
        meizu {}
        lenovo {}
        leshi {}
        sogou {}
        wandoujia {}
        samsung {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name, JPUSH_CHANNEL: name]
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    //自定義APK名稱,多渠道打包
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            variant.productFlavors.each { flavor ->
                def project = "cpm"
                def separator = "_"
                def buildType = variant.variantData.variantConfiguration.buildType.name
                def versionName = variant.versionName
                def versionCode = variant.versionCode
                def date = new Date()
                def formattedDate = date.format('yyyyMMdd')

                def apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + ".apk"
                if (buildType == "release") {
                    apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + separator + formattedDate + ".apk"
                }

                output.outputFileName = apkName
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
    implementation "com.android.support:design:$supportLibraryVersion"
    implementation "com.android.support:cardview-v7:$supportLibraryVersion"
    ...
}

二叠必、美團(tuán)Walle多渠道打包

1.修改項(xiàng)目根目錄下build.gradle文件荚孵,在buildscripts下的dependencies中增加:

classpath 'com.meituan.android.walle:plugin:1.1.6'

2. 修改app工程的build.gradle文件,增加如下信息:

1)頭部增加:

apply plugin: 'walle'

2)確保有簽名配置纬朝,下面是樣例收叶,

signingConfigs {
        release {
            storeFile file("../test.jks")        // 打包的文件的地址
            storePassword "123456"
            keyAlias "test"
            keyPassword "123456"
        }
        debug {
            storeFile file("../test.jks")
            storePassword "123456"
            keyAlias "test"
            keyPassword "123456"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug
        }
    }

3)增加如下配置(按照下面配置生成的渠道包在build/outputs/channels目錄下,而不是build/outputs/apk目錄):

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名稱
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

4)在dependencies中增加:

implementation 'com.meituan.android.walle:library:1.1.6'

3. 在app工程下新建文件channel共苛,放置渠道信息(根據(jù)實(shí)際需要修改):

xiaomi
360
huawei
vivo

4. 獲取渠道樣例:

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

5. 對(duì)于要設(shè)置到友盟里去判没,則需要參考友盟的設(shè)置方法。

6. 打包命令(更多命令及用法參考附錄官方指導(dǎo)):

 mac:./gradlew clean assembleReleaseChannels
 windows:gradlew clean assembleReleaseChannels

7. 生成多渠道包截圖:

image.png

8. build.gradle 總的配置文件隅茎,供參考:

apply plugin: 'com.android.application'

apply plugin: 'walle'

android {
    compileSdkVersion 28



    defaultConfig {
        applicationId "com.example.administrator.dabao"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }


    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            signingConfig signingConfigs.create("release")
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    signingConfigs {
        release {
            v2SigningEnabled true
            storeFile file("F:\\Android_studio\\keystore\\android.keystore")
            storePassword "123456"
            keyAlias "key0"
            keyPassword "123456"
        }
    }



}

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名稱
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

    implementation 'com.meituan.android.walle:library:1.1.6'

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澄峰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辟犀,更是在濱河造成了極大的恐慌俏竞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂竟,死亡現(xiàn)場(chǎng)離奇詭異魂毁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)出嘹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門席楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人税稼,你說我怎么就攤上這事烦秩。” “怎么了郎仆?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵只祠,是天一觀的道長。 經(jīng)常有香客問我丸升,道長铆农,這世上最難降的妖魔是什么牺氨? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任狡耻,我火速辦了婚禮墩剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夷狰。我一直安慰自己岭皂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布沼头。 她就那樣靜靜地躺著爷绘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪进倍。 梳的紋絲不亂的頭發(fā)上土至,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音猾昆,去河邊找鬼陶因。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垂蜗,可吹牛的內(nèi)容都是我干的楷扬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼贴见,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烘苹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起片部,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤镣衡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后档悠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捆探,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年站粟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黍图。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奴烙,死狀恐怖助被,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情切诀,我是刑警寧澤揩环,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站幅虑,受9級(jí)特大地震影響丰滑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倒庵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一褒墨、第九天 我趴在偏房一處隱蔽的房頂上張望炫刷。 院中可真熱鬧,春花似錦郁妈、人聲如沸浑玛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顾彰。三九已至,卻和暖如春胃碾,著一層夾襖步出監(jiān)牢的瞬間涨享,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工仆百, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灰伟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓儒旬,卻偏偏與公主長得像栏账,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栈源,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353