当前位置:首页 > 经验 >

安卓手机怎么降低抖音版本(安卓手机抖音怎么才能不自动更新)

来源:原点资讯(www.yd166.com)时间:2022-10-27 15:37:14作者:YD166手机阅读>>

多实例问题

1、内部启动多实例的问题

使用 singletop 虽然能够解决 home 出去再次进入无法回到之前页面的问题,但是随之而来的是 MainActivity 多实例的问题。在抖音的逻辑中存在一些与 MainActivity 生命周期强关联的逻辑,如果 MainActivity 存在多个实例,这部分逻辑将会受到影响,同时多个 MainActivity 的实现,也会导致我们不必要的资源开销,与预期是不符的,因此我们希望能够解决这个问题。

针对这个问题我们的解决方案是,对于应用内所有启动 MainActivity 的 Intent 增加 FLAG_ACTIVITY_NEW_TASK 与 FLAG_ACTIVITY_CLEAR_TOP 的 flag,以实现类似于 singletask 的 clear top 的特性。

使用 FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP 的方案,我们基本能够解决内部启动 MainActivity 多实例的问题,但是实际测试过程中,我们发现在部分系统上,即使实现了 clear top 的特性,依然存在多实例的问题。

经过分析,我们发现在这部分系统上,即使通过 activity-alias targetActivity 方式将 SplashActivity 指向了 MainActivity,但是在 AMS 侧它仍然认为启动的是 SplashActivity,后续再启动 MainActivity 时会认为之前是不存在 MainActivity 的,因此会再次启动一个 MainActivity。

针对这个问题我们的解决方案是,修改启动 MainActivity Intent 的 Component 信息,将其改从 MainActivity 改为 SplashActivity,这样我们就彻底解决了内部启动 MainActivity 导致的多实例的问题。

安卓手机怎么降低抖音版本,安卓手机抖音怎么才能不自动更新(9)

为了尽可能少的侵入业务,同时也防止后续迭代再出现内部启动导致 MainActivity 问题,我们对 Context startActivity 的调用进行了插桩。对于启动 MainActivity 的调用,在完成向 Intent 中添加 flag 和替换 Component 信息后再调用原有实现。之所以选择插桩方式实现,是因为抖音的代码结构比较复杂,存在多个基类 Activity,且部分基类 Activity 无法直接修改到代码。对于没有这方面问题的业务,可以通过重写基类 Activtity 及 Application 的 startActivity 方法的方式实现。

2、外部启动多实例问题

以上解决 MainActivity 多实例的方案,是建立在启动 Activity 之前去修改待启动 Activity 的 Intent 的方式实现的,这种方式对于应用外部启动 MainActivity 导致的 MainActivity 多实例的问题显然是无法解决的。那么针对外部启动 MainActivity 导致的多实例问题,我们是否有其他解决方案呢?

我们先回到解决 MainActivity 多实例问题的出发点。之所以要避免 MainActivity 多实例,是为了防止同时出现多个 MainActivity 对象,出现不符合预期的 MainActivity 生命周期的执行。因此只要确保不会同时出现多个 MainActivity 对象,一样可以解决 MainActivity 多实例问题。

避免同时出现多个 MainActivity 对象,我们首先需要知道当前是否已经存在 MainActivity 对象,解决这个问题的思路比较简单,我们可以去监听 Activity 的生命周期,在 MainActivity 的 onCreate 和 onDestroy 中分别去增加减少 MainActivity 的实例数。如果 MainActivity 实例数为 0 则认为当前不存在 MainActivity 对象。

解决了 MainActivity 对象数统计的问题,接下来我们就需要让 MainActivity 同时存在的对象数永远保持在 1 个以下。要解决这个问题我们需要回顾一下 Activity 的启动流程,启动一个 Activity 首先会经过 AMS,AMS 会再调用到 Activity 所在的进程,在 Activity 所在的进程会经过主线程的 Handler post 到主线程,然后通过 Instrumentation 去创建 Activity 对象,以及执行后续的生命周期。对于外部启动 MainActivity ,我们能够控制的是从 AMS 回到进程之后的部分,这里可以选择以 Instrumentation 的 newActivity 作为入口。

安卓手机怎么降低抖音版本,安卓手机抖音怎么才能不自动更新(10)

具体来说我们的优化方案如下:

  1. 继承 Instrumentation 实现一个自定义的 Instrumentaion 类,以代理转发方式重写里面的所有方法;
  2. 反射获取 ActivityThread 中 Instrumentaion 对象,并以其为参数创建一个自定义的 Instrumentaion 对象,通过反射方式用自定义的 Instrumentaion 对象替换 ActivityThread 原有的 Instrumentaion;
  3. 在自定义 Instrumentaion 类的 newActivity 方法中,进行判断当前待创建的 Activity 是否为 MainActivity,如果不是 MainActivity 或者当前不存在 MainActivity 对象,则调用原有实现,否则替换其 className 参数将其指向一个空的 Activity,以创建一个空的 Activity;
  4. 在这个空的 Activity 的 onCreate 中 finish 掉自己,同时通过一个添加了 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TOP flag 的 Intent 去启动一下 SplashActivity。

安卓手机怎么降低抖音版本,安卓手机抖音怎么才能不自动更新(11)

需要注意的是我们这里 hook Instrumentaion 的实现方案,在高版本的 Android 系统上我们也可以以 AppComponentFactory instantiateActivity 的方式替换。

1.4.2 反序列化优化

抖音 Activity 阶段另一个典型的优化是反序列化的优化——在抖音使用过程中会在本地序列化一部分数据,在启动过程中需要对这部分数据进行反序列化,这个过程会对抖音的启动速度造成影响。在之前的优化过程中,我们从业务层面对 block 逻辑进行了异步化、快照化等 case by case 的优化,取得了不错的效果,但是这样的方式维护起来比较麻烦,迭代过程也经常出现劣化,因此我们尝试以正面优化反序列化的方式进行优化。

抖音启动阶段的反序列化问题具体来说就是 Gson 数据解析耗时问题,Gson 是 Google 推出的一个 json 解析库,其具有接入成本低、使用便捷、功能扩展性良好等优点,但是其也有一个比较明显的弱点,那就是对于它在进行某个 Model 的首次解析时会比较耗时,并且随着 Model 复杂程度的增加,其耗时会不断膨胀。

Gson 的首次解析耗时与它的实现方案有关,在 Gson 的数据解析过程中有一个非常重要的角色,那就是 TypeAdapter,对于每一个待解析的对象的 Class,Gson 会首先为其生成一个 TypeAdapter,然后利用这个 TypeAdapter 进行解析,Gson 默认的解析方案采用的是 ReflectiveTypeAdapterFactory 创建的 TypeAdapter 的,其创建与解析过程中涉及到大量的反射调用,具体流程为:

  1. 首先通过反射获取待解析对象的所有 Field,并逐个读取去读取它们的注解,生成一个从 serializeName 到 Filed 映射 map;
  2. 解析过程中,通过读取到的 serializeName,到生成的 map 中找到对应的 Filed 信息,然后根据 Filed 的数据类型采用特定类型的方式进行解析,然后通过反射方式进行赋值。

因此对于 Gson 解析耗时优化的核心就是减少反射,这里具体介绍一下抖音中使用到的一些优化方案。

自定义 TypeAdapter 优化

通过对 Gson 的源码分析,我们知道 Gson 的解析采用的是责任链的形式,如果在 ReflectiveTypeAdapterFactory 之前已经有 TypeAdapterFactory 能够处理某个 Class,那么它是不会执行到 ReflectiveTypeAdapterFactory 的,而 Gson 框架又是支持注入自定义的 TypeAdapterFactory 的,因此我们的一种优化方案就是注入一个自定义的 TypeAdapterFactory 去优化这个解析过程。

这个自定义 TypeAdapterFactory 会在编译期为每个待优化的 Class 生成一个自定义的 TypeAdapter,在这个 TypeAdapter 中会为 Class 的每个字段生成相关的解析代码,以达到避免反射的目的。

安卓手机怎么降低抖音版本,安卓手机抖音怎么才能不自动更新(12)

栏目热文

抖音怎么恢复上一个版本(找回自己的抖音)

抖音怎么恢复上一个版本(找回自己的抖音)

编辑导语:随着业务重心的变化、用户需求的更迭等,产品往往会进行多次迭代优化,而非一成不变。而抖快作为拥有广大用户群体的互...

2022-10-27 15:32:01查看全文 >>

抖音怎样恢复到旧版本(抖音旧版本如何恢复)

抖音怎样恢复到旧版本(抖音旧版本如何恢复)

大家好,我是曾努力摆脱短视频,最终妥协的鸭鸭要说这年头有啥能让鸭:为它痴为它狂为它框框撞大墙为它哭为它累为它哗哗掉眼泪那...

2022-10-27 15:38:03查看全文 >>

苹果抖音版本怎么更新(苹果系统怎么更新抖音最新版本)

苹果抖音版本怎么更新(苹果系统怎么更新抖音最新版本)

越来越多玩家逐步在本地生活赛道上加码,比如抖音去年的试点自营“心动外卖”、再到今年和饿了么的官宣合作,在本地生活业务上,...

2022-10-27 15:53:46查看全文 >>

形容玉石独一无二的词(关于玉石的好词)

形容玉石独一无二的词(关于玉石的好词)

玉石的种类很多,有的是纯色的,有的是飘花的,有的是带有独特花纹。这一系列的特征都是源于大自然造化,每一块玉石都是独一无二...

2022-10-27 15:31:41查看全文 >>

形容和田玉石的优美句子(和田玉优美句子)

形容和田玉石的优美句子(和田玉优美句子)

“温润如玉”常被世人来形容和田玉的温润,细腻温润也是鉴别和田玉的主要依据之一。那么,和田玉为什么会有“油脂感”?和田玉的...

2022-10-27 15:40:35查看全文 >>

抖音版本太高怎样降到低版本(抖音版本太低怎么操作)

抖音版本太高怎样降到低版本(抖音版本太低怎么操作)

相信大家坐公交、地铁的时候,肯定遇到过有人抖音外放很大声的情况,这时候要么戴上降噪耳机能隔绝点噪音,要么就是远离噪声源。...

2022-10-27 16:11:52查看全文 >>

抖音如何恢复旧版本(抖音怎么恢复到以前版本)

抖音如何恢复旧版本(抖音怎么恢复到以前版本)

使用抖音刷短视频时,突然需要更新系统,很多小伙伴都表示不需要自动更新功能,实际上这是可以关闭的。今天小编就带大家看下本期...

2022-10-27 15:38:08查看全文 >>

抖音怎么退一个版本(抖音更新后怎么返回以前的版本)

抖音怎么退一个版本(抖音更新后怎么返回以前的版本)

编辑导语:近日,抖音开始大力布局电商,抖音正在内测多个商城入口,抖音电商的出现或将给行业带来哪些改变?作者从正反两个方面...

2022-10-27 15:43:13查看全文 >>

抖音如何降低版本(抖音版本过低怎么解决)

抖音如何降低版本(抖音版本过低怎么解决)

抖音发布的视频可以通过作品中的删除功能来删除,删除的渠道有两种:1、手机端;2、网页。怎么删除1、手机端使用手机抖音删除...

2022-10-27 16:08:57查看全文 >>

抖音怎么降低到老版本(抖音版本如何降低)

抖音怎么降低到老版本(抖音版本如何降低)

以抖音 12.9.0版本为例,修改抖音账号的方法大致有五个步骤,具体的操作步骤如下所示:1、首先打开手机,然后点击打开手...

2022-10-27 15:59:07查看全文 >>

文档排行