App对你的手机做了什么?

App 对你的手机做了什么?

前段时间,央视新闻频道播出了一则手机 App 频繁自启动 收集个人隐私触目惊心的新闻,报告出多款常用的手机 App 在后台有自启动、读取照片文件、读取手机信息和读取定位信息的行为。这则新闻再次引起了很多人的关注。虽然在手机普及的信息时代,信息的互通给大家带来了极大的便利,但是个人的隐私信息是否能够”守得住“需要引起更大关注。

下面我将基于 Android 平台,以开发者的身份深入解析:App 到底在后台对你的手机做了什么

Android = 安卓

App = 应用

本文是由Steven Yan原创
转载或引用请注明作者和出处👉RyzenX.com

1-App 能“偷窥”些什么?

打开你的安卓手机,进入:设置->应用/应用管理/应用设置->找到你一个常用的 app->点击 app 图标->点击“权限/权限管理”,你就能看到这个 App 向你的手机申请了多少权限。下面将以微信为示例,介绍 App 拿到这些权限一般会做什么?

这是一张微信的权限示例图

什么是权限?

在 Google Android 开发者文档中,这样描述权限(Permissions)

The purpose of a permission is to protect the privacy of an Android user. Android apps must request permission to access sensitive user data (such as contacts and SMS), as well as certain system features (such as camera and internet). Depending on the feature, the system might grant the permission automatically or might prompt the user to approve the request.

设置“权限”的目的是为了保护安卓用户的隐私。安卓应用必须先请求用户同意才能获得如“读取通讯录”“读取短信”这样的敏感权限,或者获得某些如“访问相机”和“访问网络“等的系统功能的许可。取决于某些功能特性,系统会默认许可一部分权限或者建议用户同意某些权限请求。

简单来说,手机应用想要读取用户的信息和访问某些功能是需要用户手动同意的。这种“权限”是强制要求应用“先申请,后使用”,目的肯定是想要尽可能把控制权交给用户自己,可是为什么现在的应用都无视这个设置了呢?权限有什么用呢?

谷歌将安卓应用的权限分为三个级别:普通权限(Normal permissions)、签名权限(Signature permissions)、危险权限(Dangerous permissions)。

  • 普通权限表示一些不会影响到用户隐私的权限,例如访问互联网、访问网络状态、显示通知等等。
  • 签名权限一般和某些系统应用联动,例如更换桌面图标,就需要桌面启动器提供的权限。
  • 危险权限表示可能影响到设备功能和用户隐私的权限,例如录音录像、访问照片文件、发送短信彩信等等。这类权限几乎都需要用户手动确认。

App 会拿这些权限做些什么?

回到刚刚微信的权限示例截图,来具体分析一下。

  • 发送短信/彩信:这一项权限大家应该不陌生,会想大约五年以前,可能你的手机中病毒后第一件事就是“帮”你向运营商订购一大堆“彩铃”“礼包”“游戏充值卡”,由此来获利;而且以前的手机病毒还通过手机短信群发病毒链接,以此来进行传播。那么微信拿它有什么用呢?其实是在你注册微信/验证微信密保/重置微信密码时,“帮助”你发送一条校验短信的,当然这条短信可以自己手动发出,所以这项权限——拒绝
  • 读取联系人/修改联系人:发现微信在给你推荐通讯录好友了吗?是的,微信拿这一项权限就是用来实现这个功能的。当然我们可以猜测,微信可能会利用你的通讯录实现信息联网,如果你并不需要推荐手机通讯录微信好友的功能,那么建议——拒绝
  • 定位:不必多说,在你向好友共享位置的时候就会用到它,如果你不想时时刻刻让微信了解你的行踪,在 Android 10 及以上的系统中,可以选择——仅在使用过程中允许
  • 获取手机信息/获取应用列表/访问手机账户:这一般是为了让应用识别你的登陆手机是否是常用手机,避免盗号风险,不过还是那句话,你也不知道应用会在后台拿你的数据干嘛。获取手机信息——允许;获取应用列表/访问手机账户——拒绝
  • 相机/录音:这两个是最容易出现隐私泄露风险的,但是你也不得不允许的权限。你想在朋友圈分享小视频,你需要允许微信访问相机;你想给好友发送语音,你需要允许微信录音。所以为了不牺牲功能还是选择——允许
  • 读写手机存储:这是一项非常有争议的功能,想了解详细的说明请继续阅读。你只需要知道,本来你不需要给这个权限你也能正常使用,但是你不得不给这个权限。我们妥协吧,选择——允许
  • “设置相关”:这些权限可以按照需求开启,一般允许显示悬浮窗常驻通知,因为这两个权限在屏幕上都能看得到的,而且不会对隐私有关。所以按照需求可以——选择性开启

2-App 为什么能拖慢手机运行速度?

App 运行的时候会占用系统资源,这我们都知道,但是为什么我没有用这些 App 的时候,手机还是很卡顿、耗电还是很高?

这就牵扯到应用在安卓系统中的一项功能——自启动

ysxw-2020-06-11-1

自启动本身并不是一个坏东西,你的手机电脑启动的时候,就会自动启动一些系统应用:启动桌面应用,这样你才能看到应用图标;启动设置,这样你的手机才能自动连接上无线网络和蓝牙。也就是说,合理利用“自启动”这个功能是能够方便用户的使用的,但是错就错在很多应用滥用了“自启动”功能。

原理

自启动可以按照启动对象分为:系统唤醒关联唤醒

系统唤醒

系统自启动是使用了 Android 提供的:Broadcast 系统广播和 Receiver 广播接收类来完成的。

boardcast.actions

Android 9广播通知多达219种

系统广播可以说是知无不言,可以理解为安卓系统对着所有 App 用大喇叭喊道:

  • 我开机啦!
  • 我在充电啦!
  • 我充电完成啦!
  • 我连接上网络啦!
  • 我的下载任务完成啦!
  • 我安装好应用啦!
  • …………

那么既然系统都这么喊了,我应用是不是应该做点什么?于是应用就添加了相应行为(action)的接收器,当应用一旦接收到系统的广播,就会开始执行自启动,这就是为什么你没有点击应用图标,应用却还能照常运行。

示例 MyBroadcastReceiver.java 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MyBroadcastReceiver extends BroadcastReceiver {
static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
static final String ACTION_SCREEN_ON = "android.intent.ACTION_SCREEN_ON";
static final String ACTION_SCREEN_OFF = "android.intent.ACTION_SCREEN_OFF";
static final String ACTION_CONNECTION_CHANGED = "android.net.conn.CONNECTIVITY_CHANGE";
static final String ACTION_WIFI_CHANGED = "android.net.wifi.WIFI_STATE_CHANGED";
static final String ACTION_ADDED_APP = "android.intent.action.PACKAGE_ADDED";
static final String ACTION_REMOVED_APP = "android.intent.action.PACKAGE_REMOVED";
static final String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
static final String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
static final String ACTION_POWER_CON = "android.intent.action.ACTION_POWER_CONNECTED";
static final String ACTION_POWER_DISCON = "android.intent.action.ACTION_POWER_DISCONNECTED";
static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_BOOT)){
TipsUtils.notify(context, "开机完成");
} else if (intent.getAction().equals(ACTION_SCREEN_ON)) {
TipsUtils.notify(context, "屏幕打开")
} else if (intent.getAction().equals(ACTION_ADDED_APP)) {
TipsUtils.notify(context,"已安装应用");
} else if (intent.getAction().equals(ACTION_REMOVED_APP)) {
TipsUtils.notify(context,"已卸载应用");
} else if (intent.getAction().equals(ACTION_WIFI_CHANGED)) {
TipsUtils.notify(context,"WiFi连接变化");
} else if (intent.getAction().equals(ACTION_CONNECTION_CHANGED)) {
TipsUtils.notify(context,"网络连接变化");
} else if (intent.getAction().equals(ACTION_MEDIA_MOUNTED)) {
TipsUtils.notify(context,"已挂载存储介质");
} else if(intent.getAction().equals(ACTION_MEDIA_REMOVED)) {
TipsUtils.notify(context,"已移除存储介质");
} else if (intent.getAction().equals(ACTION_POWER_CON)) {
TipsUtils.notify(context,"已连接电源");
} else if (intent.getAction().equals(ACTION_POWER_DISCON)) {
TipsUtils.notify(context,"已断开电源");
} else if (intent.getAction().equals(ACTION_WALLPAPER_CHANGED)) {
TipsUtils.notify(context,"已更换壁纸");
}
}
}

关联唤醒

顾名思义,关联启动就是已经运行的应用去启动其他应用的行为,要是说现在的定制安卓系统能够防止系统唤醒,可是关联唤醒可是不那么容易防止的。因为很多时候关联唤醒的必要的,比如你想在”图库”中分享图片到”QQ”,那么图库就必须唤醒 QQ,你想在”淘宝”中支付,淘宝就必须唤醒支付宝。

zfb-被关联启动
在某手机管家中显示支付宝被关联启动的情况

Android 操作系统启动就是上文说的“系统唤醒”;

手机淘宝想要启动支付宝付款我知道,还有那么多奇奇怪怪的应用,干嘛要启动支付宝?

其实并不是应用要主动启动支付宝,故意拖慢你手机速度。实际上是其他应用使用了支付宝的 SDK,也就是内嵌了支付宝的一部分用来方便用户通过支付宝支付。但是其他应用没办法控制 SDK 的行为,这相当于霸王条款:你想用我的功能,就别管我做什么。

ysxw-2020-06-11-2

除了阿里系的 SDK,还有腾讯系的 SDK、百度系的 SDK、头条系的 SDK 等等,很多应用都使用了这些 SDK 来便捷化应用的开发。比如我想实现地图导航,采取高德地图的 SDK 就可以,不需要开发者自己去设计地图、设计路线,但是这个高德地图 SDK 具体除了实现地图导航,还要干些什么,那开发者也是不得而知的。

目的

App 想要自启动,在后台一直运行的目的其实挺复杂。

往好的方面说:你可以及时收到消息,能够在应用间更加流畅的使用不同的功能;

往坏的方面说:应用在后台收集你的数据,用来实现用户画像或者干脆直接出售。

3-App 做的这些事情有必要吗?

很明确的说:大多数是没必要的

也就是说,很多权限不给应用,应用不需要后台自启动,你的使用上不会有任何影响。

就拿上文说的读写手机存储,对于大多数应用来说,根本不需要这一项权限,但是事实上大多数应用都会向你请求这一权限,不允许还没法用!应用会给出各种各样的理由:不给权限没办法保存图片;不给权限您不能上传图片;不给权限您不能下载音乐……

事实:

想要访问相册?安卓提供了通过“图库”应用获得你图片的方法,你可以选择图片或者视频,应用也只能读取到你所选择的图片,给予应用读写手机存储的权限之后,它能够读取你所有的照片。

没法保存数据?安卓为应用在存储中专门划分了独立的存储空间,就在Android/data中,按照应用分成文件夹,互不干扰不杂乱,给予应用读写手机存储的权限后,应用想保存在哪里就保存在哪里,想创建多少个文件夹就创建多少个文件夹,垃圾数据想存多少就存多少,而且卸载了应用还是不能完全删除。

想要发送通知?GMS 提供了统一的通知发送 API,应用不需要持续运行也能发送通知。没有 GMS?国内也有统一通知平台,比如 MiPush。

本来能够通过官方的渠道实现某一项功能,反而大费周章想你索取权限,这些 App 的目的实在让人琢磨不透。

4-国内 App 乱象

很有意思的是,网络上那些最“讨厌”的 App,往往是大家常用的国产 App。反而国外的 App 十分“乖巧”。

而且国内的 App 功能相当复杂:购物、聊天、直播、新闻、小视频……结果就是App 容量大幅增大,你是否已经习惯了只用来支付的支付宝占用 270MB 的容量?是否习惯了只用来聊天看朋友圈的微信占用 530MB 的容量?你是否习惯了网络购物的淘宝占用 430MB 的容量?

曾几何时,内存 1GB 不卡、2GB 流畅、4GB 全能;存储空间 8GB 够用、16GB 随心、32GB 海量。而现在的国产手机高配版直接内存 12GB、存储高达 512GB,甚至内存低于 6GB 就会被认为太小无法流畅运行。

几年之前诺基亚手机回归,诺基亚为中国市场推出的 8GB 大内存版本的做法不知是喜是忧。要知道除了不能打电话其他啥都能干的 Windows,仅仅 2GB 的内存就能运行,4GB 内存就能流畅运行办公软件;而现在手机的内存和存储容量,比大多数普通笔记本电脑还要大。但是你依然会觉得卡顿。

要知道在印度,很多人的手机内存还只有 2GB,存储空间也才仅仅 16GB,然而他们跟我们享受着同一个互联网生活:网购、发照片、导航、直播……

应该反思这究竟是我们的软件厂商“技术很好”还是“技术很差”?

5-我想做手机的主人?

很抱歉,目前甚至之后的很多年,国内安卓圈依然会保持这样一个乱象,App 为了抢占你手机的隐私数据费劲心机。一方面是国家没有针对性的法律条文,一方面是互联网公司的利益驱使。

最近,小米和华为都主动向应用的“流氓”行为作出了行动,MIUI 和 EMUI 内置的权限管理能够显示 App 的后台行为,并且制止其读取用户隐私数据。可以说开了一个好头,我也希望能有更多的厂商能够加入,尽快实现安卓手机 App 的法律化、规范化、合理化。

当然,如果你现在实在受不了 App 采集你的隐私,可以换用 iPhone。iOS 生态圈的应用将会严格进行审核,几乎没有上述的问题:不会不经允许读取个人信息,不会后台占用,不会产生垃圾数据……

打赏
  • 版权声明: 本博客采用 Apache License 2.0 许可协议。
    转载请注明出处: https://ryzenx.com/2020/06/app%E5%AF%B9%E4%BD%A0%E7%9A%84%E6%89%8B%E6%9C%BA%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88/

谢谢你的喜欢~

支付宝
微信