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

news2024/11/16 23:35:12

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

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

结论

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

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // 返回值为安装相关的信息
    // mInitiatingPackageName
    // mInitiatingPackageSigningInfo
    // mOriginatingPackageName
    // mInstallingPackageName
    // mUpdateOwnerPackageName
    // mPackageSource
	packageManager.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.coloradmin.cn/o/1507066.html

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

相关文章

基于VSCode安装Node.js开发环境

根据官网介绍,Node.js 是一个免费的、开源的、跨平台的JavaScript实时运行环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本. Node.js框架由于是采用JavaScript语法进行调用的,因此Node.js环境除了用来编写调试Node.js代码&#…

2024 年排名前 5 名的 Mac 数据恢复软件分享

如果您已经在 Mac 上丢失了数据并且正在寻找恢复数据的方法,那么您来对地方了。互联网上有超过 50 个适用于 Mac 的数据恢复程序。哪个是最好的 Mac 数据恢复软件?不用担心。本文列出了 5 款 Mac 数据恢复软件,可帮助您在 Mac OS 下恢复丢失的…

jvm八股

文章目录 运行时数据区域Java堆对象创建对象的内存布局对象的访问定位句柄直接指针 GC判断对象是否已死引用计数算法可达性分析算法 引用的类别垃圾收集算法分代收集理论标记清除算法标记复制算法标记整理算法 实现细节并发的可达性分析 垃圾收集器serial收集器ParNew收集器Par…

手机短信恢复 - 如何在 Android 手机上恢复删除的短信

手机每天发送和接收的短信数以亿计,而Android消息丢失每天都在发生。 Android短信恢复对于那些在设备中保存了一些重要信息的人来说显得至关重要。首先,我们向您推荐奇客数据恢复安卓版,这款软件能够高效、安全地恢复已删除的短信&#xff0…

结构指针的使用

结构指针的使用 指针类型变量: 指针类型,是变量类型的一种,它是专门用来存储变量的地址的。 例如 int *p; 表示p是一个指针变量,它用来存储某个整型变量的地址。 int a5; int *p&a; 这样,就将整型变量a的地…

有什么针对新闻媒体行业的安全解决方案

对媒体行业而言,门户网站是最易受到攻击的地方。常见的攻击方式有网页篡改、挂马和被植入暗链等。门户网站作为新闻媒体对外的第一扇门,通常承载了大量的流量,一旦遭到攻击,造成的影响会更具有可怕的“传播力”。那么我们应该如何…

Tree Shaking:优化前端项目的利器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

1、功能安全入门之内功心法ISO26262介绍

目录 0. 对于安全规范的认知 0.1 ISO26262简介 0.2 功能安全的必要性 2. ISO26262第1部分基本术语 2. ISO26262第2部分-功能安全管理 3. ISO26262第3部分-概念阶段 4. ISO26262第4部分-产品开发:系统层面 5. ISO26262第5部分-产品开发:硬件层面 6. ISO26262第6部分-…

使用VBA快速梳理多层级族谱(组织架构)

实例需求:族谱(或者公司组织架构等)都是典型的带有层级关系数据,例如下图中左侧表格所示。 A列为层级(准确的讲是B列成员的层级),从一开始递增B列和C列为成员直接的父(/母&#xff…

搭建一款实用的个人IT工具箱——it-tools

一、it-tools介绍 IT-Tools是一款开源的个人工具箱,专为IT从业人员打造,支持Docker私有化部署,包含众多实用的IT工具。其功能丰富多样,涵盖二维码生成、数据格式转换、MAC地址生成等,可满足用户多样化的需求。 二、本…

armv8/armv9 MMU深度学习

目录 1、MMU概念介绍2、虚拟地址空间和物理地址空间2.1、(虚拟/物理)地址空间的范围2.2、物理地址空间有效位(范围)2.2.1、页表翻译相关寄存器的配置 3、Translation regimes4、地址翻译/几级页表?4.1、思考:页表到底有几级?4.2、以4KB granu…

《日期类》的模拟实现

目录 前言: 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果: 前言: 我们在前面的两章初步学习认识了《类与对象》的概念,接下来我们将实现一个日期类,是我们的知识储备更加牢固。 头文件…

Android Gradle 开发与应用 (五) : 基于Gradle 8.2,创建Gradle插件

1. 前言 本文介绍在Android中,如何基于Gradle 8.2,创建Gradle插件。 1.1 本文环境 Android Studio 版本 : Android Studio Hedgehog | 2023.1.1Gralde版本 : gradle 8.2 使用 Android Gradle 插件升级助理 Android Gradle 插件版本说明 1.2 为什么要写…

【C语言】——详解操作符(下)

【C语言】——详解操作符(下) 前言七、关系操作符八、逻辑操作符8.1、& 与运算符8.2、 | 或运算符 九、条件操作符十、逗号表达式十一、下标引用与函数调用操作符11.1、[ ] 下标引用操作符11.2、( ) 函数调用操作符 十二、 结构成员操作符12.1、…

转移表回调函数实现

回调函数实现 计算器的模拟(函数指针数组的使用)(回调函数) 简化 冗余 老的代码的问题就是 冗余 写死 不能完成不同的任务 函数调用的时候只需要知道地址就可以 calc计算器 这里也称之为转移表 #define _CRT_SECURE_NO_WAR…

朴素贝叶斯 | 多分类问题

目录 一. 贝叶斯公式的推导二. 朴素贝叶斯1. 离散的朴素贝叶斯朴素贝叶斯导入示例 离散的朴素贝叶斯训练 2. 连续的朴素贝叶斯3. 伯努利朴素贝叶斯4. 多项式朴素贝叶斯4.1 Laplace平滑4.2 Lidstone平滑 三. 概率图模型1. 贝叶斯网络(Bayesian Network)1.1 全连接贝叶斯网络1.2 …

【Redis系列】深入了解 Redis:一种高性能的内存数据库

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

分布式搜索elasticsearch

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案…

25 使用块的网络 VGG【李沐动手学深度学习v2课程笔记】

目录 1. VGG块 2. VGG网络 3. 训练模型 4. 小结 虽然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似,神经网络架构的设计也逐渐变得…

【Linux】文件系统扩展——软硬链接

目录 对文件建立软硬链接 软链接 硬链接 对文件建立软硬链接 对 log 文件建立软链接: ln -s log log.soft.link 对 test 文件建立硬链接: ln test test.hard.link log.soft.link 和 test.hard.link 在 Linux 中都只是文件名,为了方便…