技术经验谈 技术经验谈
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hss01248

一号线程序员
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 最佳实践

    • Android数据库操作最佳实践
    • 基于蒲公英平台的app发布,更新,反馈功能的实现
    • testRss
  • ui

  • 优化

  • aop

  • apm

  • 架构

  • webview

  • rxjava

  • activity-fragment-view的回调和日志
  • Android加密相关
  • Android命令行操作
  • app后台任务
  • kotlin
  • kotlin漫谈
  • kotlin语言导论
  • sentry上传mapping.txt文件
  • so放于远程动态加载方案
  • states
  • Xposed模块开发
  • 一个关于manifest合并的猥琐操作
  • 玩坏android存储
  • 获取本app的安装来源信息
  • Android
hss01248
2021-03-25

获取本app的安装来源信息

# 获取本app的下载/安装来源

# apk包从哪里下载的?

只能通过预置渠道名到apk文件内部,安装后打开app时读取对应的字节而实现.

比如渠道名的位置 内嵌huawei字符串的包发到华为市场,内嵌xiaomi字符串的发到小米市场.

但是

如果这个apk被其他市场爬取,就识别错误了. 比如小米渠道的包被xx市场爬到,那么安装后打开,还是被识别成小米市场的渠道包.

# apk被谁安装的?

packageManager.getInstallerPackageName(DeviceReporter.app.getPackageName());

或者使用: 

try {
   installSourceInfo =  packageManager.getInstallSourceInfo(DeviceReporter.app.getPackageName());
    //packageManager.getPackageInstaller().
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
1
2
3
4
5
6
7
8
9
10

其中,installSourceInfo包含两方面信息:

安装是被谁发起的

安装是被哪个apk安装器执行的

public final class InstallSourceInfo implements Parcelable {

  
  //安装是被谁发起的: The name of the package that requested the installation, or null if not available.
    @Nullable private final String mInitiatingPackageName;

    @Nullable private final SigningInfo mInitiatingPackageSigningInfo;
/**
     * The name of the package on behalf of which the initiating package requested the installation,
     * or null if not available.
     * <p>
     * For example if a downloaded APK is installed via the Package Installer this could be the
     * app that performed the download. This value is provided by the initiating package and not
     * verified by the framework.
     * <p>
     * Note that the {@code InstallSourceInfo} returned by
     * {@link PackageManager#getInstallSourceInfo(String)} will not have this information
     * available unless the calling application holds the INSTALL_PACKAGES permission.
     */
    @Nullable private final String mOriginatingPackageName;

    @Nullable private final String mInstallingPackageName;//安装是被哪个apk安装器执行的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

用intent发起一次apk安装时,如果不指定安装器的包名,那么会弹出系统所有的安装器供用户选择

如果指定安装器的包名,那么就直接调用指定安装器执行安装.

一般对于应用市场来说,肯定是指定自己来执行安装.

Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName("com.example.jay.test",     
"com.example.jay.test.MainActivity");     
install.setComponent(cn);     
File apkFile = new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk";
install.setDataAndType(Uri.fromFile(apkFile)), "application/vnd.android.package-archive");
startActivity(install)
  //注意7.0 uri expose兼容,8.0 apk安装权限申请
1
2
3
4
5
6
7
8
9

一般app都发布到指定的几个市场,我们知道这几个市场的包名. 一个app安装后,它的安装信息应该也是在这几个市场包名内.

如果是被其他xx市场爬取,那么用户在那个xx市场下载,安装,

那么一般来说, apk的安装发起,安装执行的信息,都是那个xx市场.

编辑 (opens new window)
上次更新: 2022/08/25, 20:20:31
玩坏android存储

← 玩坏android存储

最近更新
01
截图后的自动压缩工具
12-27
02
图片视频文件根据exif批量重命名
12-27
03
chatgpt图片识别描述功能
02-20
更多文章>
Theme by Vdoing | Copyright © 2020-2025 | 粤ICP备20041795号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式