信息学奥赛常见坑点复盘:以‘分数线划定’为例,聊聊多关键字排序的那些细节
2026/6/10 14:54:52
| 信息 | 是否可获取 | 说明 |
|---|---|---|
| 包名(packageName) | ✅ | 核心标识 |
| 版本号 / versionCode | ✅ | versionName / longVersionCode |
| 应用名 | ✅ | label |
| 安装时间 / 更新时间 | ✅ | firstInstallTime |
| APK 路径 | ⚠️ | Android 10+ 受限 |
| 签名信息 | ⚠️ | Android 9+ 需新 API |
| UID | ✅ | 系统分配 |
| 是否系统应用 | ✅ | flag |
| 行为 | 说明 |
|---|---|
| 获取「所有已安装应用列表」 | Android 11+ 默认禁止 |
| 扫描竞品 / 上报 | Play 风控高危 |
| 读取 APK 文件内容 | Scoped Storage 限制 |
| 版本 | 变化 |
|---|---|
| Android 8- | 几乎无限制 |
| Android 9 | 签名 API 变化 |
| Android 10 | APK 路径受限 |
| Android 11+ | 包可见性(Package Visibility)机制 |
👉你“看得见”的 App,才能获取 APK 信息
<manifest ...> <queries> <!-- 指定包名 --> <package android:name="com.tencent.mm" /> <!-- 指定 Intent --> <intent> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent> </queries> </manifest>📌 特点:
白名单机制
审核重点检查
数量不宜多
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>🚨Google Play 强监管权限
非文件管理 / 设备管理 / 安全类应用100%拒审
必须在 Play Console 写强理由
PackageManager pm = context.getPackageManager(); try { PackageInfo info = pm.getPackageInfo( "com.tencent.mm", PackageManager.GET_SIGNING_CERTIFICATES ); String packageName = info.packageName; String versionName = info.versionName; long versionCode = info.getLongVersionCode(); long installTime = info.firstInstallTime; long updateTime = info.lastUpdateTime; String apkPath = info.applicationInfo.sourceDir; } catch (PackageManager.NameNotFoundException e) { // 未安装 }ApplicationInfo ai = pm.getApplicationInfo("com.tencent.mm", 0); String appName = pm.getApplicationLabel(ai).toString(); Drawable icon = pm.getApplicationIcon(ai);PackageInfo info = pm.getPackageInfo( "com.tencent.mm", PackageManager.GET_SIGNING_CERTIFICATES ); SigningInfo signingInfo = info.signingInfo; Signature[] signatures = signingInfo.hasMultipleSigners() ? signingInfo.getApkContentsSigners() : signingInfo.getSigningCertificateHistory();List<PackageInfo> list = pm.getInstalledPackages(PackageManager.GET_META_DATA);⚠️ Android 11+ 只能拿到:
自己
<queries>声明的
系统允许的
PackageInfo info = pm.getPackageArchiveInfo( "/sdcard/test.apk", PackageManager.GET_ACTIVITIES ); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; appInfo.sourceDir = appInfo.publicSourceDir = "/sdcard/test.apk"; String pkg = info.packageName; }📌 适合:
文件管理器
APK 安装前检测
静默扫描已安装 App
上报完整 App 列表
未声明用途调用 QUERY_ALL_PACKAGES
只查业务必要 App
白名单 + queries
明示用途(跳转 / 兼容性)
| 需求 | 推荐 |
|---|---|
| 判断是否安装微信 | 指定包名查询 |
| App 跳转 | PackageManager + Intent |
| 设备风控 | 行为 + 网络 |
| APK 检测 | 本地解析 APK |
| 竞品分析 | ❌ 不合规 |
Android 可以获取第三方 APK 信息,但:
Android 11+你看不见 = 拿不到
QUERY_ALL_PACKAGES= 审核高压线白名单 + 单包查询才是正道