「科普向」都2024年了,你的Android手机还是越用越卡么?

朋友A:我的手机怎么**才用两年**就这么**卡**

朋友B:你用的Android手机吧,Android手机就这样,卡得很,下次换苹果手机吧

朋友A:Android 手机太垃圾了

相信这种对话,或者这类"Android手机就卡"在大部分人的日常生活中都曾听闻,尤其是在和iOS手机做比较时,"Android手机使用年限长了后就会卡,不像苹果手机" 是绝大多数人对Android手机的固有印象。

都说一款手机的硬件水平决定了你会不会买它,而一款手机的软件系统决定了你第二次还会不会想买它。软件系统很大程度上决定了手机厂商能不能留住客户。

忽略主观印象上对Android系统的喜爱与偏见,Android系统真的就是所谓的垃圾系统么?都2024年龙年了,Android手机还是越用越卡么?

Android系统的发展史

2003年-2005年,万物伊始

2003年10月,安迪·鲁宾、Rich Miner、Nick Sears和Chris White创建Android公司,并组建Android团队。2005年8月,Google低调收购了成立仅22个月的高科技企业Android及其团队,安迪·鲁宾成为Google公司工程部副总裁,继续负责Android项目。

2007年-2010年,初见雏形

2007年11月5日,Google公司正式向外界展示了这款名为Android的操作系统,并且在这天Google宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信运营商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统。这一联盟将支持Google发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。

2008年9月22日,T-Mobile在纽约正式发布第一款android手机------T-Mobile G1。这一里程碑式的事件,也标志着Android正式进入了大众视野。

2011年-2014年,崭露头角

从2008年9月22日,T-Mobile在纽约正式发布第一款android手机------T-Mobile G1开始,Android系统不断获得各个手机厂商的青睐。Android已经超出了手机操作系统的范畴,Android系统已经广泛应用于TV,手表及各种可穿戴设备。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。

2015年-至今,方兴未艾

自2016年开始,Android系统进入了稳步发展阶段,Android开发团队保持着一年一个版本的节奏,贴合用户需求和时代发展背景,不断进行性能优化和功能增强,例如:

  • Android 7.0 引入多窗口模式、通知摘要等功能
  • Android 8.0 引入背景限制、通知分类等功能
  • Android 11.0 对折叠屏设备进行了支持
  • ...

同时开始注重用户的隐私保护,引入了动态运行时权限及更多的隐私控制选项,允许用户更好地控制应用的权限,为自身的信息安全保驾护航。

为什么Android系统更容易卡顿?

Androd系统的碎片化问题

说到Android手机卡顿的问题,就不得不提Android系统碎片化这个元凶。

何谓Android系统碎片化?

Android系统自诞生之日起,左手开源、右手免费,迅速进入大众视野占领市场,成为全球市场份额排名第一的手机系统,收获了不计其数的拥趸。然而,也正是由于其免费开源的特性,导致Android设备在硬件、软件功能方面存在巨大的差异,这些差异体现在以下几个方面:

  1. 版本的差异性:Android系统发布了多个版本,而不同的设备可能运行着不同的Android版本。这意味着开发者需要考虑不同版本之间的差异,以确保应用程序在各种版本的Android系统上正常运行。
  2. 设备的差异性:Android系统运行在各种不同的设备上,包括智能手机、平板电脑、智能手表、智能电视等。每个设备具有不同的屏幕尺寸、处理器、内存和其他硬件规格,这对开发者来说增加了适配和优化的难度。
  3. 用户界面的差异性:Android系统允许设备制造商自定义用户界面,这导致不同设备上的用户界面可能存在差异。开发者需要确保他们的应用程序在各种不同的用户界面上保持一致的外观和功能。

我们将这种由于系统版本、设备及用户界面不同带来的不同表现称之为Android系统的碎片化表现(是不是很形象)。Android系统的碎片化是Android生态系统的特点之一,也是Android系统发展中的一大挑战。为了解决这一问题,谷歌和手机厂商也一直在不断努力,推出更多的统一标准和规范,以提高Android系统的流畅性和用户体验。

群魔乱舞的推送系统

我们都知道苹果的推送系统:Apple Push Notification Service(苹果推送通知服务),简称APNS。这是一种云端推送技术,用于向iOS、macOS以及watchOS上向用户发送推送通知和消息。苹果设备用户使用应用接收推送消息完全依赖该服务。

举个例子🌰,一条微信消息经由APNS推送到你的iPhone上大概是这么个流程:

从上图可以看到,微信消息并不是直接由微信服务器发送到你的微信app上的,需借助APNS统一管理并转发。这么做的目的,就是为了在App离线场景(App被完全关闭)下,应用依旧能够正常收取到推送消息。这也是大多数人抱怨的iOS微信消息接收由延迟的原因。

同样,出于推送消息的安全性、稳定性及性能考虑,业界主流的推送方案也基本都是如此流程。

评价推送服务的标准往往采用以下4点:

  • Save安全:保障推送消息的安全
  • Stable稳定:推送机制足够稳定
  • Save节省:节省服务器及客户端负载
  • Slim体积小:推送服务本身的体积要尽量小

从以上4个角度来看,苹果的APNS无疑是一套合格的推送方案(除了偶尔抽风无法及时收到推送消息),事实上对于苹果设备,开发者也只能选择这套方案,别无其它选择(感叹苹果对于自家生态强大的把控力)。

那Android系统呢?

事实上,作为Android系统的持有者,Google也有一套自己的消息推送机制,叫 Firebase Cloud Messaging(Firebase云消息),简称FCM。毫无疑问,这同样也是一套可靠的推送方案。理想情况下,Android开发者只需像苹果开发者接入APNS那样接入FCM,就可以实现稳定的消息推送。然而事实是残酷的...

受限于种种原因,谷歌服务进入不了国内市场,作为依赖谷歌服务的FCM自然也在国内使用不了。然而消息推送对于用户来说,又是一个高频且肥肠重要‼️的机制。试想,如果一款手机无法正常接受微信消息,你也一定不会购买吧?

怎么办呢?Android手机该卖还是要卖,于是像小米、vivo、华为、oppo等一众国内的手机厂商纷纷自研了消息推送服务用以替代FCM,像小米的小米推送、华为的华为推送等等等等...除了厂商的推送服务,还有一些第三方也提供推送服务,像腾讯的信鸽、阿里的友盟、个推、极光推送等等...我们统称之为推送平台。

推送平台多了衍生出来的弊端也就多了。推送系统有一个很重要的指标叫做推送到达率,是指发送的推送消息成功到达目标用户设备的比例。通常,推送到达率可以使用以下公式计算:

推送到达率 = (成功到达的推送数 / 发送的推送数) * 100%

其中,成功到达的推送数是指发送的推送消息成功到达目标用户设备的数量,发送的推送数是指发送的总推送消息数量。

举个例子,假设你发送了100个推送消息,其中有90个成功到达了用户设备,那么推送到达率可以计算为:

推送到达率 = (90 / 100) * 100% = 90%

这意味着你的推送消息有90%成功到达了目标用户设备。

为了提升推送到达率,就必须接入对应厂家的推送服务,否则压根收不到。所以Android APP在诞生之初基本就要集成小米推送、华为推送等不同国内手机厂商的推送系统 ------ 他们本质上和FCM没有什么不同,可以简单理解为不同手机厂商自己的FCM。于是,为了用户能够正常收取推送消息,市面上大多数Android应用从诞生之初就集成了各种各样的推送系统 ------ 注意,这样的做法对用户和开发者来说,都是一种非常糟糕的体验。

对于用户本身,其实只需要一套厂商的推送系统就好了 ------ 这很好理解,用户用小米手机,就只需要小米推送就好,并不需要华为推送、OPPO推送...但是APP开发时,并不知道用户会使用什么品牌的Android手机(渠道包例外),所以只能一股脑的塞入各种各样的推送系统,用户只能被动接受这一臃肿且冗余的设定...

对于开发者来说,缺少了Google的限制和规范,各家的推送平台文档、使用方法层次不齐,开发者需要耗费大量精力去兼容不同的推送平台,说多了都是泪...

同时,一些无良推送平台为了所谓的推送到达率,无所不用其极,研究出了各种各样的黑科技,最典型的例如APP的链式启动,我愿称之为媲美摇一摇跳转广告的发明,这严重影响了Android系统的使用体验,早期的Android系统卡的一大半责任都归咎于此。

何谓APP链式启动,举个例子,用户的手机有应用A、B、C、D、F... A和F使用同一个无良推送平台,及时用户手动关掉了应用A,当用户使用应用F时,推送平台为了应用A的推送到达率,会在后台偷摸启动使用了该推送系统的应用A ------ 这显然违反了用户的使用初衷,同时家具了系统资源的使用,严重影响系统的流畅度,间接给用户留下了"卡"的印象。

哎,国内Android开发者苦推送久矣!

混乱的文件管理

Android设备的存储空间大致可以分三个部分:

  • 内部存储空间

每个应用都有自己独属的目录,和其他应用完全隔离,我们称之为内部存储空间,应用访问自身的内部存储空间时,无需申请任何权限,这部分存储空间随应用卸载会自动删除。

  • 外部存储空间

外部存储空间分为两部分,一部分和上面的内部存储空间作用完全一致,也是应用自己独属,其他应用无法访问,使用无需任何权限,随应用卸载删除,我们称这部分为私有空间;与之相反的另一部分称之为公共空间,顾名思义,这部分存储空间为所有应用共享,应用访问需经过用户授权,应用卸载后这部分内容也不会随之删除。

  • 系统存储空间

存放Android系统和一些系统相关文件的空间,无法直接访问。

忽略系统存储空间,开发者通常关注的为内部存储空间和外部存储空间。正常情况来讲,除了用户手动保存的照片等相关文件外,其他应用本身运行产生的文件理应存放于内部存储空间或外部存储空间中的私有空间部分,随App的卸载自动删除 ------ 这很合理,但不是所有App都是这么合理的做的。

Android 10之前,Android系统的文件管理系统缺乏有效的约束,应用开发者可以将文件随意存放在任何位置,这导致了用户的文件系统碎片化相当严重,用户卸载了App,对应的文件也不会自动删除 ------ 即使这些文件已经完全没有任何用处,久而久之,用户的存储空间被挤压的越来越小,严重影响用户的体验,直呼Android真是太了!

开发者适配的痛

我们来看一段代码:

java 复制代码
@TargetApi(19)
public static void translucent(Window window, @ColorInt int colorOn5x) {
	if (!supportTranslucent()) {
		// 版本小于4.4,绝对不考虑沉浸式
		return;
	}

	if (QMUINotchHelper.isNotchOfficialSupport()) {
		handleDisplayCutoutMode(window);
	}

	if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
		// 小米 Android 6.0 ,开发版 7.7.13 及以后版本设置黑色字体又需要 clear FLAG_TRANSLUCENT_STATUS, 因此还原为官方模式
		if (QMUIDeviceHelper.isFlymeLowerThan(8) || (QMUIDeviceHelper.isMIUI() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M)) {
			window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
							WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
			return;
		}
	}

	int systemUiVisibility = window.getDecorView().getSystemUiVisibility();
	systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
	window.getDecorView().setSystemUiVisibility(systemUiVisibility);
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
		// android 6以后可以改状态栏字体颜色,因此可以自行设置为透明
		window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
		window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
		window.setStatusBarColor(Color.TRANSPARENT);
	} else {
		// android 5不能修改状态栏字体颜色,因此直接用FLAG_TRANSLUCENT_STATUS,nexus表现为半透明
		// 魅族和小米的表现如何?
		// update: 部分手机运用FLAG_TRANSLUCENT_STATUS时背景不是半透明而是没有背景了。。。。。
		//                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

		// 采取setStatusBarColor的方式,部分机型不支持,那就纯黑了,保证状态栏图标可见
		window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
		window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
		window.setStatusBarColor(colorOn5x);
	}
}

这是 QMUI 中用以实现沉浸式状态栏的代码,从代码的注释中我们也能明显感觉出Android开发者适配的心酸:除了要适配不同Android系统间的差异,还要兼顾国内各种各样国产ROM系统的差异...

以小见大,相信各位能体会Android开发者的心累程度...于是,Android开发者们,天天就沉浸在于适配斗智斗勇中 ------ 这本不该如此。

拿什么拯救你?我的Android手机

难不成Android手机现在还是会越来越卡么?没救了?

非也非也,自Android系统发布以来,Google就一直致力于提升Android系统的安全性,加强用户的隐私保护,优化系统的流畅性和易用性。不同Android系统版本在安全性和用户体验方面都进行了持续改进。以下是一些主要的改进点:

  1. Scoped Storage 分区存储(Android 10+): 引入分区存储机制,限制应用对外部存储的访问权限,提高用户数据的隐私保护,解决Android系统此前混乱不堪的文件管理机制。
  2. 动态访问时权限机制(Android 6+): 在较新的Android版本中,用户可以更精细地控制应用对设备权限的访问,提高了用户对隐私的控制能力。
  3. 多任务处理改进: Android 7引入了分屏模式,允许用户同时在屏幕上显示两个应用程序,提升了多任务处理的效率。
  4. ...

总结

同时,国内的手机厂商也在针对各种流氓APP的各种流氓行为不断发力,小米系统MIUI 12 后提供的照明弹功能、华为限制APP互相唤起等,现在Android手机的体验早已今非昔比。

总的来说,随着Android系统版本的更新,Android设备在安全性、隐私保护和用户友好性方面不断进步,用户的安全性和体验方面也一直都是处于持续改进提升中。

相关推荐
JavaNoober4 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿5 小时前
关于ObjectAnimator
android
zhangphil6 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
FinClip7 小时前
政务App如何真正成为便民好帮手?
app
火柴就是我7 小时前
从头写一个自己的app
android·前端·flutter
lichong9518 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013848 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我8 小时前
NekoBoxForAndroid 编译libcore.aar
android
Kaede610 小时前
MySQL中如何使用命令行修改root密码
android·mysql·adb
明君8799711 小时前
Flutter 图纸标注功能的实现:踩坑与架构设计
android·ios