Android 打包那些事儿

一、渠道包

1、什么是渠道包?

渠道包是 针对不同应用市场添加不同 标识的 apk文件,用于上传不同应用市场,一般是在清单文件中的meta-data标签下配置不同的value来区分不同的渠道

2、渠道包的作用

a、用于观察不同应用市场的下载量、用户数等
b、查看app 在每个渠道的统计数据
c、通过下载量、渠道统计等统计数据,可以进行运营推广

二、友盟多渠道打包介绍(Android Gradle Plugin)

步骤:

a、清单文件中添加友盟的基本配置(必须)
b、在build文件中添加默认渠道配置(非必须)
c、添加签名文件配置(必须)
d、多渠道脚本支持(必须)
e、通过命令gradlew assembleRelease 或者Generate signed apk 打包

1、清单文件中添加友盟的基本配置

UMENG_CHANNEL 对应value添加channel 点位符,用于动态替换,关于友盟SDK 的集成,请参照友盟官网

       <!-- 友盟appkey  -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="242342342424242424" />

        <!-- 渠道标示*必须以UMENG_CHANNEL为key -->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

2、在build文件中添加默认渠道配置 (manifestPlaceholders )

如果未设置渠道,会走默认配置,下列代码添加的默认渠道配置为 main

andrid{
   defaultConfig {
        applicationId "xxx.xxx.xxx"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        flavorDimensions "1.0"

        // Enabling multidex support.
        multiDexEnabled true

        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "main"]
       }    
    }

3、添加签名文件配置

切记signingConfigs 必须放到buildTypes 前面,否则会报如下错误

Could not get unknown property 'release' for SigningConfig

android{
  signingConfigs {
        debug {
            keyAlias 'debug'
            keyPassword '11111111'
            storeFile file('C:/keystore/debug.jks')
            storePassword '11111111'
        }
        release {
            keyAlias 'release'
            keyPassword '11111111'
            storeFile file('C:/keystore/release.jks')
            storePassword '11111111'
        }
    }

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

  
}

4、多渠道脚本支持

//定义的所有渠道
    productFlavors {
        main {      //主站
//            manifestPlaceholders =[UMENG_CHANNEL_VALUE: "main"]
        }
        tencent {  //腾讯应用包
//            manifestPlaceholders =[UMENG_CHANNEL_VALUE: "tencent"]
        }
    }

   //遍历替换清单文件中的渠道名称
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

//   gradle 3.0及之后用如下配置更改渠道文件名
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "${variant.productFlavors[0].name}_test.apk"
        }
    }
//   gradle 3.0之前用如下配置更改渠道文件名
//    applicationVariants.all { variant ->
//        variant.outputs.each { output ->
//            def outputFile = output.outputFile
//            if (outputFile != null && outputFile.name.endsWith('.apk')) {
//                def fileName = "${variant.productFlavors[0].name}_test.apk"
////                def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
//                output.outputFile = new File(outputFile.parent, fileName)
//            }
//        }
//    }

5、通过命令gradlew assembleRelease 或者Generate signed apk 打包

打好包后,可以在 以渠道名为文件夹里找到,提供一个简单的 demo

三、其它多渠道打包介绍

Android Gradle Plugin 打包方式是google 提供的,当打多个渠道包,例如20个,往往要花费数个小时才能打完所有渠道包,主要有以下缺点:
a、每次打包都要走一遍构建流程,效率非常低,只适合较少渠道场景
b、Gradle会为每个渠道包生成一个不同的BuildConfig.java类,记录渠道信息,导致每个渠道包的DEX的CRC值都不同,一般情况下,这是没有影响的。但是如果你使用了微信的Tinker热补丁方案,那么就需要为不同的渠道包打不同的补丁,这完全是不可以接受的。所以我们得保证每个包的DEX和CRC 完全一致才行,这样我们就只需要生成一个补丁即可

目前市场上提供比较好用的多渠道打包工具有腾讯的 VasDolly
(v1和v2都支持)、美团的 walle(支持v2签名)
packer-ng-plugin(v1和v2都支持),基本原理一致,只是某些技术细节略有差异

四、多渠道打包原理介绍

看了美团和腾讯多渠道打包的方案原理,针对v2签名基本原理是一致的具体请参考

腾讯VasDolly原理

美团Walle原理

关于v1和v2的介绍,请参照 连接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容