Android Studio多渠道打包,简单详细

5,396

刚刚看了掘金一篇多渠道打包,各种依赖。貌似复杂了,本人csdn上很久的一遍文章和大家分享

个人理解:

  • 需求1:当android app需要上架多个平台时,需要记录平台渠道,用于数据统计。(曾经公司有12个渠道,一个个打包绝对把你累坏。配置好后,一键生成,你只需要傻傻等着。和UI小姐姐聊聊天)
  • 需求2:同理当你有很多测试环境,当然可以通过这种方式

接下来进入主题,让你享受非一般的感觉;这个方式针对as 3.0以上,如果有人还在用3.0以下的as,打包方式不同,欢迎留言!

步骤 1:

首先,来到你的AndroidMainfest.xml文件下

<meta-data
    android:name="ATMAN_CHANNEL"
    android:value="${ATMAN_CHANNEL_VALUE}" />

这里的ATMAN_CHANNEL 和ATMAN_CHANNEL_VALUE 都是自己自己自定义的。用于在代码里获取你需要的那些渠道号。

步骤 2:

其次来到你的App下build.gradle的android根标签下加上你要的渠道号;这里我就打开了2个渠道:brain,uc;按你自己的需要,我这里是展示

flavorDimensions "mark" //相当于一个标记
    productFlavors {
        brain { dimension "mark" }
        uc { dimension "mark" }
//        yingyongbao { dimension "mark" }
//        xiaomi { dimension "mark" }
//        "360m" { dimension "mark" }
//        oppo { dimension "mark" }
//
//        huawei { dimension "mark" }
//        meizu { dimension "mark" }
//        vivo { dimension "mark" }
//        sougou { dimension "mark" }
//        lianxiang { dimension "mark" }
//        zongbao { dimension "mark" }

    }

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

好了你已经完成了所有配置,你敢信。

接下来就是打包了,为了apk包名清晰,咱们把打出来的包名规范下,在上面配置多渠道的地方加上

 //自定义打包时apk名字
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            // abc_渠道名_版本名.apk  还可以拼接其他app内容:variant.versionCode  variant.buildType.name
            outputFileName = "GreenVolley_${variant.name}_${variant.versionName}_${new Date().format("yyyy-MM-dd")}.apk"
        }
    }

看到这里你也知道,出来的包名是什么了。

来开心的打包吧:

在你Android Studio 右上角有个Gradle的按钮,点击打开:

打开后,接下来的操作步骤是;点击你的项目名,然后点击app,再点击build,最后打开如下图:

这里罗列了一系列;

  • 1、我当前选中的 assembleRelease  意思就是打包线上版,假如你多渠道号设置了几个,这里点击这个建,就会一键打多少个渠道包;
  • 2、当然你往下看还有个 assembleUc ,点击这个按钮,意思就打UC渠道这一个线上包

接下来举个例子,如果是要数据统计这些渠道号,肯定是要获取这些渠道号的值,你只需要这样:

//测试多渠道打包
ApplicationInfo appInfo = null;
try {
    appInfo = App.getContext().getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
String app_version = appInfo.metaData.getString("ATMAN_CHANNEL");
LogUtils.i("我试试看吧当前是什么", app_version + "=========");

以uc包为例子,输出的结果是:

其实教程早已经结束,这只是验证一下。如果是区分环境,你大可这样做,uc标签下是一个环境,当渠道号获取为uc的时候,你在代码里再取这个环境的域名。(如果对你有帮助,请点个赞鼓励下技术小学生吧)