热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android进阶之路多渠道分包、打包

现在的android有着广泛的应用市场,相对应的渠道也可以说是多种多样,为了方便app更好的推广,运营同学就需要我们支持下数据采集

现在的android有着广泛的应用市场,相对应的渠道也可以说是多种多样,为了方便app更好的推广,运营同学就需要我们支持下数据采集,才能制定后续流程~
题外话:其实渠道统计不仅仅局限于应用市场,在现实生活中我们可以把每一种推广方式也看做是一个渠道,比如:通过人拉人的方式去推广,官网上推广,百度推广等。


随着渠道越来越多,为了运营更好的推广,有时候一次也会打成百的安装包,有的打包方式可能会造成半天或者一天啥也干不了,当然也有分分钟完成打包的方式…

关联篇


  • Android进阶之路 - 多渠道分包、打包
  • Android进阶之路 - 美团多渠道分包、打包

使用美团多渠道打包方式,10秒轻松打完上百渠道安装包


      • 基础认知
      • 前情提要
      • 渠道配置
      • 渠道打包
      • 打包区别
        • 原始、友盟多渠道打包
        • 美团多渠道打包
        • 关于项目实战的一些经验
      • 渠道信息

小伙,每天进步一点点,后面会发现迈了一大步,不知不觉都过去快3年咯 ~


基础认知

什么是多渠道包?

渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等

如何声明一个渠道?它的本质实现是什么?

一般都是在 AndroidManifest通过meta-data标签声明渠道信息,很多时候涉及的多渠道信息会放在build.gradle中(如:通过原始方式进行多渠道分包、打包)

AndroidManifest 示例

<meta-dataandroid:name&#61;"CHANNEL_ID"android:value&#61;"android" />

多渠道是如何实现分渠道的&#xff1f;

一般多渠道有俩种实现方式


  • 动态替换meta-data中的value值&#xff1b;如将上方中value中的android替换为huawei

<meta-dataandroid:name&#61;"CHANNEL_ID"android:value&#61;"huawei" />

  • 没有在AndroidManifest中通过meta-data声明任何渠道信息&#xff0c;而是通过三方工具或三方平台打多渠道包时&#xff0c;整体插入meta-data内的渠道信息&#xff08;美团多渠道打包就是如此 &#xff09;

为什么要提供多渠道包&#xff1f;

我们要在安装包中添加不同的标识&#xff0c;应用在请求网络的时候携带渠道信息&#xff0c;方便后台做运营统计&#xff08;这就是添加渠道信息的用处&#xff09;


前情提要

如果想要观测不同渠道的应用数据&#xff0c;那么渠道分包是一个基础&#xff0c;其中主要涉及到俩部分


  • 分渠道包
    因为我分渠道的方式使用的是原始&#43;部分Umeng多渠道分包方式&#xff0c;所以有心人会发现部分Umeng渠道统计也会进行部分一样的配置

  • 打渠道包
    这里使用的打包方式是最原始的AndroidStudio自带的一种打包方式&#xff0c;虽然看起来方便&#xff0c;但是效率很低&#xff0c;往往在渠道多的情况下&#xff0c;你会发现2分钟能办完的事儿&#xff0c;往往消耗几十分钟或者几个小时 ~




渠道配置

这里采用的多渠道配置方式&#xff0c;其实早期是基于友盟方式做处理的

第一步&#xff1a;AndroidMainfest(清单文件)中的application内添加

<- 这里是方便Umeng的渠道统计&#xff0c;进行配置 UMENG_CHANNEL 不可改变不然无法识别 -><meta-dataandroid:name&#61;"UMENG_CHANNEL"android:value&#61;"${UMENG_CHANNEL_VALUE}" />

示例&#xff1a;


<manifest xmlns:android&#61;"http://schemas.android.com/apk/res/android"package&#61;"com.example.dow.loadingview"><applicationandroid:allowBackup&#61;"true"android:icon&#61;"&#64;mipmap/ic_launcher"android:label&#61;"&#64;string/app_name"android:supportsRtl&#61;"true"android:theme&#61;"&#64;style/Theme.AppCompat.Light.NoActionBar"><activity android:name&#61;".MainActivity"><intent-filter><action android:name&#61;"android.intent.action.MAIN" /><category android:name&#61;"android.intent.category.LAUNCHER" />intent-filter>activity><meta-dataandroid:name&#61;"UMENG_CHANNEL"android:value&#61;"${UMENG_CHANNEL_VALUE}" />application>manifest>

第二步&#xff1a; build(app)中&#xff0c;android标签添加渠道名

注意&#xff1a; 如果是数字开头是不行的&#xff01;需要添加下划线&#xff01;


  • 公共配置

//打包相关配置buildTypes {debug {
// 不用管- - shrinkResources true // 移除无用的resource文件minifyEnabled false //不启用混淆proguardFiles getDefaultProguardFile(&#39;proguard-android.txt&#39;), &#39;proguard-rules.pro&#39;,&#39;proguard-fresco.pro&#39;}release {
//不用管- - shrinkResources true // 移除无用的resource文件minifyEnabled false //不启用混淆proguardFiles getDefaultProguardFile(&#39;proguard-android.txt&#39;), &#39;proguard-rules.pro&#39;}}

主要有以下是俩种渠道配置方式


  • 方式一&#xff1a;uc的方式添加渠道

productFlavors{uc {manifestPlaceholders &#61; [UMENG_CHANNEL_VALUE: "uc"]}_360 {manifestPlaceholders &#61; [UMENG_CHANNEL_VALUE: "360"]}baidu{manifestPlaceholders &#61; [UMENG_CHANNEL_VALUE: "baidu"]}}

  • 方式二&#xff1a;productFlavors方式添加渠道

productFlavors{default_channel{}wandoujia{}yingyongbao{}xiaomi{}huawei{}jifeng{}}productFlavors.all { flavor ->flavor.manifestPlaceholders &#61; [ UMENG_CHANNEL_VALUE:name ]}



渠道打包


在此时&#xff0c;我们的渠道配置已经做完&#xff0c;可以进入打包阶段&#xff0c;但需注意你既然要打渠道包&#xff0c;必然是要上appStore的&#xff0c;这里就涉及到了一个签名的问题&#xff0c;你可以通过生成 keystore、jks 签名证书进行学习&#xff0c;不然你打出的也是没有签名的包&#xff0c;用户是无法安装的!


这里采用的打包工具是AndroidStudio内的Gradle打包方式&#xff0c;相比别的打包方式会慢挺多的

AndroidStudio内的Gradle打包

打包

最终结果&#xff1a;没签名的包状态

在app内部的apk文件夹下

最终结果&#xff1a;签名的包状态

在app外部&#xff0c;项目内部




打包区别

在我目前的从业经历中&#xff0c;对于多渠道打包方面的经验主要有渠道配置和俩种渠道打包的方式


原始、友盟多渠道打包

&#xff1a; 直接在清单文件中定义meta-data标签设置渠道值&#xff0c;读取对应值当做渠道id

&#xff1a;使用友盟方式分渠道&#xff0c;原始方式打包

一般来讲&#xff0c;这个渠道的标识会放在AndroidManifestApplication的一个meta-data中&#xff1b;然后就可以通过对用方法获取对应的渠道信息&#xff08;方法位于篇尾&#xff09;

&#xff1a;配置简单&#xff0c;使用方便
&#xff1a;渠道多的时候&#xff0c;效率较低


美团多渠道打包

AndroidManifest 配置基础包即可&#xff0c;无需 build.app 内进行任何配置&#xff0c;主要依赖Python写的工具

&#xff1a;配置之后&#xff0c;使用方便&#xff0c;效率很高
&#xff1a;三方工具&#xff0c;安全性方面可能需要稍微考虑下


关于项目实战的一些经验

我们现在打的签名包&#xff0c;大多都会进行加固&#xff0c;然后分渠道&#xff0c;涉及先后顺序


  1. 先根据签名包打出多渠道包&#xff0c;然后挨个进行加固
  2. 先加固签名包&#xff0c;然后打出多渠道包

明眼人一看&#xff0c;肯定选第二个&#xff0c;那么你是对的&#xff01;因为亲测之后&#xff0c;加固效果依旧在&#xff0c;同时渠道依旧可以正常识别 ~




渠道信息

以备不时之需 - 附赠一个小方法&#xff08;用于获取当前apk的渠道 - 网上找的&#xff0c;没有亲测 - -~&#xff09;

/*** 获取渠道名* &#64;param context 此处习惯性的设置为activity&#xff0c;实际上context就可以* &#64;return 如果没有获取成功&#xff0c;那么返回值为空*/public String getChannelName() {if (this.mContext &#61;&#61; null) {return null;}String channelName &#61; null;try {PackageManager packageManager &#61; this.mContext.getPackageManager();if (packageManager !&#61; null) {//注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中&#xff0c;而不是某activity标签中&#xff0c;所以用ApplicationInfoApplicationInfo applicationInfo &#61; packageManager.getApplicationInfo(this.mContext.getPackageName(), PackageManager.GET_META_DATA);if (applicationInfo !&#61; null) {if (applicationInfo.metaData !&#61; null) {channelName &#61; String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));}}}} catch (Exception e) {e.printStackTrace();}return channelName;}

推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 引号快捷键_首选项和设置——自定义快捷键
    3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
author-avatar
三心两意真实扭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有