V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moefishtang
V2EX  ›  Android

华为应用市场是如何在不给读取应用列表权限的情况下,获取到要更新的应用的?

  •  
  •   moefishtang · 3 天前 · 2126 次点击

    测试设备:Redmi K80 HyperOS2.0.107.0 如图,我已经禁用了读取已安装列表权限(首次安装时就没给) 进入华为应用市场的更新页面也提示我开启已安装应用权限 可是进入应用更新页面,华为应用市场仍然能检测到我需要更新的应用和应用版本 Android 系统中有除了通过 QUERY_ALL_PACKAGES 以外的获取已安装应用列表的方式嘛? 也不是系统应用,华为应用市场我自己安装的,再说小米设备上怎么可能预装华为的应用市场

    第 1 条附言  ·  1 天前
    谢谢各的回复,学到了不少 Android 中读取 AppList 的奇技淫巧
    例如 AndroidAppList
    QueryAllPackage 、使用情况统计、IntentFilter 、启动器、PackageManager 等
    至于 1 楼提到的 PackageManager ,我测试在 Android15 下若禁用了读取应用列表权限,能获取到的 AppList 只有应用本身。Deepseek 显然没有审题。我对 PackageManager 理解也有误(我以为这是系统级应用才能调用的)
    @dant 提到的 intent filter 和
    @yuhaofe queryIntentActivities 都没有受权限限制,可以正常获取 AppList
    @yuhaofe 还提到了通过启动器权限也可以获取到 AppList ,我测试了下,更有意思的是即使 app 并没有设置成默认启动器也可以获取到 AppList ,也就是说任何一个想绕过系统限制读取应用列表的应用都有办法绕过限制
    另外我自己知道的还有通过使用情况统计和设备管理员权限,这些都是需要用户额外授权的权限,因此这里就不作额外测试了
    我编写了一个例程用于测试这些渠道,https://github.com/Steve5wutongyu6/TestAppList/releases/tag/1.0
    感觉学到不少,长见识了
    15 条回复    2025-04-04 19:35:50 +08:00
    Ackvincent
        1
    Ackvincent  
       3 天前
    Deepseek 给出的答案:华为应用市场主要依赖系统级 API (如 PackageManager 、ApplicationInfo 等)获取已安装应用的信息,而无需申请「读取应用列表权限」。
    Ackvincent
        2
    Ackvincent  
       3 天前
    使用 PackageManager 的 getPackageInfo 或 getApplicationInfo 方法查询特定应用的信息(如包名、版本号等),无论 Android 版本如何,均不需要申请「读取应用列表权限」。
    moefishtang
        3
    moefishtang  
    OP
       3 天前
    @Ackvincent #1 在搭载 EMUI 或者 HarmonyOS 的设备可以,小米或者其他厂商的系统中会允许第三方应用商城调用系统级 API ?
    moefishtang
        4
    moefishtang  
    OP
       3 天前
    @Ackvincent #1 Deepseek 我也问了,其实使用情况访问也可以获取到,但是我也没给这个权限

    另外 V2EX 不允许贴 AI 回复的
    moefishtang
        5
    moefishtang  
    OP
       3 天前
    @Ackvincent #2 Android11 以上必须声明 QUERY_ALL_PACKAGES 来获取完整应用列表的,否则只能看到自身
    典型如酷安 app ,若不授予 QUERY_ALL_PACKAGES ,应用清单中就只有酷安
    ysc3839
        6
    ysc3839  
       3 天前 via Android
    target api 不是 11 ?
    ysc3839
        7
    ysc3839  
       3 天前 via Android   ❤️ 1
    我自己下载了确认了一下,target api 是 11 ,有申请 QUERY_ALL_PACKAGES 权限,MIUI 里禁止读取应用列表,还是能读取到。
    dant
        8
    dant  
       3 天前   ❤️ 4
    可以通过 intent filter 只查询具有桌面图标的应用,不受 QUERY_ALL_PACKAGES 权限限制: https://stackoverflow.com/questions/79527331
    yuhaofe
        9
    yuhaofe  
       3 天前   ❤️ 1
    估计是只限制了 getInstalledPackages ,没限制 queryIntentActivities

    yuhaofe
        10
    yuhaofe  
       3 天前   ❤️ 1
    这个权限禁止挺幽默的,随便下了个第三方启动器,禁了应用列表权限,还是能正常显示所有 App ,想获取列表的 App 肯定会把所有能调的接口全调一遍,只限制一个没有任何意义……
    bclerdx
        11
    bclerdx  
       2 天前
    @yuhaofe 所以骚操作太多,转走歪门邪道,旁门左道。
    xqzr
        12
    xqzr  
       2 天前
    @Livid #1 AI
    hidev
        13
    hidev  
       2 天前   ❤️ 2
    刚好 HackerNews 上最近挺火的一篇文章就在吐槽这个问题:

    文章链接: https://peabee.substack.com/p/everyone-knows-what-apps-you-use
    moefishtang
        14
    moefishtang  
    OP
       2 天前
    @hidev 其实还有一个方法,应用间通过内嵌的 SDK 发现彼此
    例如我在美团中使用微信支付订外卖,虽然没有给美团应用列表读取权限,仍然可以唤起微信进行支付
    理论上应用商城可以做到让上架的 app 都内嵌统计 SDK ,通过 SDK 的方式实现读取安装列表和检测应用更新
    lisongeee
        15
    lisongeee  
       2 天前   ❤️ 2
    刚刚测了一下,packageManager.getPackageInfo(appId, 0) 拒绝权限没用,仍然可以获取到信息

    也就是只需要有一个 appId list 就行了,queryIntentActivities 和 getInstalledPackages 都可以得到这个列表

    前者我自己设备测试返回数量为 73 ,后者为 370 ,多出来的 300 其实都是没有桌面图标的系统应用,完全不影响
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:11 · PVG 07:11 · LAX 16:11 · JFK 19:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.