美文网首页Android developer安卓Android
Android多渠道打包没你想的那么复杂

Android多渠道打包没你想的那么复杂

作者: 沈同学 | 来源:发表于2016-06-22 15:55 被阅读7855次

    今天运营同事给我发了15个应用平台对应的apk名。我第一反应就是给你个apk自己改名不就完了...于是心中一万个草泥马奔腾而过。

    转念一想,这事儿可能不是那么简单,只怪我图样图森破。于是想到了之前看到过多渠道打包,那么就引出了第一个问题:

    一、什么是多渠道

    我理解的是:APP发布到不同的应用平台,监测用户是从哪个平台安装的。

    二、为什么要多渠道打包

    1. 统计用户安装APP来源
    知道多渠道的意义就不难理解多渠道打包主要是为了我们统计分析用的。所以,这样就很清楚了我最初的想法不是不行,而是不好,对今后的产品分析没有任何帮助。

    2.批量修改生成的apk文件名
    根据运营给的命名规则,如果是一个个的右键-重命名,那15个还好,要真是有1000个,运营同事一定会拿刀找我的...而多渠道打包所有的都自动生成。

    3.可更改包名
    如果有生成不同包名的需求,通过gradle就可以解决。

    4.生成不同应用名称或图标
    有的时候你会在不同平台看到XX-小米版,XX-魅族版等等,或者beta版的图标和正式的不一样,其实代码还是那个代码,无非做点小小的改动,具体实现我们后面会说。

    这是我所了解到的,可能还有很多我不知道的用途,欢迎大家在下面留言。

    三、如何多渠道打包

    多渠道打包网上大概有两种,一个是通过gradle,另一个是美团介绍的只打一个包,然后解压替换文件,两者比较美团的方法要更快,但是今天我们先不做介绍,如果想了解请看《Android多渠道打包飞一般的感觉》。。

    1. 在AndroidManifest.xml中添加占位符
    一般都是像友盟,腾讯统计分析SDK中使用的方案,网上友盟的较多,我实际用的是腾讯分析所以就拿腾讯的来说(其实都一样)。
    首先,在AndroidManifest.xmlapplication标签里添加一个meta-data标签定义MTA_CHANNEL占位符,腾讯分析SDK会读取里面的value值传到后台,便于我们日后分析。

      <meta-data
                android:name="MTA_CHANNEL"
                android:value="${MTA_CHANNEL_VALUE}" />
    

    2. 修改app下的build.gradle文件,在android闭包中添加productFlavors属性配置占位符

    apply plugin: 'com.android.application'
    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.2"
    
        defaultConfig {
            applicationId "com.aimerd.channel"
            minSdkVersion 11
            targetSdkVersion 21
            versionCode 1
            versionName "1.0.0"
            multiDexEnabled true
        }
        buildTypes {
            release {
                // 不显示Log
                buildConfigField "boolean", "LOG_DEBUG", "false"
                //启用混淆代码的功能
                minifyEnabled true
                //压缩对齐生成的apk包
                zipAlignEnabled true
                //指定混淆规则,需要压缩优化的混淆要把proguard-android.txt换成proguard-android.txt
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                //移除无用的资源文件
                shrinkResources true
                //启用multidex的支持
                multiDexEnabled true
            }
        }
        productFlavors 
            baidu {
                manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidu"]
            }
            _91 {
                manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"]
            } 
            wandoujia {
                manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"]
            }
            xiaomi {
                manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"]
            }
        }
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (variant.buildType.name.equals('release')) {
                    //生成apk名字的格式:Channel1.0.0_2016-06-22_baidu.apk
                    //可自定义自己想要生成的格式
                    def fileName = "Channel${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                           output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    
    def releaseTime() {
        return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:21.0.3'
        compile 'com.android.support:multidex:1.0.1'
    }
    

    如果觉得productFlavors重复代码太多,还可以这样写:

    productFlavors {
        baidu {}
        _91 {}        
        wandoujia {}
        xiaomi {}
    }
    //批量处理
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: name]
    }
    

    注意:像91和360这种数字的是不可以的,我试过"91"虽然可以编译通过,但打包的时候会报错

    Error:Execution failed for task ':app:transformClassesWithRetrolambdaFor91Release'.
    > java.lang.NullPointerException (no error message)
    

    具体原因我不清楚,还请知道原因或者知道解决方法的告诉我一下,谢谢!

    3. 打包

    • build->Generate Signed APK...
      这个没什么好说的,很简单
    • AS的Terminal输入:gradle build
      可一次性打包所有渠道,如果想打某个渠道的包,先输入:gradle tasks
    gradle tasks信息

    找到想要打包的渠道,例如红框标出的豌豆荚,在终端输入:gradle assembleWandoujia,就会单独打包豌豆荚的包了。

    注意:有的输入命令会提示'gradle'不是内部或外部命令,也不是可运行的程序或批处理文件。说明没有配置gradle的环境变量,配置成功重启即可。

    4.如何更改包名
    刚才提到可以根据不同业务需求,需要更改包名,在productFlavors中指定不同的applicationId即可

    productFlavors {
        baidu {
            applicationId="com.aimerd.channel"
            manifestPlaceholders = [MTA_CHANNEL_VALUE:"baidu"]
        }
    }
    

    5.如何生成不同应用名称或图标
    我们以baidu为例,在app模块,src目录下,新建一个与main目录同级的baidu目录(这里的名字跟productFlavors中定义的渠道名要一致):

    baidu目录结构
    valuesstrings.xml中的"app_name"改成自己想要的应用名称。
    <resources>
        <string name="app_name">哈哈哈-小米版</string>
    </resources>
    

    如果需要换图标,只需更换ic_launcher.png文件即可。

    相关文章

      网友评论

      • 痴尘_fee:在app的build.gradle里配置了productFlavors后,点击运行按钮,会每个渠道包都编译打包一遍,造成很慢,知道怎么配置让
        AS只运行一个包吗?
      • 98c1c1f0b5d4:还有更简单的,集成openinstall SDK后这一堆代码就可以免去。
        小方_27f9:找了一堆资料,原来这个就可以解决我的需求 , 值得推荐 https://www.openinstall.io
      • f0cf0e17c2c6:学习了,好文
      • BKQ_SYC:你这只是需要换渠道名和包名,要是还要换闪屏图你就JJ了
        沈同学:@frag 嗯在另一篇有写
        BKQ_SYC: @Aimerd 写python脚本
        沈同学:@frag 你的方法是?
      • 捡淑:mark
      • 9153360c477d:91和360前面加下划线就可以了
        捡淑:@xforgchen 正解 :+1:
        xforgchen:@Aimerd 一般语言变量命名都不允许数字开头的吧,举个例子,假如定义:

        String 360 = "我是字符串";

        那么输出这个变量或做字符串拼接的时候
        String test = "test"+360;

        那么System.out.println(360);应该输出什么呢?是“360”还是“我是字符串”?
        System.out.println(test); 应该输出什么呢?是“test360”还是“test我是字符串”?

        这样就会有歧义的吧,所以变量都不允许数字开头的
        沈同学:@KermitAndy 我是这样做的,就是不明白为什么360用string格式不可以
      • Domon_Lee:这个还是偏向于简单的,效率并不是很高。
        建议可以考虑看看我写的这个文章,通过zip格式,来解决打渠道包的问题。
        我之前每次发版本要打30多个,非常耗时,使用新的方式1分钟100个是毫无压力的。
        骑小猪看流星:层主,你写的感觉怪怪的。。。
        Domon_Lee:@Aimerd :grin: 共同学习,互相进步
        沈同学:@Domon_Lee 嗯嗯这种是慢,你说的方法知道原理,但还没有实践过,谢谢你的建议:smile:
      • sunyy123:非常感谢😊
        沈同学:@sunyy123 相互学习
      • faa868a467ca:支持一下海哥 :yum:
        沈同学:@Alisa_Fly_Outsi 谢谢啦:kissing_heart::kissing_heart:
      • 小彤花园:我们21个平台 :smirk:
        小彤花园:@____PPS 哦
        ____PPS:@小彤花园 呵呵。我们150几家医院
        沈同学:@小彤花园 你们也多渠道打包吗

      本文标题:Android多渠道打包没你想的那么复杂

      本文链接:https://www.haomeiwen.com/subject/xthndttx.html