Android 学习之追踪应用的安装情况

先上结论,急用的话直接看结论

  • 结论
    • 一、借助 API 读取安装信息,然后上报
    • 二、借助手动埋点,然后上报
    • 三、对比
  • 前提
  • 过程

结论

一、借助 API 读取安装信息,然后上报

通过 PackageManagerAPI,我们可以得知自身应用安装相关的信息(甚至特定条件下其他应用安装相关的信息也可以!!!),如哪个应用启动的安装请求,安装请求经过哪个应用执行的安装操作,正在安装的目标应用是哪个,是通过应用市场安装的还是下载安装的等等。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {// 返回值为安装相关的信息// mInitiatingPackageName// mInitiatingPackageSigningInfo// mOriginatingPackageName// mInstallingPackageName// mUpdateOwnerPackageName// mPackageSourcepackageManager.getInstallSourceInfo(packageName)
} else {// 返回值为唤起安装的应用包名packageManager.getInstallerPackageName(packageName)
}

二、借助手动埋点,然后上报

给不同的渠道包,设置同一个字段但是不同的值,应用启动后上报这个值,借此来标记不同的来源,如友盟UMENG_CHANNEL

三、对比

  1. 借助 API :
  • 可以知道包最终被谁安装,但是不知道最初分发的来源。可以相对准确的知道应用在各大市场的安装情况,不会因为其他推广方式而导致数据异常,比如某个博主向他的私域流量发送了他从市场 A 下载的应用。
  • 可以不用为每个渠道单独埋点
  • 可以明确知道哪些市场或者应用在帮助你推广你的应用
  1. 借助手动埋点:
  • 可以知道最初分发的来源,但是不知道最终被谁安装。相比 API 更加适用于只在意结果,不论过程的运营,比如给应用市场 B 的包,不管他是在市场上推广下载,还是说市场交给第三方进行代运营,只要最终达到推广效果。
  • 可以获取特定的运营手段带来的效果
  1. 如果用实体物品的销售来比喻,那么借助 API 就是可以清楚每个零售商的销售情况,借助手动埋点可以清楚每个经销商的销售情况。

前提

了解过移动端应用运营的同学,一定接触过 “渠道” 这个概念。
所谓的 “渠道” 简单的理解一下,从用户角度来说就是他获得我们应用包的 “方式” ,从运营方角度来说就是推广应用包的 “方式”

这个 “方式” 可以是通过应用市场推广,可以是通过应用内推广,也可以是用户之间的分享推广等。
推广
这个渠道是数量众多且方式多变的,放到应用上面来说,比如现在有个应用 A,你可以上架到各大应用市场,可以在应用 B 里面去引导用户下载应用 A,当然也可以在 QQ 群或者微信群里面发给网友使用。

既然渠道是数量众多且方式多变,那么我们如何去确保我们的推广渠道是有效的,甚至是高效的,第一想法应该就是看我们的应用通过哪种渠道被安装的数量,数量越大,说明推广效果越好,那我们就应该越重视这个渠道!

那么如何去追踪我们应用的安装情况就至关重要了,这里我们把情况简化,从技术的角度来看待和研究以下两个情况:

  • 用户从应用市场上安装我们应用的情况(API 和手动埋点)
  • 用户通过哪些手段安装我们应用的情况(API)

过程

秉承着不要重复造轮子,除非轮子不能满足你需求的原则,一直以来我都是借助第三方统计平台进行统计,使用最多的是 “友盟” 平台,使用简单就没有考虑其他的方案。每次有新应用要接入渠道统计的时候就接入友盟,简单的修改一下 Manifest 文件的 meta-data。然后上线后,后台就可以看到数据了,私以为统计平台都是通过这样的方案来统计渠道。

后来有一些应用,接入了其他的统计平台,一开始渠道统计的需求很低,也就没有注意是否支持此类信息的统计,直到有一天,需求的优先级高了,所以着手去看,发现它竟然是支持的,而且可以统计各个应用市场的实际安装情况,这就让人疑惑,自己没有写入特定信息,包也没有差异化处理,甚至一些市场都没有上架,是被市场自己爬取的,为什么统计平台可以区分呢!

仔细研究了后台给到的数据,可以看出,统计出的分类大多是包名,也有个别是单纯的英文单词,检索发现这些包名,一些是应用市场,一些是特定软件,而英文单词指的是网页和手动。相比于认为这是市场渠道的安装信息,更准确的说是不同手段的安装信息,市场只是其中的一种。

刚看到数据的时候,有两个想法:

  • 每个应用市场都接入了这个统计平台,市场给的数据
  • 安装包被市场写入了信息,统计平台读取了这个信息

但是很快就被自己否定了,毕竟有些异想天开,不切实际。最有力的证据就是分类信息当中不全是市场,还有特定软件,市场也不是铁板一块,非要安装这个统计平台。

后来灵光一闪,有没有可能是 Android 系统提供给统计平台的呢,毕竟应用最终都安装在了系统上,应用的情况系统应该是最清楚的才是,于是从系统提供的 API 入手,最终发现 PackageManager 竟然有 API 提供应用安装相关的来源信息。(推测是应用执行安装相关的流程时,系统在各环节记录下来的)

⚠️⚠️⚠️注意,提供的是应用安装相关的来源信息,而不是应用的来源信息,毕竟你这个应用的安装包是从哪里获得的,系统又怎么会知道呢,或许是朋友推荐给你的,或许是你从哪个论坛下载的,或许是应用市场上面下载的,系统无从得知,但是哪个程序唤起系统进行安装的,系统是一清二楚。就好像,你去驾校报名考驾照,报名费怎么来的,可能是你父母给的,也可能是你自己挣的,甚至是你捡到的,驾校不知道也不感兴趣,但是是谁来报名考试的,驾校就会接触到并且知道。
安装来源
那么根据谁唤起系统进行安装,就可以反过来推测包的来源,这个结论严格意义来说是不准确的,但是却很有参考价值,毕竟现在的应用分发交互流程,基本上都是下载后直接唤起安装,提高安装率,大多数的用户也不会闲的下载完,关闭唤起的安装程序,然后去文件夹里面找到这个程序,然后再点击安装!(不过也存在不直接安装的场景和可能性,所以说不准确,但是有参考价值


本文只是自己的一些拙见!具体的应用场景和优缺点还有很多,并非只有文中提到的几点,这里抛砖引玉,欢迎相互讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SSM】任务列表案例 基本CRUD SSM整合

文章目录 一、案例功能预览二、接口分析三、前端工程导入四、后端程序实现和测试4.1 准备4.2 功能实现4.2.1 分页查询显示4.2.2 添加计划4.2.2 删除计划4.2.3 修改计划 4.3 前后联调 一、案例功能预览 Github 地址 : ssm-integration-part 二、接口分析 学习计划…

【话题】2024年AI辅助研发趋势,有那些应用领域

大家好,我是全栈小5,欢迎阅读文章! 此篇是【话题达人】系列文章,这一次的话题是《2024年AI辅助研发趋势》 目录 背景概念实践医药领域汽车设计领域展望未来文章推荐 背景 随着人工智能技术的持续发展与突破,2024年AI辅…

BI数据分析案例详解:零售人货场分析该怎么做?

在当今快节奏、高竞争的商业环境中,人货场分析已成为企业成功的关键因素之一。科技的进步和数据的日益丰富使得企业对人流、货物流和场地布局的深入洞察变得愈发重要。通过科学的人货场分析,企业能更好地理解顾客行为、优化供应链、提高运营效率&#xf…

【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98

故障现象,MAME启动后,游戏都没有识别 添加日志输出,重新启动wine #!/bin/bashexport WINEPREFIX$(pwd)/.wine export WINESERVER$(pwd)/bin/wineserver export WINELOADER$(pwd)/bin/wine export WINEDEBUG"file,mame,warn,err"…

加速渲染:Blender与在线渲染农场的结合

​在数字艺术和三维设计的世界里,Blender软件因其强大的功能和灵活性而广受欢迎。然而,随着项目复杂性的增加,渲染时间也随之增长,成为艺术家和设计师面临的一大挑战。在线渲染农场的出现,为这一问题提供了革命性的解决…

C语言例:(m=a==b)||(n=a==b);求解m,n的值

题目&#xff1a;设int a0,b0,m0,n0;执行语句(mab)||(nab);求解m,n的值。 #include<stdio.h> int main(void) {int a0,b0,m0,n0;(mab)||(nab);printf("m%d\n",m);printf("n%d\n",n);return 0; } 优先级: () 优先 优先 a b -->为真&am…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

代码随想录算法训练营第二十三天 | 77. 组合

回溯 77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/ 文章讲解&#xff1a;https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ti4y1L7cv/ class Solution { private:vector<…

打卡学习kubernetes——了解五种控制器类型

目录 1 Deployment控制器 2 StatefulSet控制器 3 DaemonSet控制器 4 Job控制器 5 CronJob控制器 1 Deployment控制器 Deployment为Pod和Replica Set&#xff08;下一代Replication Controller&#xff09;提供声明式更新。 Deployment运行无状态应用&#xff0c;一般情况…

圈子社交系统-多人语音-交友-陪玩-活动报名-商城-二手论坛-源码交付,支持二开!

圈子小程序适用于多种场景&#xff0c;涵盖了各个领域的社交需求。以下是一些常见的适用场景&#xff1a; 兴趣社区&#xff1a; 用户可以加入自己感兴趣的圈子&#xff0c;与志同道合的人一起讨论交流&#xff0c;分享经验和知识。 行业交流&#xff1a; 各个行业可以建立自…

突发想法2:浏览器的缓存有什么作用?为什么有了缓存,一开始较快,缓存多了打开某些网站会变慢?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、问题二、解决1、为什么第一次打开时那么慢&#xff…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

由世界第一个AI软件工程师Devin引发的热潮背后----程序员到底会不会被代替?AI发展至如今是否初衷已变?

目录 一.Devin的登场是突破也是导火索 二.Devin的"逆天"能力 1、端到端构建和部署程序 2、自主查找并修复bug 3、训练和微调自己的AI模型 4、修复开源库 5、成熟的生产库也能做贡献 6、学习能力 三.Devin的出现甚至整个AI领域的进步,编程还有未来吗? 1.业…

接上一篇:分布式调用链追踪系统设计

所以必须得记录父子关系&#xff1a; A---->B 是 B---->C 的父调用 A---->D 是 D---->E 的父调用 A---->D 还是 D---->F 的父调用 如何记录呢&#xff1f;需要给每个调用分配一个ID (称为 SpanID)&#xff0c;并且把这个 ID 传递给子调用&#xff0c; 子…

c++ 常用函数 集锦 整理中

c 常用函数集锦 目录 1、string和wstring之间转换 1、string和wstring之间转换 std::string convertWStringToString(std::wstring wstr) {std::string str;if (!wstr.empty()){std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;str converter.to_b…

2024.3.14

成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream> using namespace std; class Number//定义一个数字类 {//因为a和b是私有成员&#xff0c;全局进行访问需要要friend进行声明friend const Number operator*(const Number &…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1&#xff1a;页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题&#xff1a; 考点2&#xff1a;段式存储存储管理 - 段式存储组织例题&#xff1a; 考点1&#xff1a;页式存储 存储管理 - 页式存储组织 页式存储&#xff1a;将程序…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

基于FPGA的HyperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用&#xff08;物联网、消费产品、汽车和工业应用等&#xff09;&#xff0c;涉及到外部存储&#xff0c;HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性&#xff1a; 1、超低功耗&#xff1a;200MHz工作频率下读写不到50mW…

[已解决]安装CUDA失败报错(附万能解决办法)

[已解决]安装CUDA失败报错(附万能解决办法) &#xff08;Tips&#xff1a;赶时间直接看万能法2&#xff09; 经过长时间的尝试和研究&#xff0c;我终于解决了安装CUDA失败报错的问题。在这里&#xff0c;我将记录下我遇到的问题以及解决办法&#xff0c;希望对其他小白们有所帮…