Analysis of Excessive Data Consumption and App Crashing on iOS Devices

[中文版/Chinese Version]iOS异常流量消耗及大范围应用闪退问题的分析

This is the third knotty issue happened on my Apple devices.

By the end of June this year, my iPhone running iOS11.4 ran nearly 10G of mobile data during a single day. The log of Shadowrocket(An Network Extension app) revealed that my iPhone kept downloading unknown data from gateway.icloud.com at the rate of about 200kb/s. I tried switching the iCloud account, but the problem appeared again after a short period of time. I was busy dealing with the exams at that time, so I simply Rejected gateway.icloud.com in Shadowrocket. No negative influence on daily use.

After some searching, I found some people claimed they have encountered a similar problems (22nd floor): https://www.v2ex.com/t/459452 . However, his solution of logging out of iCloud on macOS devices did not work for me.

But the trouble didn’t end. Since then, a large number of apps crashes while launching on my iPhone and iPad at a frequency of 2-3 times a week. When the problem occurs, most applications will hang at the Splash Screen and crash after about 10 seconds. Applications that crashed including TIM, Notability and all of the Google apps. WeChat and Apple’s own apps are unaffected. During this time, the phone went hot, and will stuck when entering the iCloud settings. My iPhone runs iOS 11.4 and 12 Public Beta, and iPad running 11.4 and 12 Developer Beta.

December 2020 Update: Some readers found a similar issue on iOS 14, but with different symptoms. Please refer to the comments for more information.

Symptoms

By summarizing my observation and information collected from Internet, I sum up the symptoms of this problem as follows:

Running iOS 11.4 or lower

  • There are extremely high data consumption in “Documents and Sync” section
  • Device continuously downloads unknown data from gateway.icloud.com

Running iOS 12 or higher

  • Most 3rd party apps will crash after hanging at splash screen for about 10 seconds.
  • Device went hot with higher power consumption
  • Device stuck when accessing iCloud related functions and password auto fill.

Attempts

I tried rebooting, force rebooting, reinstalling affected apps, upgrading iOS(to iOS 12 beta), logging out and logging back in to iCloud, didn’t work. The iPhone will recover from the problem after a while without taking any actions.

iOS异常流量消耗及大范围应用闪退问题的分析

[English Version/英文版]Analysis of Excessive Data Consumption and App Crashing on iOS Devices

这是我遇见的第三个Apple设备上的疑难杂症。

大概是今年的6月底,我的iPhone(运行iOS11.4)一夜之间跑掉了将近10个G流量。经检查Shadowrocket日志发现,iPhone在以约200kb/s的速度持续从gateway.icloud.com下载不明数据。(根据其他受害者反映,如果没有安装Surge一类的软件,这些不明流量会在流量统计中显示为“文稿与同步”)我原来的iCloud使用的是日区账号,换成国区账号之后仅仅好了不到两天之后,问题再次出现。由于我当时正被考试周搞得焦头烂额,我在Shadowrocket里将gateway.icloud.comReject掉之后就没有再管他,也不影响日常使用。

之后查找相关资料发现,也有网友遇到类似问题:https://www.v2ex.com/t/459452(22楼)。但是他提出的登出macOS设备上的iCloud的方案,我试了之后并没有成功。

但是事情并没有结束,自从升级了iOS12 Beta之后,我的iPhone和iPad都出现了时不时发生应用大面积闪退的问题,频率基本维持在一周2-3次。当问题发生时,点开大多数应用都会卡在Splash Screen大约10秒后闪退。会闪退的应用包括但不限于知乎,TIM,Notability及所有Google应用。微信和苹果自带应用基本不受影响。此时手机会发热,并且进入iCloud界面时大概率会卡死。出现问题时我的iPhone运行的iOS版本为11.4,后来升级至iOS 12 Public Beta后问题依然存在。

2020年12月更新:有朋友表示iOS14上出现了类似的问题,但可能表现出了不同症状。详细情况请参考评论区。

症状

汇总我自己的尝试及网友提供的信息,我将这个问题在iOS设备上的症状总结如下:

运行iOS11.4及更低的iOS版本时

  • 流量统计中的“文稿与同步”项目消耗了大量流量
  • 设备以约200kb/s的速度持续从gateway.icloud.com下载不明数据

运行iOS12及更高的iOS版本时

  • 设备时常发生应用大面积闪退的现象,启动大多数第三方应用时会卡在Splash Screen大约10秒后闪退
  • 设备发热,耗电量激增
  • 访问iCloud内容及使用密码填充时卡顿

尝试

我尝试了重启,强行重启,重新安装出现问题的应用,升级iOS及登出并重新登录iCloud,均没有效果。如果不进行任何处理,一段时间以后也会自行恢复。

分析

由于这个问题十分隐蔽,导致每个人的描述都不太一样,因而很难在网上搜索到。我整理了所有出现类似问题的贴子合集:
https://www.v2ex.com/t/460089
https://www.v2ex.com/t/471491
https://cn0xroot.com/2018/07/17/2018-07-16/
https://www.v2ex.com/t/459452
https://discussionschinese.apple.com/thread/140132632
https://www.reddit.com/r/jailbreak/comments/8sf4u3/help_this_block_of_text_is_being_spammed_in_my/
https://forums.developer.apple.com/thread/105722
https://forums.macrumors.com/threads/excessive-data-consumption-for-documents-sync-and-constantly-high-cpu-load-on-iphone-and-ipad.2127349/

这个问题出现的时间很随机,我目前还没有找到其触发条件,难以手动复现。我初步定位问题与iCloud有关,并且与在iOS11.4下出现的iCloud持续下载数据问题有关联。

检查Console发现,在应用启动并闪退时,会出现Provision violated for watchdog scene-create信息。经搜索得知,这个报错是由于应用启动时间过长而被系统强行杀死。

Oracle数据库安装与配置

这次的大数据小学期需要用到Oracle数据库。我在安装Oracle数据库的过程中费了很多周折,在此记录一下安装过程和配置上遇到的问题。

安装

Oracle数据库是重量级的企业级软件,安装相对麻烦。如果要在Linux上安装,Oracle官方仅提供了rpm安装包,并且需要图形界面。debian系发行版并不被官方支持,不建议使用。我选用的操作系统是Windows Server 2008。除此之外,使用Docker镜像或AWS云服务也是不错的方案。

我选用的Oracle Database版本是11g。11g版本分为Express Edition(XE),和Enterprise Edition(EE)。EE版拥有更多的功能(包括很实用的Enterprise Manager)。Oracle数据库虽然是商业软件,但是针对非商业使用是免费的,并且Oracle的收费策略是针对服务收费,而并非软件本身。
下载:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html
安装过程并不复杂,按照安装向导的提示操作即可。具体安装过程请参考:http://holowczak.com/installing-oracle-11g-release-2-windows-7-32-bit/本文不再赘述。
安装过程中其中一个步骤是选择Oracle数据库使用的编码。如果语言设置为简体中文,则默认的编码是GBK。为了避免出现乱码,请尽量选择UTF8编码。

使用Flex和Bison制作编译器

这学期的编译原理课上,我们以C-Minus,一个C语言子集,作为源语言,实现词法分析、语法分析、三地址代码生成等功能的编译器(或解析器)。
代码见GitHub:https://github.com/frankgx97/compiler

Flex与词法分析

进行词法分析之前首先对字符表进行定义。根据CMinus的语法定义,需要进行识别的字符集主要包括如下部分:
关键字:
if,else,while,int,void,return
运算符:
+,-,*,/
比较运算符:
<,<=,>,>=,==,!=,,
标识符:
ID
数字:
NUM

一个flex词法分析文件和bison一样分为声明,定义,规则4个部分。
其中,定义部分用来通过正则表达式定义单词,如数字可定义为{digit}+

letter  [a-zA-Z]
digit   [0-9]
ID  ({letter}|{digit})+|{letter}+({letter}|{digit})*
NUM {digit}+
SPACES  (\t|\0|\r|\n|\ )+
COMMENT \/\*([^\*^\/]*|[\*^\/*]*|[^\**\/]*)*\*\/  

使用systemd

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序,现在已成为大多数发行版的标准配置。

历史上,Linux 的启动一直采用init用于管理进程和服务。这种方法有两个缺点:一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程;二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。因此Systemd应运而生,Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

创建配置文件

/etc/systemd/system创建一个以.service结尾的文件。

例如servicename.service

[Unit]
Description=systemd sample

[Service]
ExecStart=[启动命令(可执行文件应为绝对路径)]
Restart=always
User=[用户名]
Group=[组名]
Environment=PATH=/usr/bin:/usr/local/bin
Environment=[环境变量(例如NODE_ENV=production)]
WorkingDirectory=[工作目录]

[Install]
WantedBy=multi-user.target

一次惨痛的GRE考试

经过两个月的(精心)准备,终于在今天上午迎来了我的第一场GRE考试。

考场在北大理教的计算中心。进场之后是例行的存包,签保密协议等等。等9点过的时候统一安检,入场,拍照片。

我分到的考位是一个靠墙的角落,感觉相当不错,不会有人进进出出。北大的机房很老旧,但是设备还可以。屏幕是16:9的宽屏,在考试时字体会被拉的很宽。键盘虽然不如北工商,但也还说得过去。等所有人都检录完成之后,整个考场几乎可以同时开始考试,这样也就无所谓先进或后进考场,当然也不会在读阅读的时候旁边突然钻出来一个人开始describe the city you live in。

Padavan路由器安装Time Machine服务器

此前我的路由器一直使用OpenWrt。但是,近日在OpenWrt中继配置万能的过程中遇到了一系列问题后,了解到了Padavan这个固件。Padavan固件的功能十分强大,可以实现包括但不限于文件共享,Aria,Transmission,Web容器,Time Machine等强大功能。

源代码:padavan / rt-n56u — Bitbucket
论坛发布页:http://www.right.com.cn/forum/thread-161324-1-1.html

准备工作

  • 一台已经刷入Padavan固件的路由器,并妥善设置opt环境。设置opt环境请参考:像openwrt一样装更多的软件
  • 一块移动硬盘,格式化为ext4(虽然Padavan可以识别NTFS和exFAT分区,但是后期会引发一系列问题,所以请务必使用ext4)
  • 进入系统管理,修改管理员账号为root

macOS High Sierra安装Caffe框架

英特尔杯人工智能挑战赛需要用到Caffe深度学习框架。Caffe框架在macOS上需要手动编译,然而官方的安装教程年久失修,并且编译过程中会遇到由不同版本或环境而引发的问题,我历时三天,踩了无数的坑之后,终于成功安装了Caffe框架。在此记录下安装的过程和遇到的错误,希望对你有所帮助。

系统环境及安装配置

  • Macbook Air 13′ macOS High Sierra
  • Homebrew
  • Xcode
  • Miniconda Python2(Caffe建议使用Anaconda Python,另外我在尝试使用Python3编译Caffe时遇到了未知的错误,因此建议使用Python2.7)
  • openBLAS(Intel的MKL库会提供更高性能且更稳定的计算,在校学生可以通过这里申请:Intel® Math Kernel Library (Intel® MKL) | Intel® Software
  • CPU ONLY模式(MacBook Air没有NVIDIA GPU,因此使用CPU ONLY模式,不需要安装CUDA及cuDNN)

MySQL 权限管理

前段时间,我班有两个人的MySQL数据库被攻破,所有数据被清空。他们的MySQL实例有两个共同点:

  1. 暴露3306端口。
  2. 使用root用户登录且为弱密码。

MySQL的root用户权限过大,使用root登录是较危险的。因此我们应当避免在生产环境使用root登录,而是新建一个权限较小的用户,以确保安全。

使用蓝图(Blueprint)组织Flask应用

在一些重量级Web框架中(如Laravel/Django),框架中已经预置了整个框架的目录结构,在没有特殊需求的情况下通常不会改变它。在Flask这类轻量级框架中,理论上你可以把一个项目的全部代码都放进一个.py文件中。然而一旦项目规模稍大,就会变得庞大而难以管理。这时,我们需要蓝图(Blueprint)来帮助我们管理代码结构。

蓝图

什么是蓝图

Flask用蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的蓝图 。

简而言之,我们可以将蓝图理解为Flask应用中的一个模块。