非框架类 GNSS 服务设计
-
普通应用
- 可见性由 AppOps(应用操作权限)与通知栏提供
- 控制权由设置与权限管理提供
-
使用 GNSS 定位的非框架服务该如何处理?
- 运营商定位服务:CP(核心网)、SUPL(安全用户面定位)、IMS(IP 多媒体子系统)
- 厂商 / 芯片级服务
- Linux 守护进程、低功耗芯片
- 任何不属于 Android 框架的服务

如通过通过attribution APK,让非框架类服务对用户可见且可控制

Android GMS Requirements
-
系统应遵循用户的定位设置与应用权限状态。
-
当定位数据被访问时,系统应在设备屏幕上显示通知。
-
上述要求必须适用于设备内的所有软件、硬件模块,包括应用、框架、原生守护进程、硬件或子微控制器系统。
-
仅在紧急呼叫场景下,可绕过用户的定位设置与权限状态。
联发科 GNSS 可见性控制解决方案
- 引入一款归因应用 "MTK Non-Framework LBS",用于承载联发科原生 GNSS 位置服务(LBS)守护进程。
- 代码仓库路径:alps/vendor/mediatek/proprietary/packages/apps/GnssVisibilityControl
- 包名:com.mediatek.gnss.nonframeworklbs
- 客户可根据自身需求自定义该应用。
- 若重命名联发科的此应用包,需同步更新 GPS 驱动代理包列表;否则,LBS 原生模块将无法访问 GNSS 定位信息。

联发科 GNSS 可见性控制框架

AOSP GNSS 可见性控制代理应用校验
联发科在 MTK 运营商配置插件中设置 NonFrameworkLBS 包名:
-
在
vendor/mediatek/proprietary/frameworks/opt/telephony-base/java/mediatek/telephony/MtkCarrierConfigManager.java中,配置运营商配置项KEY_NFW_PROXY_APPS_STRING// M: 设置GNSS可见性控制代理应用列表 sdefaults.putString(CarrierConfigManager.Gps.KEY_NFW_PROXY_APPS_STRING, "com.mediatek.gnss.nonframeworklbs"); -
AOSP 定位框架读取应用的定位权限,并同步至 GNSS 驱动:
- 涉及代码文件:
-
frameworks/base/services/core/java/com/android/server/location/GnssConfiguration.java -
frameworks/base/services/core/java/com/android/server/location/GnssVisibilityControl.java/** * 从配置参数NFW_PROXY的取值中返回代理应用列表 * 若未提供取值,则返回{@Collections.EMPTY_LIST} */ List<String> getProxyApps() { // 以空格分隔的Android代理应用包名列表 String proxyAppsStr = mProperties.getProperty(CONFIG_NFW_PR...); if (TextUtils.isEmpty(proxyAppsStr)) { return Collections.EMPTY_LIST; } String[] proxyAppsArray = proxyAppsStr.trim().split("\\s+"); if (proxyAppsArray.length == 0) { return Collections.EMPTY_LIST; } // ...(后续逻辑) } private String[] getLocationPermissionEnabledProxyApps() { // 统计已开启定位权限的代理应用数量,用于创建数组 int countLocationPermissionEnabledProxyApps = 0; for (ProxyAppState proxyAppState : mProxyAppsState.values()) { if (proxyAppState.hasLocationPermission) { ++countLocationPermissionEnabledProxyApps; } } // ...(后续逻辑) }
-
- 涉及代码文件:
GCF OMA SUPL 隐私覆盖
-
OMA SUPL 的隐私覆盖要求与 GMS 定位隐私政策存在冲突
- 该要求希望在不通知终端用户的情况下提供 NI 定位服务。
-
联发科 BSP(板级支持包)遵循 GMS 定位隐私政策
-
联发科提供了一个 AGPS 配置项,以支持 OMA SUPL 的隐私覆盖要求:
- 配置文件路径:
device/mediatek/vendor/common/agps/agps_profiles_conf2.xml - 配置项:
privacy_override_mode(隐私覆盖模式)- 值 0:默认值。隐私覆盖功能无法绕过 GNSS 可见性控制策略。
- 值 7 :当隐私覆盖的 NI 定位请求发起时,隐藏定位图标并绕过定位设置;同时支持非紧急呼叫场景下的紧急 SUPL INIT(SUPL 初始化)。
- 位 1:隐藏定位图标
- 位 2:针对隐私覆盖的 NI 请求,绕过定位设置
- 位 3:针对紧急 SUPL INIT,绕过定位设置
- 配置文件路径:
-
在 LocationEM2 测试工具中,提供了 "Privacy Override Enable(启用隐私覆盖)" 选项
- 实验室测试时,勾选该复选框,即可在 AGPS 配置中设置值为 7。

常见问题(FAQ)
- 哪些联发科模块 / 功能会受此政策影响?
- 联发科 AGPS、IMS、调制解调器(MODEM)及 GPS 日志功能均需遵循此政策。
-
若没有联发科 BSP 代码库,厂商客户如何集成联发科的可见性控制功能?
-
集成 GNSS 归因应用代码仓库:
alps/vendor/mediatek/proprietary/packages/apps/GnssVisibilityControl -
在项目的
device.mk中添加归因应用的包名 -
在
frameworks/base/telephony/java/android/telephony/CarrierConfigManager.java中,更新 AOSP 运营商配置文件的KEY_NFW_PROXY_APPS_STRING项:defaults.putString(KEY_NFW_PROXY_APPS_STRING, "com.mediatek.gnss.nonframeworklbs"); -
如何引导终端用户授予代理应用定位权限?
- 厂商客户需开发设置向导或弹出对话框,引导终端用户为此应用包授予权限。
- 是否有功能选项可禁用 GNSS 可见性控制功能?
- 此功能无对应的功能开关选项。
- 若移除 NonFrameworkLBS 代理应用会怎样?
- AGPS、IMS 功能将无法正常工作。
- 如何实现默认启用(与 Android P 的行为一致)?
- 对于非 GMS 项目,厂商客户可在设置向导或系统启动后,默认授予联发科代理应用定位权限。
- 可通过 PackageManager 的
grantRuntimePermission()API 授予定位权限。
- 如何在启动器(Launcher)中隐藏代理应用图标?
- 修改
vendor/mediatek/proprietary/packages/apps/GnssVisibilityControl/NonFrameworkLbs/AndroidManifest.xml - 移除其中的
<category android:name="android.intent.category.LAUNCHER" />配置项。
- 若代理应用包名变更,GPS 驱动中需要更新哪些内容?
-
请更新以下两处代码,将联发科包名替换为新名称:
-
文件路径:
vendor/mediatek/proprietary/hardware/connectivity/gps/mtk_mnld/mnld_entity/src/mnld.cconst char nfw_app_name_list[MNLD_NFW_USER_NUM][MNLD_NFW_USER_NAME_LEN] = {"com.mediatek.gnss.nonframeworklbs"};
-
-
以及代码中的:
.proxyAppPackageName = "com.mediatek.gnss.nonframeworklbs",