多聚道打包

根据公司业务要求,需要在将App上架到各大应用市场,并进行统计不同聚道用户数等。我们一般集成友盟统计来实现该方式。

android原始打包方式配置。(已在AndroidManifest.xml文件中配置聚道id和聚道name)

 productFlavors {
        xiaomi {}
        baidu {}
        huawei {}
        _360 {}
    }

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

    android.applicationVariants.all {
        variant ->
        variant.outputs.all {
            output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                // 输出apk名称为mvvmtest_v1.0._360.apk
                def fileName = "mvvmtest_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                outputFileName = new File("../release/", fileName)
            }
        }
    }

该方式打包需要一个个点击打包,并且系统原因会使得打包异常慢,当有非常多的聚道包要打时,这样就非常繁琐了。

为了便于快速打多个聚道包,使用腾讯的VasDolly配置完成打包。

配置VasDolly步骤:

1.添加依赖。

可参考官方文档配置:https://github.com/Tencent/VasDolly

2.配置聚道列表。

1.在gradle.properties中添加如下配置。

channel_file=channel.txt

2.在项目根目录新建channel.txt文件,添加配置聚道。

3.通过Gradle生成多聚道包。

1.直接编译生成多聚道包

//命令行操作打包,gradlew channelDebug、gradlew channelRelease
    channel{
        //指定渠道文件
        channelFile = new File(project.rootDir, "channel.txt")
        //多渠道包的输出目录,默认为new File(project.buildDir,"channel")
        baseOutputDir = new File(project.rootProject.buildDir,"channel")
        //多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}
        apkNameFormat ='${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}'
        //快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)
        isFastMode = false
        //buildTime的时间格式,默认格式:yyyyMMdd-HHmmss
        buildTimeDateFormat = 'yyyyMMdd-HH:mm:ss'
        //低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式
        lowMemory = false
    }

生成后所在目录如下。

通过上述方式生成的包大概时长27s,但是该方式生成的包进行360加固后,聚道名称会丢失。因此推荐使用方式二,生成基准包并加固后重新生成多聚道包。 

2.根据已有基础包重新生成多渠道包。

rebuildChannel {
        //命令操作打包 gradlew rebuildChannel
        //指定渠道文件
        channelFile = new File(project.rootDir, "channel.txt")
        //存在的基础包路径
//        baseDebugApk = 已有Debug APK
//        baseReleaseApk = 已有Release APK
        baseReleaseApk = new File(project.buildDir, "app-release_10_jiagu_sign.apk")
        //默认为new File(project.buildDir, "rebuildChannel/debug")
        debugOutputDir = new File(project.buildDir, "rebuildChannel/debug")
        //默认为new File(project.buildDir, "rebuildChannel/release")
        releaseOutputDir =new File(project.buildDir, "rebuildChannel/release")
        //快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)
        isFastMode = false
        //低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式
        lowMemory = false
    }

生成后所在目录如下。

最后编译时长大约4s。

4.读取聚道信息。

String channel = ChannelReaderUtil.getChannel(getApplicationContext());

可通过该方式读取聚道信息,这样可在Application中动态获取聚道名称并设置聚道ID。

参考链接:

 1.https://www.cnblogs.com/tangs/articles/11251090.html 

 2.https://blog.csdn.net/qq_35070105/article/details/80334758

   

原文地址:https://www.cnblogs.com/fangg/p/11265607.html