未 root 的设备,究竟该怎么彻底禁用 app 获取位置?

2016-10-13 17:34:22 +08:00
 moonkiller
现在的国产 App 真是一个个流氓得要死,都关闭 GPS 定位了
还要通过通过各种手段获取你的位置信息,求彻底关闭或伪造的方案
11818 次点击
所在节点    Android
19 条回复
sigroma
2016-10-13 17:55:00 +08:00
gps 太慢了,实际上各个地图应用都是用的 wifi 信号和 gps 共同工作来定位
只要你给了网络权限,基本就没啥办法吧
bertonzh
2016-10-13 17:57:42 +08:00
用代理
shlabc
2016-10-13 17:58:54 +08:00
换个思路,买 2 台手机。 1 台 ip6+,只装 10+必备应用。另一台买个能 root 性能又足够的。
honeycomb
2016-10-13 18:11:03 +08:00
在标准的 Android 设备上,只要:

关闭定位权限且使用 app 时不要连入无线局域网即可。

如此 app 拿不到除了本地 IP 以外的一切和定位有强关联的信息。

如果连 IP 也不能要的话,只能是 iOS 那样彻底断网了。
qceytzn
2016-10-13 18:52:28 +08:00
@honeycomb 那么“在标准的 Android 设备上,关闭定位权限且使用 app 时通过手机上的 SS 或者 VPN 连接 wifi 的情况下” app 还能获取到真实的定位信息吗?

另外就是即使走手机流量的,也能定位到最近的基站吧?最远不过 2 公里吧?
helloccav
2016-10-13 19:11:57 +08:00
装 xposed 框架,再装 XPrivacy 伪造位置, 这不算 root 吧?
zyxc
2016-10-13 19:24:25 +08:00
@helloccav 兄弟 你告诉我装 xposed 框架不用 root 吗?
JohnChu
2016-10-13 19:34:56 +08:00
我对于隐私也比较注重,你可以看我发的帖子。今天发现了一个应用,叫 Apk permission remover 。应该能满足你的需求
app 定位貌似有两种,一种是 GPS ,一种是通过 WiFi 和基站模糊定位,两种权限都可以用这个软件禁止。
JohnChu
2016-10-13 19:35:30 +08:00
@zyxc 不一定要 root ,有些用 recovery 刷入就行了
honeycomb
2016-10-13 19:58:43 +08:00
@qceytzn

我认为这种情况下应当获取不到和位置有关联的信息,但我不知道在挂上 VPN 后,从 networkmanager 的 API 读取到的本地 IP 地址是基站分配的还是 VPN 的。

当然要排除掉系统存在另一个能获得定位数据的 app x ,然后那个 x 又开放了一个接口,且当前应用去调用 x 。如果是这样的情况,它不受权限机制限制。早两年 Google play service 出过类似的 bug 。


关闭定位权限后,无法获得基站信息(相关的函数需要有定位权限,否则 appops 是不让它调用(抛出 SecurityException )或返回 null/空值的,具体根据系统版本与应用的 targetAPI level 有关。
honeycomb
2016-10-13 20:01:59 +08:00
@zyxc 在 nexus 这样的手机上,装 xposed 还真不用 root 手机:

art 的部分是从 recovery 安装的,而为了使用自定义 recovery ,只要解锁 bootloader 就可以了
xposed companion app 本身无论是安装还是运行都不需要 root 权限

所以不需要 root

@JohnChu 这个问题用 appops/运行时权限机制就能解决了,不需要那么麻烦且要付出重新打包这样代价的方法。 appops 从 4.3 开始就有了。
JohnChu
2016-10-13 21:03:03 +08:00
@honeycomb 我觉得你讲的是系统内建的权限管理,那个并不能满足我的需求,我希望能够控制应用程序读取 IMEI 等信息。
honeycomb
2016-10-13 21:14:37 +08:00
@JohnChu

Android6.0 开始有一个电话权限(运行时权限),在不允许电话权限的时候就不能读 IMEI ,遇到微信这样用耍流氓(看到没有这个权限就不肯运行)的,就进一步用 appops ,把微信的 OP_READ_PHONE_STATE 置为 ignore ,同时允许电话权限,这样微信读不到 IMEI 且耍不了流氓。

如果在更早的系统上阻止获取 IMEI ,确实需要第三方软件的帮助了。

这样符合你的需求吗?
realpg
2016-10-13 22:23:52 +08:00
@JohnChu 非移动数据接入的话,非铁通长宽非法 NAT 的宽带, IP 定位就足够了……
GhostFlying
2016-10-13 22:34:28 +08:00
JohnChu
2016-10-14 08:39:37 +08:00
@honeycomb 我使用的是三星的系统, android 版本 6.0 ,系统自带的权限管理中没有出现如 OP_READ_PHONE_STATE 这样细化的管理,请问 appops 怎么实现?谢谢
honeycomb
2016-10-14 08:58:48 +08:00
@JohnChu 5.1 以上的版本在未加改动前,只有 adb shell 的 appops 命令能更改每个应用的 appops 配置
JohnChu
2016-10-14 11:53:56 +08:00
@honeycomb 我 ignore 了如下权限:
OP_READ_PHONE_STATE
READ_SMS
RECEIVE_SMS
CALL_PHONE
GET_ACCOUNTS
是不是我的 IMEI 不会被读取到了?(尽管禁得有点多)
honeycomb
2016-10-14 13:47:13 +08:00
@JohnChu 阻止获取 IMEI 只需要 ignore 掉 OP_READ_PHONE_STATE 就足够了,你列出的剩下四个和 IMEI 无关,是涉及其它操作的 op 。

如果想弄明白上述说明的具体流程,可以这么做:

1 ,在 Android 文档里找到获得 IMEI/meid 的函数,也就是 TelephonyManager.getDeviceId()

2 ,到 Android 源代码里找到这个函数,看它是如何触发 appops 检查的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312564

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX