华为应用市场是如何在不给读取应用列表权限的情况下,获取到要更新的应用的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moefishtang
V2EX    Android

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

  •  
  •   moefishtang 242 天前 4794 次点击
    这是一个创建于 242 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言    240 天前
    谢谢各的回复,学到了不少 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  
       242 天前
    Deepseek 给出的答案:华为应用市场主要依赖系统级 API (如 PackageManager 、ApplicationInfo 等)获取已安装应用的信息,而无需申请「读取应用列表权限」。
    Ackvincent
        2
    Ackvincent  
       242 天前
    使用 PackageManager 的 getPackageInfo 或 getApplicationInfo 方法查询特定应用的信息(如包名、版本号等),无论 Android 版本如何,均不需要申请「读取应用列表权限」。
    moefishtang
        3
    moefishtang  
    OP
    242 天前
    @Ackvincent #1 在搭载 EMUI 或者 HarmonyOS 的设备可以,小米或者其他厂商的系统中会允许第三方应用商城调用系统级 API ?
    moefishtang
        4
    moefishtang  
    OP
       242 天前
    @Ackvincent #1 Deepseek 我也问了,其实使用情况访问也可以获取到,但是我也没给这个权限

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

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

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

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

    前者我自己设备测试返回数量为 73 ,后者为 370 ,多出来的 300 其实都是没有桌面图标的系统应用,完全不影响
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1103 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:56 PVG 01:56 LAX 09:56 JFK 12:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86