同一个软件在iOS平台有的话首选iOS,权限控制更严格且程序无法作出反抗。如果遇到因为地区限制(比如某国产流媒体音乐服务软件仅限在中国市场下载)只能在Android上安装的话就需要手工设置部分权限静默。
以下内容参考了这篇文章
首先需要安装adb。MacOS下可以用homebrew brew install android-platform-tools
开启手机usb debugging (Settings -> About phone -> Build number连续点击10次开启developer mode) 连接上手机后首先查找一下安装的软件包名。 在这个例子中用的虾米音乐 adb shell pm list packages|grep -i xiami package:fm.xiami.main
得到结果是fm.xiami.main
之后用appops把某些权限设置为ignore。不能设置成deny因为程序在检测到没有获得该项权限时会拒绝服务(所以我们叫他流氓软件)设置成ignore的话程序无法detect到这个变化。不过第一次启动程序还是不得不授予所需的权限否则程序拒绝启动,这一点不知道是否将来有workaround。
adb shell appops set fm.xiami.main WRITE_SMS ignore adb shell appops set fm.xiami.main OP_READ_PHONE_STATE ignore
这两个权限一个是发送短信另一个是读取电话信息权限。一个音乐软件要求电话管理以及发送SMS权限实属过分。
检查该软件获得的所有权限 $adb shell appops get fm.xiami.main COARSE_LOCATION: ignore FINE_LOCATION: allow; time=+21m35s704ms ago; rejectTime=+12m39s614ms ago POST_NOTIFICATION: allow; time=+14m32s602ms ago CALL_PHONE: ignore WRITE_SMS: ignore; rejectTime=+15m8s617ms ago WRITE_SETTINGS: default; rejectTime=+15m15s701ms ago READ_CLIPBOARD: allow; time=+12m35s36ms ago WRITE_CLIPBOARD: allow; time=+12m35s34ms ago TAKE_AUDIO_FOCUS: allow; time=+18m42s431ms ago TOAST_WINDOW: allow; time=+14m30s54ms ago; duration=+2s527ms OP_READ_PHONE_STATE: ignore; rejectTime=+13m13s115ms ago READ_EXTERNAL_STORAGE: allow; time=+15m7s9ms ago WRITE_EXTERNAL_STORAGE: allow; time=+15m7s9ms ago RUN_IN_BACKGROUND: allow; time=+3m11s711ms ago
其中FINE_LOCATION 设置ignore但不知出于何种原因无法生效。此外在权限后没有出现time的即意味着程序没有请求该项权限(我事先禁止了CALL_PHONE) 对于FINE_LOCATION,据 @yegle建议可以通过禁止RUN_IN_BACKGROUND 权限来达到程序关闭即无法探知用户位置实现。