x***@gmail.com
x***@gmail.com
  • 发布:2026-06-08 14:58
  • 更新:2026-06-08 14:59
  • 阅读:52

【报Bug】传统云打包 Geolocation模块未将ACCESS_FINE_LOCATION写入APK manifest,定位权限失效

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: windows 10

HBuilderX类型: 正式

HBuilderX版本号: 5.03

手机系统: Android

手机系统版本号: Android 15

手机厂商: 小米

手机机型: 小米 12s

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

1.manifest.json 配置如下(已简化):
{
"app-plus": {
"modules": {
"Geolocation": {}
},
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>"
],
"autoSdkPermissions": true,
"targetSdkVersion": 29
},
"sdkConfigs": {
"geolocation": {
"system": {
"platform": ["ios", "android"]
}
}
}
}
}
}

2.HBuilderX 可视化界面中 App模块配置 → Geolocation(定位) → 系统定位 → iOS ✅ Android ✅ 均已勾选
3.使用云打包 → 传统打包(非安心打包)→ 打自定义调试基座
4.安装 APK 后执行:adb shell pm dump <包名> | grep "FINE_LOCATION|COARSE_LOCATION"

预期结果:

应输出 android.permission.ACCESS_FINE_LOCATION 和 android.permission.ACCESS_COARSE_LOCATION

实际结果:

无任何输出(权限未写入)
$ adb shell pm dump uni.UNIA0B9D38 | grep -i "location|fine|coarse"
→ android.permission.ACCESS_BACKGROUND_LOCATION (有)
→ android.permission.ACCESS_FINE_LOCATION (无)
→ android.permission.ACCESS_COARSE_LOCATION (无)

bug描述:

在 manifest.json 中正确配置了 Geolocation 模块(系统定位,iOS+Android),并在 distribute.android.permissions 中显式声明了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,同时设置了 autoSdkPermissions: true。使用云打包传统打包后,打出的 APK 中 AndroidManifest.xml 没有这两个权限,导致:

手机设置里该应用权限页无「位置」选项
plus.android.requestPermissions 调用后在 ~150ms 内瞬间返回 deniedAlways,系统授权框从未弹出
uni.getLocation 直接报错,错误码 22(权限拒绝)
奇怪的是:打出的 APK 的 pm dump 里 requested permissions 包含 ACCESS_BACKGROUND_LOCATION,但不包含 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION。

对比:同一开发者账号下另一个项目(UNI8754FD6),manifest.json 配置完全相同(Geolocation + system + iOS/Android),打包后 APK 中有 ACCESS_FINE_LOCATION,定位授权弹窗正常。

2026-06-08 14:58 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,我们来评审一下这个 bug 反馈。

一、 反馈内容完整性评审

这份反馈的质量非常高,可以说是教科书级别的 bug 反馈,要点明确,信息详实。

  • BUG 标题:清晰准确,“传统云打包 Geolocation模块未将ACCESS_FINE_LOCATION写入APK manifest,定位权限失效” 一句话概括了问题核心:打包方式、涉及模块、根本原因和最终现象。
  • BUG 描述:非常详尽。不仅描述了现象(权限页无选项、requestPermissions 秒拒、getLocation 报错),还提供了关键的排查证据(pm dump 结果有 BACKGROUND_LOCATIONFINE/COARSE_LOCATION),并给出了一个正常项目的对比案例,极大地缩小了问题排查范围。这对于开发人员定位问题至关重要,无需二次沟通。
  • 代码示例:提供了 manifest.json 的关键配置片段,简洁明了,直指问题核心配置,是完全可以直接用于验证的。
  • 复现步骤:步骤清晰且可操作。从配置 manifest.json 到选择打包方式,再到使用 adb 命令验证结果,形成闭环。任何官方人员都可以根据这些步骤准确地复现问题。
  • 预期结果:合理且正确。ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 是 Android 定位功能的基础权限,在配置了 Geolocation 模块和显式声明后,理应出现在最终的 AndroidManifest.xml 中。
  • 实际结果:描述客观,通过 adb 命令的输出结果作为证据,有力地证明了问题所在,这是一个不符合预期的、不正常的结果。
  • 分类信息:非常完整。提供了 PC 环境、HBuilderX 版本(5.03 正式版)、手机 OS 平台与版本(Android 15)、Vue 版本、手机厂商与型号,这些都是排查兼容性问题的关键信息。

结论:该反馈内容完整,无需补充任何信息,官方人员可以直接着手处理。

二、 问题是否成立

该 Bug 成立,且是一个在特定版本下已知的、由配置结构引起的问题。

根据知识库中的信息,此问题的根源在于 manifest.json 中权限配置的节点位置不符合 HBuilderX 5.03 版本的要求。

  1. 配置结构变更:从 HBuilderX 4.71 版本开始,Android 平台的额外权限配置节点从 app -> distribute -> android -> permissions 变更到了 app-android -> distribute -> permissions
  2. 用户配置分析:用户在反馈中提供的配置仍然使用的是旧版结构:
    "app-plus": {  
      "distribute": {  
        "android": {  
          "permissions": ["<uses-permission ... />"]  
        }  
      }  
    }  

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
    这个结构在 HBuilderX 5.03 版本中已经失效,导致云打包服务无法正确解析该节点下的权限声明,因此打包后的 APK 中缺失了 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限。而 ACCESS_BACKGROUND_LOCATION 之所以存在,可能是因为系统或其他模块自动添加的。

  3. 知识库依据:在优先知识库 “提交到云端打包报错 appid: unif82eb56” 和 “uniapp云平台打包,出现这种问题,说是Hbuilder版本的问题?” 这两个条目中,都明确指出了新的配置格式和旧格式导致报错的案例,这与您遇到的问题本质相同。
  4. 社区佐证:ask 社区知识库中的 “下面是我的manifest配置文件 打包后 应用没有位置权限 但是我已经添加了定位模块和对应的位置权限” 也反映了高度相似的问题和配置,进一步佐证了这是一个因版本升级带来的常见配置问题。

三、 是否为基本概念问题

这并非一个基本的编程概念问题,而是由于 DCloud 平台(HBuilderX)在特定版本中修改了专有的配置规范(manifest.json 的结构)所导致的。用户按照旧版规范进行配置,在新版工具中不再生效。

解决方案

您需要将 manifest.json 源码视图中 app-plus 节点下的 android.permissions 配置,移动到 app-android 节点下。请按照以下格式修改:

  1. 在 HBuilderX 中打开 manifest.json源码视图
  2. 找到 "app-plus" -> "distribute" -> "android" -> "permissions" 节点,将其删除或注释掉。
  3. manifest.json 根节点下,找到或新增 "app-android" 节点,并在此节点内添加 "distribute" -> "permissions" 配置。

修改后的代码示例如下:

{  
  // ... 其他配置 ...  
  "app-plus": {  
    "modules": {  
      "Geolocation": {}  
    },  
    "distribute": {  
      "android": {  
        // "permissions": [  // <-- 删除或注释掉这里的旧配置  
        //   "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",  
        //   "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>"  
        // ],  
        "autoSdkPermissions": true,  
        "targetSdkVersion": 29  
      },  
      "sdkConfigs": {  
        "geolocation": {  
          "system": {  
            "__platform__": ["ios", "android"]  
          }  
        }  
      }  
    }  
  },  
  // 新增 app-android 节点进行配置  
  "app-android": {  
    "distribute": {  
      "permissions": [  
        "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",  
        "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>"  
      ]  
    }  
  }  
  // ... 其他配置 ...  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

修改配置后,重新进行云打包,问题即可解决。

内容为 AI 生成,仅供参考

要回复问题请先登录注册