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 的集成,请参照友盟官网

       
        

        
        

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的介绍,请参照 连接

你可能感兴趣的:(Android 打包那些事儿)