目录

前言 1.1

iOS逆向YouTube概览 1.2

逆向YouTube过程 1.3

砸壳ipa 1.3.1

安装ipa 1.3.1.1

静态分析 1.3.2

导出头文件 1.3.2.1

IDA分析代码逻辑 1.3.2.2

动态调试 1.3.3

分析界面元素 1.3.3.1

Reveal 1.3.3.1.1

Cycript 1.3.3.1.2

调试代码逻辑 1.3.3.2

Xcode+MonkeyDev 1.3.3.2.1

重复上述过程 1.3.4

期间涉及 1.3.5

恢复符号表 1.3.5.1

Charles抓包 1.3.5.2

逆向YouTube产出 1.4

YouTube的app内部逻辑 1.4.1

很多类的具体实现 1.4.1.1

返回数据 1.4.1.2

YouTube广告过滤相关 1.4.2

hook的类 1.4.2.1

IDA伪代码 1.4.2.2

函数调用逻辑 1.4.2.3

常见url 1.4.2.4

逆向YouTube总结 1.5

子教程 1.6

附录 1.7

参考资料 1.7.1

前言

iOS逆向开发：YouTube逆向

最新版本：v0.9

更新时间：20221106

简介

以YouTube逆向介绍典型的iOS逆向的流程。先是YouTube逆向概述，再是详细介绍iOS的YouTube逆向的详细过程，包括砸壳ipa以及安装ipa、静态分析的导出头文件、IDA分析代码逻辑、动态调试的分析界面元素和MonkeyDev调试，其中界面分析用Reveal、Cycript；MonkeyDev调试典型逻辑是，猜测类和函数、写hook代码、加断点调试；期间涉及到恢复符号表、Charles抓包；然后介绍逆向的产出和相关总结；产出包括app内部逻辑和广告过滤相关内容；以及相关子教程。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

crifan/ios_re_youtube_reverse: iOS逆向开发：YouTube逆向

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

iOS逆向开发：YouTube逆向 book.crifan.org

iOS逆向开发：YouTube逆向 crifan.github.io

离线下载阅读

iOS逆向开发：YouTube逆向 PDF

iOS逆向开发：YouTube逆向 ePub

iOS逆向开发：YouTube逆向 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我 admin 艾特 crifan.com，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我crifan有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

其他

作者的其他电子书

本人crifan还写了其他150+本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

关于作者

关于作者更多介绍，详见：

关于CrifanLi李茂 – 在路上

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-06 17:57:34

iOS逆向YouTube概览

iOS逆向YouTube概览

此处去以iOS逆向YouTube的app为例，介绍典型的iOS逆向的过程。

此处逆向YouTube的目的暂且定为，尝试搞懂YouTube广告过滤的可能性和底层涉及相关机制。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:59:12

逆向YouTube过程

逆向YouTube过程

下面介绍，如何进行iOS逆向YouTube的过程。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:57:00

砸壳ipa

砸壳ipa

TODO：

把下面多个帖子内容整理过来

在iPhone越狱后，接着去逆向iOS的YouTube。

先准备好砸壳后的ipa。

两种可能=来源：

别人的

别人给的

网上找的

【部分解决】下载16.36.4旧版本YouTube的ipa

【未解决】寻找和下载16.36.4或更低版本的YouTube的ipa

自己砸壳得到的

砸壳YouTube得到ipa

此处主要介绍后者：

自己从AppStore中安装YouTube，再砸壳出ipa

先去AppStore中安装YouTube

【记录】国行越狱iPhone安装YouTube

【无需解决】国内越狱iPhone如何翻墙上外网使用YouTube

再去砸壳

【已解决】Mac中用frida-ios-dump去砸壳出YouTube的ipa文件

【已解决】frida-ios-dump砸壳YouTube但是无法启动应用

安装ipa到iPhone，确保YouTube正常使用

说明：动态调试才需要，一般静态分析，不需要

涉及帖子

【已解决】用Filza安装YouTube的ipa确认能正常运行

【已解决】iPhone中查看已安装app的包名

【记录】测试16.44.4旧版YouTube的ipa广告拦截是否也时间重置

其他相关

从AppStore中找历史版本

【未解决】Cydia中安装AppStore++寻找YouTube的16.36.4的旧版本

【未解决】试试CokePokes的原版AppStore++能否安装旧版YouTube

【已解决】安装CokePokes的原版AppStore++

【未解决】用Cydia致尚官方源安装的AppStore++安装旧版YouTube

【未解决】AppStore++用Manual Install Advanced去尝试安装旧版YouTube

【已解决】Cydia中安装应用降级AppStore++插件

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:01:06

安装ipa

安装ipa

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:52:10

静态分析

静态分析

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:52:34

导出头文件

导出头文件

TODO：

【记录】class-dump导出头文件：YouTube的动态库二进制Module_Framework

【未解决】class-dump导出YouTube头文件报错：Unknown load command 0x00000032

【已解决】Mac中用class-dump导出YouTube头文件

用class-dump导出YouTube的头文件

此处YouTube有2个二进制：

YouTube

Module_Framework

所以要分别导出对应的头文件。

导出后的效果：

2.7万多个头文件

3800多个头文件

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:27:04

IDA分析代码逻辑

IDA分析代码逻辑

主要涉及，分别用IDA加载和分析，YouTube的2个二进制的文件：

YouTube

Module_Framework

然后分析其代码逻辑。

其中最核心用法是，找到可以的要研究的类的函数后，去Functions窗口中，通过函数名搜索函数，找到对应汇编代码，再F5查看反编译后的伪代码，尝试搞懂代码的具体逻辑。

特殊：导出IDA全部伪代码

为了更好的，全局去搜一些类、变量、字符串等，用于iOS逆向研究YouTube的逻辑

所以考虑去导出全部的IDA伪代码：

TODO：

【未解决】IDA图形界面GUI模式使用ida-batch_decompile批量导出全部YouTube的Module_Framework全部伪代码

【未解决】用IDA的命令行文本模式使用ida-batch_decompile批量导出全部YouTube的Module_Framework全部伪代码

【未解决】用插件导出IDA的YouTube的Module_Framework的全部反汇编的源码伪代码

【记录】IDA中用idat64的Batch Mode尝试反编译导出全部源代码：试试二进制小点的

【已解决】IDA中用idat64的Batch Mode尝试反编译导出YouTube的Module_Framework全部代码伪代码

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:54:02

动态调试

动态调试

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:54:29

分析界面元素

分析界面元素

动态调试 常会涉及：分析YouTube的界面元素

常用工具：

Reveal

Cycript

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:51:21

Reveal

Reveal

TODO：

Reveal

【已解决】Mac中下载和安装Reveal

【已解决】MonkeyDev中如何使用Reveal调试YouTube广告页面元素

【已解决】Reveal报错：The app is linked against an older version of the Reveal library

【记录】通过Reveal查看YouTube广告页面元素

【已解决】Mac中Reveal无法启动

【间接解决】Reveal加载页面始终无法完成无法刷新

【记录】XCode和Reveal配合调试YouTube的广告相关逻辑

【记录】通过Reveal查看页面元素找YouTube广告相关类

【记录】用Reveal查看YouTube跳过广告相关页面的元素和类

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:58:58

Cycript

Cycript

TODO：

Cycript

【已解决】用MonkeyDev中Cycript去调试YouTube的UI页面的元素

【记录】Mac中用csrutil关闭SIP

【未解决】install_name_tool

【记录】Cycript输出的YouTube的当前页面的类

【已解决】Mac中运行Cycript报错：dyld Library not loaded libruby.2.0.0.dylib

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:53:22

调试代码逻辑

调试代码逻辑

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:57:23

Xcode+MonkeyDev

Xcode+MonkeyDev

MonkeyDev调试YouTube的代码逻辑：

TODO：

【记录】恢复自己Mac的iOS逆向开发环境

【已解决】Xcode调试越狱iPhone6中的YouTube

【已解决】XCode+MonkeyDev动态调试YouTube的ipa

【记录】研究YouTube广告拦截导致视频从头播放的原因：XCode+MonkeyDev动态调试

【记录】恢复iOS逆向Xcode调试YouTube的开发环境

期间涉及：写hook代码，加断点调试：

找到一些可疑的，需要调试确认是否被调用到的类，则就是：去写hook代码，加断点，去调试看看是否触发：

如果触发：说明推测和判断是对的

如果没触发：说明推测出错

再去找其他可疑的类，再继续去写hook加断点去调试

涉及的过程大概是：

【未解决】研究iPhone中YouTube的app播放视频中间广告导致从头播放

【已解决】iOS的Theos的Logos的hook代码中获取当前YouTube类YTWatchController的属性值activeVideoID

【记录】XCode的lldb调试YouTube的类：YTWatchController

【已解决】XCode+MonkeyDev动态调试YouTube：让程序停止在出现广告的页面

【基本解决】XCode的lldb中输出YouTube类MDXSession实例的属性值currentVideoID

【记录】给MonkeyDev的YouTube的hook中加上通用log代码

【已解决】XCode的lldb调试输出YouTube类YTWatchController实例的属性值和调用函数

【记录】XCode+MonkeyDev动态调试YouTube：寻找和广告相关的类和逻辑

【记录】XCode中Pause暂停去找YouTube的广告相关的类

【记录】研究YouTube广告逻辑：MDXPlaybackController的didPressSkipAd

【记录】研究YouTube广告逻辑：IDA中搜skipAd

【未解决】YouTube动态调试：写hook代码监控视频播放时间被重置变成0

以及后续换其他思路

【记录】从.googlevideo.com入手找YouTube广告视频相关逻辑

【记录】研究YouTube函数：resetWatchTime

【记录】XCode+MonkeyDev动态调试YouTube：寻找和广告相关的类和逻辑

【未解决】研究YouTube逻辑：找到最初的广告视频请求

【未解决】研究YouTube逻辑：找到最初广告视频请求的响应

【已解决】研究YouTube逻辑：找到带ctier=A的response和error出错的地方

【已解决】研究YouTube逻辑：ctier=A时的 request和response的函数调用顺序

【未解决】研究YouTube逻辑：寻找搞懂广告视频ID获取的大流程

【已解决】研究YouTube逻辑：抓包iOS版YouTube的广告视频ID产生的大流程

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:58:08

重复上述过程

重复上述过程

对于普通的iOS逆向，就重复上述过程

对于此处，逆向YouTube来说，具体是：

静态分析

研究和搜索头文件中的类，找出可疑的类

YouTube_17.08.2_headers

header_ModuleFramework

headers_YouTube

研究导出的字符串等资源中，是否有我们要的内容

staticAnalysis

└── YouTube_17.08.2
    ├── Module_Framework
    │   ├── Module_Framework_nm.txt
    │   ├── Module_Framework_otool_l.txt
    │   ├── Module_Framework_otool_oV.txt
    │   └── Module_Framework_strings.txt
    ├── YouTube
    │   ├── YouTube_nm.txt
    │   ├── YouTube_otool_l.txt
    │   ├── YouTube_otool_oV.txt

动态调试

分析界面元素

从界面元素入手，找到对应的类或父类

作为后续深入研究的切入点：找类的相关头文件

调试代码逻辑

针对可疑的类和函数，写hook代码，加断点调试

期间涉及

加过滤条件

比如找到了http的request和response的类，还要继续加过滤条件

过滤出我们所关心的类，比如initplayback，videoplayback等url

https://xxx.googlevideo.com/initplayback?xxx

https://xxx.googlevideo.com/videoplayback?xxx

log太多了，如何优化减少log

TODO：

【已解决】研究YouTube逻辑：log日志打印优化每隔几次才输出

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:51:52

期间涉及

期间涉及

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:52:11

恢复符号表

恢复符号表

为了动态调试 常会涉及：恢复符号表

TODO：

【已解决】restore-symbol恢复YouTube的Block符号表报错：Address not found in the image

【记录】YouTube恢复符号表后Xcode调试效果

【已解决】给YouTube恢复符号表方便Xcode调试

【记录】YouTube恢复符号表恢复出部分无效的symbol符号

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:59:36

Charles抓包

Charles抓包

期间涉及：iOS的app的抓包：

TODO：

【已解决】Mac用Charles抓包iPhone中YouTube视频过滤广告导致从头播放的数据包

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:53:21

逆向YouTube产出

逆向YouTube产出

此处整理出iOS逆向YouTube输出的相关结论。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:06:50

YouTube的app内部逻辑

YouTube的app内部逻辑

TODO：

网络请求

【整理】YouTube广告拦截从头播放视频：相关的网络请求和大概逻辑

网络协议

Cronet

【整理】Cronet相关源码和定义和具体实现

【已解决】YouTube中struct Cronet_UrlRequestCallback的具体定义实现

【已解决】iOS的YouTube中Cronet_UrlRequestCallback的OnFailed中cronet=10和quic协议关系

QUIC

【整理】YouTube相关：QUIC协议和源码

【整理】YouTube涉及到的Network、quic等Chromium相关源码

【整理】YouTube涉及到Chromium中Cronet相关源码和文档

YouTube视频格式

【整理】YouTube中视频相关信息：ISO Media file produced by Google Inc

【未解决】YouTube的response的data视频格式：ftyp=dash

【整理】YouTube逻辑：视频流格式代码

HTTP协议

【已解决】研究YouTube视频内容请求：Transfer-Encoding chunked

【整理】YouTube中Module_Framework函数对应关系 20220804

YouTube广告过滤规则

圈X

【记录】研究YouTube逻辑：验证最新圈X的规则能否拦截广告

【记录】pico中使用圈X最新规则的YouTube广告拦截效果

【记录】测试最新版过滤规则的iOS的YouTube的app中广告过滤效果

调试相关

【记录】Xcode+MonkeyDev动态调试YouTube：广告页面相关类

【记录】调试YouTube广告页面：调试相关数据

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:10:35

很多类的具体实现

很多类的具体实现

内部很多类的具体实现

SRLRegistry_sharedInstance

SRLRegistry_sharedInstance.coffee

(lldb) po 0x00000002839803c0
<SRLRegistry: 0x2839803c0>
Single bindings:
{
    "ELMByteStore_API" = "SRLImplementation<0x283690d50, instanceType: ELMByteStore, lifetime: 0, scopeType: 0, configuration: None>";
    "ELMJSModuleCache_API" = "SRLImplementation<0x2837f7d80, instanceType: ELMJSModuleCache, lifetime: 0, scopeType: 0, configuration: None>";
    "ELMResourceLoader_API" = "SRLImplementation<0x283710a50, instanceType: ELMResourceLoader, lifetime: 0, scopeType: 0, configuration: None>";
    "ELMRuntimeConfigFactory_API" = "SRLImplementation<0x283762f40, instanceType: YTELMRuntimeConfigFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "ELMStore_API" = "SRLImplementation<0x283690cf0, instanceType: YTELMStore, lifetime: 0, scopeType: 0, configuration: None>";
    "GHKY2021BugfixesService_API" = "SRLImplementation<0x28363c990, instanceType: GHKY2021Bugfixes, lifetime: 0, scopeType: 0, configuration: None>";
    "GIKAccountDeletionWipeoutManager_API" = "SRLImplementation<0x2837c9650, instanceType: GIKAccountDeletionWipeoutManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "GIKAccountSourceService_API" = "SRLImplementation<0x28376ca50, instanceType: GIKAccountSourceServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "GIKSSOAccountSourceService_API" = "SRLImplementation<0x28376cae0, instanceType: GIKSSOAccountSourceServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "GIKSSOBridgeService_API" = "SRLImplementation<0x28376cb10, instanceType: GIKSSOBridgeServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "GIKSharedLibraryService_API" = "SRLImplementation<0x28376ca80, instanceType: GIKSharedLibraryServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "HAMClock_API" = "SRLImplementation<0x283651f20, instanceType: HAMSystemClock, lifetime: 0, scopeType: 0, configuration: None>";
    "HAMDataLoadTaskObserver_API" = "SRLImplementation<0x2834811a0, instanceType: MLHAMDataLoadTaskObserverImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "HAMIdleTimer_API" = "SRLImplementation<0x2834a3420, instanceType: HAMIdleTimerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "HAMSystemNotifications_API" = "SRLImplementation<0x2834b3960, instanceType: YTSystemNotifications, lifetime: 0, scopeType: 0, configuration: None>";
    "IGDManager_API" = "SRLImplementation<0x283698030, instanceType: IGDManager, lifetime: 0, scopeType: 0, configuration: None>";
    "MDXConfig_API" = "SRLImplementation<0x283763660, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "MDXServices_API" = "SRLImplementation<0x283763810, instanceType: MDXRealServices, lifetime: 0, scopeType: 0, configuration: None>";
    "MLAVAssetDownloader_API" = "SRLImplementation<0x2836f2f70, instanceType: MLAVAssetDownloader, lifetime: 0, scopeType: 0, configuration: None>";
    "MLAudioSession_API" = "SRLImplementation<0x2834846c0, instanceType: MLAudioSession, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCDM_API" = "SRLImplementation<0x2834a5e30, instanceType: MLWidevineCDMImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCacheProvider_API" = "SRLImplementation<0x2834b2460, instanceType: MLDefaultCacheProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCaptionConfig_API" = "SRLImplementation<0x2834a9aa0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCaptionControllerFactory_API" = "SRLImplementation<0x2834a7d80, instanceType: MLDefaultCaptionControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCaptionDisplayControllerFactory_API" = "SRLImplementation<0x2834a39f0, instanceType: YTGLCaptionDisplayControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCaptionDisplaySettingsProvider_API" = "SRLImplementation<0x2834ac4e0, instanceType: MLDefaultCaptionDisplaySettingsProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLCaptionService_API" = "SRLImplementation<0x283682100, instanceType: MLDefaultCaptionService, lifetime: 0, scopeType: 0, configuration: None>";
    "MLClientInfoFiller_API" = "SRLImplementation<0x28348a190, instanceType: MLClientInfoFillerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLClockOffsetEstimator_API" = "SRLImplementation<0x2834b1440, instanceType: MLClockOffsetEstimator, lifetime: 0, scopeType: 0, configuration: None>";
    "MLDataPlanController_API" = "SRLImplementation<0x2836098f0, instanceType: MLDataPlanController, lifetime: 0, scopeType: 0, configuration: None>";
    "MLDefaultViewportSizeProvider_API" = "SRLImplementation<0x283482e50, instanceType: MLSingletonViewportSizeProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLHAMAudioEngineProvider_API" = "SRLImplementation<0x283487690, instanceType: MLHAMAudioEngineProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLHAMDataLoaderProvider_API" = "SRLImplementation<0x283608f90, instanceType: MLHAMDataLoaderProviderImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLInitialFormatSelectionConfig_API" = "SRLImplementation<0x28348a0d0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "MLInnerTubeContextDecorator_API" = "SRLImplementation<0x28360a400, instanceType: MLInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
    "MLLocalAVAssetBundleManager_API" = "SRLImplementation<0x2836f2df0, instanceType: MLLocalAVAssetBundleManager, lifetime: 0, scopeType: 0, configuration: None>";
    "MLMediaCapabilitiesProvider_API" = "SRLImplementation<0x28348a100, instanceType: MLMediaCapabilitiesProviderImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLNetworkStatsProvider_API" = "SRLImplementation<0x2835627f0, instanceType: MLNetworkStatsProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOfflineRepoFactory_API" = "SRLImplementation<0x2836f2ee0, instanceType: YTOfflineRepoFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOfflineTracklistCaptionProvider_API" = "SRLImplementation<0x2834a9ad0, instanceType: YTOfflineVideoCaptionsProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOfflineVideoDownloadController_API" = "SRLImplementation<0x2836f33f0, instanceType: MLOfflineVideoDownloadControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOnesieDataSaverConfig_API" = "SRLImplementation<0x283562910, instanceType: MLOnesieDataSaverConfigImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOnesieFetcherService_API" = "SRLImplementation<0x2834b1560, instanceType: MLOnesieFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOnesieHostProvider_API" = "SRLImplementation<0x283561380, instanceType: MLOnesieHostProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOnesieRequestFactory_API" = "SRLImplementation<0x2834b2e50, instanceType: MLOnesieRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "MLOnesieVideoDataProvider_API" = "SRLImplementation<0x2834a69a0, instanceType: MLOnesieVideoDataProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "MLPIPController_API" = "SRLImplementation<0x2835657a0, instanceType: MLPIPController, lifetime: 0, scopeType: 0, configuration: None>";
    "MLPlayerPool_API" = "SRLImplementation<0x283483a80, instanceType: MLPlayerPoolImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLPlayerViewFactory_API" = "SRLImplementation<0x283483ab0, instanceType: YTGLMediaPlayerViewFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "MLScreenCapturedStatus_API" = "SRLImplementation<0x2834a3630, instanceType: MLScreenCapturedStatusImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLStreamStoreConfig_API" = "SRLImplementation<0x283483b10, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "MLStreamStore_API" = "SRLImplementation<0x283483ae0, instanceType: MLStreamStore, lifetime: 0, scopeType: 0, configuration: None>";
    "MLTFLiteModelService_API" = "SRLImplementation<0x28360a8e0, instanceType: MLTFLiteModelService, lifetime: 0, scopeType: 0, configuration: None>";
    "MLTFLiteNetworkModel_API" = "SRLImplementation<0x283562700, instanceType: MLTFLiteNetworkModel, lifetime: 0, scopeType: 0, configuration: None>";
    "MLUserFeatures_API" = "SRLImplementation<0x2834b2df0, instanceType: MLUserFeaturesImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "MLVideoDownloadTaskDelegate_API" = "SRLImplementation<0x2836f2e20, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
    "MLVideoDownloaderDelegate_API" = "SRLImplementation<0x2836f2c40, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
    "MLVideoDownloaderMediaDownloaderShim_API" = "SRLImplementation<0x2836f2e50, instanceType: MLVideoDownloaderMediaDownloaderShim, lifetime: 0, scopeType: 0, configuration: None>";
    "MLVideoDownloader_API" = "SRLImplementation<0x2836f2d90, instanceType: MLVideoDownloader, lifetime: 0, scopeType: 0, configuration: None>";
    "PHTPhenotypeFlagsRegistryService_API" = "SRLImplementation<0x28363c9c0, instanceType: PHTPhenotypeFlagsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "RCHServiceConfigurationProvider_API" = "SRLImplementation<0x283682af0, instanceType: YTRCHServiceConfigurationProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "RCHService_API" = "SRLImplementation<0x283682ac0, instanceType: RCHServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "SSOConfigurationProvider_API" = "SRLImplementation<0x2837c9e60, instanceType: YTSSOServiceFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "SSOServiceContainer_API" = "SRLImplementation<0x28376d200, instanceType: SSOServiceContainerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "SSOService_API" = "SRLImplementation<0x2837c9e90, instanceType: SSOService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAccountLinkingMenuVisibilityHandler_API" = "SRLImplementation<0x282b9b7e0, instanceType: YTAccountLinkingMenuVisibilityHandler, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAccountScopedCommandRegistrar_API" = "SRLImplementation<0x283574600, instanceType: YTAccountScopedCommandRegistrar, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedCommandRouter_API" = "SRLImplementation<0x2835725b0, instanceType: YTAccountScopedCommandRouter, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedInnerTubeContextFactory_API" = "SRLImplementation<0x2834e9410, instanceType: YTAccountScopedInnerTubeContextFactory, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedInnerTubeRequestFactory_API" = "SRLImplementation<0x2834e91d0, instanceType: YTAccountScopedInnerTubeRequestFactory, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedInnerTubeRequestorFactory_API" = "SRLImplementation<0x2834e9260, instanceType: YTAccountScopedInnerTubeRequestorFactory, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedInnerTubeResponseCache_API" = "SRLImplementation<0x2834e91a0, instanceType: YTAccountScopedInnerTubeResponseCache, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAccountScopedInnerTubeStackConfiguration_API" = "SRLImplementation<0x2834e92f0, instanceType: YTAccountScopedInnerTubeStackConfiguration, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAccountScopedVisitorDataRequestDecorator_API" = "SRLImplementation<0x2834e9230, instanceType: YTAccountScopedVisitorDataRequestDecorator, lifetime: 0, scopeType: 1, configuration: None>";
    "YTActiveStateDescriptorSubControllerFactoryProtocol_API" = "SRLImplementation<0x28360b3c0, instanceType: YTCoreActiveStateDescriptorSubControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTActiveVideoNotifier_API" = "SRLImplementation<0x28376a160, instanceType: YTActiveVideoNotifier, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdBreakFetcherAPI_API" = "SRLImplementation<0x282bbb0f0, instanceType: YTAdBreakRendererFetcher, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdCuepointAPI_API" = "SRLImplementation<0x2834879f0, instanceType: YTAdCuepointEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdElementsCellAPIImpl_API" = "SRLImplementation<0x2837014d0, instanceType: YTAdElementsCellAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdElementsCellExternallyManagedSlotAdapter_API" = "SRLImplementation<0x28362a040, instanceType: YTAdElementsCellExternallyManagedSlotAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdInnerTubeConfig_API" = "SRLImplementation<0x283711680, instanceType: YTRealAdInnerTubeConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdInterruptAPI_API" = "SRLImplementation<0x282b88240, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdIntervalManagerTriggerAdapter_API" = "SRLImplementation<0x282b887e0, instanceType: YTAdIntervalManagerTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdIntervalManager_API" = "SRLImplementation<0x282bb8390, instanceType: YTAdIntervalManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdLoggingAPI_API" = "SRLImplementation<0x2834ae5b0, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdMacroExpanderProvider_API" = "SRLImplementation<0x283650570, instanceType: YTAdMacroExpanderProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowEventTriggerAdapter_API" = "SRLImplementation<0x28349be40, instanceType: YTAdsControlFlowEventTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowIDGenerator_API" = "SRLImplementation<0x28362a010, instanceType: YTAdsControlFlowIDGeneratorImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowManager_API" = "SRLImplementation<0x283487600, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowObservable_API" = "SRLImplementation<0x28349a2e0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowOpportunityReceivedCommandAPIListener_API" = "SRLImplementation<0x283629ec0, instanceType: YTCommandDrivenExternallyManagedSlotOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsControlFlowOpportunityReceivedCommandHandler_API" = "SRLImplementation<0x2836299e0, instanceType: YTAdsControlFlowOpportunityReceivedCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
    "YTAdsEventLoggingController_API" = "SRLImplementation<0x283629f20, instanceType: YTAdsEventLoggingControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsFrequencyCapProtocol_API" = "SRLImplementation<0x2834b0db0, instanceType: YTFrequencyCapTracker, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsPlaybackService_API" = "SRLImplementation<0x2834a2e50, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsPlayerServices_API" = "SRLImplementation<0x2834963a0, instanceType: YTRealAdsPlayerServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAdsSKOverlayService_API" = "SRLImplementation<0x28348f0f0, instanceType: YTAdsMainAppSKOverlayServiceImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAgeCapabilitiesService_API" = "SRLImplementation<0x283763510, instanceType: YTAgeCapabilitiesServiceImpl, lifetime: 0, scopeType: 4, configuration: None>";
    "YTAppBrowseSwipeLeftCommandProvider_API" = "SRLImplementation<0x2836bf300, instanceType: YTReelCameraCommandCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppConfig_API" = "SRLImplementation<0x28357f1e0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppFlowStateController_API" = "SRLImplementation<0x283681920, instanceType: YTAppFlowStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppHomeElementsRegistry_API" = "SRLImplementation<0x2836ea0a0, instanceType: YTAppHomeElementsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppMealbarPromoController_API" = "SRLImplementation<0x28369df20, instanceType: YTAppMealbarPromoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppOfflineContentRepairController_API" = "SRLImplementation<0x2836fd380, instanceType: YTAppOfflineContentRepairController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppOfflineResumeController_API" = "SRLImplementation<0x28349e340, instanceType: YTAppOfflineResumeController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppOfflineResumeSyncController_API" = "SRLImplementation<0x28349e4f0, instanceType: YTAppOfflineResumeSyncController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppOfflineVideoController_API" = "SRLImplementation<0x283480840, instanceType: YTAppOfflineVideoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppSettingsStore_API" = "SRLImplementation<0x2836feb80, instanceType: YTAppSettingsStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppStartupInstrumentationTransmitter_API" = "SRLImplementation<0x28356f0c0, instanceType: YTGELCSITransmitter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppStartupReasonController_API" = "SRLImplementation<0x283689680, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTAppThemeSettingPromoController_API" = "SRLImplementation<0x2836cc600, instanceType: YTAppThemeSettingPromoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppTransactionQueueController_API" = "SRLImplementation<0x28369e0d0, instanceType: YTAppTransactionQueueController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppUserDefaultsMigrator_API" = "SRLImplementation<0x283481c50, instanceType: YTAppUserDefaultsMigrator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAppViewController_API" = "SRLImplementation<0x283690c60, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAttestationChallengeService_API" = "SRLImplementation<0x283763570, instanceType: YTAttestationChallengeService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTAudioSession_API" = "SRLImplementation<0x2837cb660, instanceType: MLAudioSession, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBackAsStackManager_API" = "SRLImplementation<0x283698660, instanceType: YTBackAsStackManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBackgroundTasksController_API" = "SRLImplementation<0x2836cadc0, instanceType: YTAppBackgroundTasksController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBackgroundabilityPolicy_API" = "SRLImplementation<0x2834849c0, instanceType: YTBackgroundabilityPolicy, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBedtimeReminderController_API" = "SRLImplementation<0x2836ad6e0, instanceType: YTBedtimeReminderController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBelowPlayerCompanionRenderingAPIImpl_API" = "SRLImplementation<0x2828ad500, instanceType: YTBelowPlayerCompanionRenderingAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBelowPlayerImmersiveRenderingAPIImpl_API" = "SRLImplementation<0x2828ad530, instanceType: YTBelowPlayerImmersiveRenderingAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBelowPlayerImmersiveSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bcc450, instanceType: YTBelowPlayerImmersiveSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBelowPlayerSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bcc2a0, instanceType: YTBelowPlayerSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBlobStorageBlocking_API" = "SRLImplementation<0x2836b23a0, instanceType: YTPINDiskCacheBlobStorage, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBlobStorage_API" = "SRLImplementation<0x28360a340, instanceType: YTPINDiskCacheBlobStorage, lifetime: 0, scopeType: 0, configuration: None>";
    "YTBrowseService_API" = "SRLImplementation<0x283714000, instanceType: YTAppBrowseService, lifetime: 0, scopeType: 4, configuration: None>";
    "YTCTTelephonyNetworkInfo_API" = "SRLImplementation<0x2837f8690, instanceType: YTCTTelephonyNetworkInfoImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCastSessionController_API" = "SRLImplementation<0x282b9af10, instanceType: YTNoOpCastSessionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCellFactory_API" = "SRLImplementation<0x28361f030, instanceType: YTInnerTubeCellFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClearcutController_API" = "SRLImplementation<0x2837c8930, instanceType: YTClearcutController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClientEnvironment_API" = "SRLImplementation<0x2834ab090, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClientEventIdController_API" = "SRLImplementation<0x2837fce10, instanceType: YTClientEventIdController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClipController_API" = "SRLImplementation<0x282b82070, instanceType: YTClipController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClipsElementsRegistry_API" = "SRLImplementation<0x282b820d0, instanceType: YTClipsElementsRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTClockEntityTransformationTrigger_API" = "SRLImplementation<0x2836f1fb0, instanceType: YTClockEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTColdConfig_API" = "SRLImplementation<0x28379b5a0, instanceType: YTColdConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCollectionScrollTrackerSamplerGate_API" = "SRLImplementation<0x2836c6e50, instanceType: YTCollectionScrollTrackerSamplerGate, lifetime: 0, scopeType: 0, configuration: None>";
    "YTColorStyle_API" = "SRLImplementation<0x283767570, instanceType: YTAppColorStyle, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCommandRegistrar_API" = "SRLImplementation<0x283681b60, instanceType: YTCommandRegistrar, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCommandRouter_API" = "SRLImplementation<0x283763630, instanceType: YTCommandRouter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCompanionAdSectionControllerProvider_API" = "SRLImplementation<0x282bfaa60, instanceType: YTCompanionAdSectionControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTConfigService_API" = "SRLImplementation<0x28357edf0, instanceType: YTConfigService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTConnectionStatusController_API" = "SRLImplementation<0x283698930, instanceType: YTConnectionStatusController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTConsistencyTokenJarVolatileCache_API" = "SRLImplementation<0x283714240, instanceType: YTConsistencyTokenJarVolatileCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTContentPlaybackInfoAPI_API" = "SRLImplementation<0x283487ab0, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTContentVideoPlayerResponseSlotOpportunityAdapter_API" = "SRLImplementation<0x283487c30, instanceType: YTContentVideoPlayerResponseSlotOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCoreDataDelayedEventQueue_API" = "SRLImplementation<0x2837ef630, instanceType: YTCoreDataDelayedEventQueue, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashConfig_API" = "SRLImplementation<0x283689500, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashContextController_API" = "SRLImplementation<0x283689560, instanceType: YTCrashContextController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashContextProtocol_API" = "SRLImplementation<0x2837fcba0, instanceType: YTCrashContextController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashControllerDelegate_API" = "SRLImplementation<0x2836895c0, instanceType: YTCrashCountController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashController_API" = "SRLImplementation<0x2836894a0, instanceType: YTCrashController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashRestoreVideoControllerConfig_API" = "SRLImplementation<0x2836842a0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCrashRestoreVideoController_API" = "SRLImplementation<0x283684270, instanceType: YTCrashRestoreVideoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTCuepointOpportunityAdapter_API" = "SRLImplementation<0x283487960, instanceType: YTCuepointOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDAIAdsPlaybackLifecycleAPI_API" = "SRLImplementation<0x283487b40, instanceType: YTDAIAdsPlaybackLifecycleController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDAIContentPlaybackLifecycleAPI_API" = "SRLImplementation<0x283487840, instanceType: YTDAIContentPlaybackLifecycleController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDAIContentPlaybackStatusAPI_API" = "SRLImplementation<0x283487a80, instanceType: YTDAIContentPlaybackStatusController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDataFetcherService_API" = "SRLImplementation<0x2837f00c0, instanceType: YTDataFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDataOperationQueue_API" = "SRLImplementation<0x2837fc7e0, instanceType: YTInnerTubeOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDataServices_API" = "SRLImplementation<0x283694090, instanceType: YTRealDataServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDefaultPlayerOverlayFactory_API" = "SRLImplementation<0x2834966d0, instanceType: YTDefaultPlayerOverlayFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDefaultSlotAdapterFactory_API" = "SRLImplementation<0x2834a6430, instanceType: YTDefaultSlotAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDeferredAtrController_API" = "SRLImplementation<0x2836fd470, instanceType: YTDeferredAtrController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDeferredAtrDataStore_API" = "SRLImplementation<0x2836fd650, instanceType: YTDeferredAtrDataStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDelayedEventEntityStore_API" = "SRLImplementation<0x2837ef6f0, instanceType: YTDelayedEventEntityStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDeviceClassificationURLDecorator_API" = "SRLImplementation<0x2837fc810, instanceType: YTDeviceClassificationURLDecorator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTDiscoveryPlaybackTrackerLayoutEnteredOpportunityAdapter_API" = "SRLImplementation<0x28349a3d0, instanceType: YTDiscoveryPlaybackTrackerLayoutEnteredOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTECatcherController_API" = "SRLImplementation<0x2837fc7b0, instanceType: YTECatcherController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMEntitiesProcessorRegistrar_API" = "SRLImplementation<0x283573420, instanceType: YTELMEntitiesProcessorRegistrar, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMFontLoader_API" = "SRLImplementation<0x283579080, instanceType: YTELMFontLoader, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMJSEnvironment_API" = "SRLImplementation<0x283710840, instanceType: YTELMJSEnvironment, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMPerformanceAgentFactory_API" = "SRLImplementation<0x283710810, instanceType: YTELMPerformanceAgentFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMQueryEngineProvider_API" = "SRLImplementation<0x283573450, instanceType: YTELMQueryEngineProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMRegistry_API" = "SRLImplementation<0x2835728e0, instanceType: YTELMRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTELMResourceLoader_API" = "SRLImplementation<0x283491170, instanceType: YTELMResourceLoader, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEditEffectAssetManager_API" = "SRLImplementation<0x28357f2a0, instanceType: YTEditEffectAssetManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEditEffectAssetStore_API" = "SRLImplementation<0x28357f270, instanceType: YTEditEffectAssetStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTElementsCommandHandler_API" = "SRLImplementation<0x282b983c0, instanceType: YTElementsCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
    "YTElementsContextFactory_API" = "SRLImplementation<0x2835728b0, instanceType: YTELMContextFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTElementsDispatcherFactory_API" = "SRLImplementation<0x283573240, instanceType: YTELMDispatcherFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTElementsLoggerFactory_API" = "SRLImplementation<0x283573270, instanceType: YTELMLoggerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTElementsUpdateHandler_API" = "SRLImplementation<0x283710180, instanceType: YTElementUpdateHandler, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEngagementPanelControllerProvider_API" = "SRLImplementation<0x282bd0930, instanceType: YTEngagementPanelControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEntitiesConfig_API" = "SRLImplementation<0x283718a20, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEntityTransformationController_API" = "SRLImplementation<0x28361ad30, instanceType: YTEntityTransformationController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEntityTransformationMissingEntityObserver_API" = "SRLImplementation<0x283603720, instanceType: YTEntityTransformationMissingEntityObserver, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLogger_API" = "SRLImplementation<0x2837cb1b0, instanceType: YTEventLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLoggingController_API" = "SRLImplementation<0x283713600, instanceType: YTEventLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLoggingDelayedEventController_API" = "SRLImplementation<0x2837ef5d0, instanceType: YTEventLoggingDelayedEventController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLoggingRetryController_API" = "SRLImplementation<0x2837fce70, instanceType: YTEventLoggingRetryController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLoggingRetryDelayedEventController_API" = "SRLImplementation<0x283762d00, instanceType: YTEventLoggingRetryDelayedEventController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTEventLoggingService_API" = "SRLImplementation<0x2837fc1b0, instanceType: YTEventLoggingService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTExternallyManagedSlotAdapterDelegate_API" = "SRLImplementation<0x283487c00, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFeatureGatesClient_API" = "SRLImplementation<0x283763750, instanceType: YTFeatureGatesClient, lifetime: 0, scopeType: 4, configuration: None>";
    "YTFeedFilterChipBarControllerConfig_API" = "SRLImplementation<0x2836703c0, instanceType: YTFeedFilterChipBarController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFeedbackCoordinator_API" = "SRLImplementation<0x28369f600, instanceType: YTFeedbackCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFetcherConfig_API" = "SRLImplementation<0x2837cb3f0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFlatFileLogsReader_API" = "SRLImplementation<0x2836aac40, instanceType: YTFlatFileLogsReader, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFrequencyCapTracker_API" = "SRLImplementation<0x2834949f0, instanceType: YTFrequencyCapTracker, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFulfillmentAdapterDelegate_API" = "SRLImplementation<0x2834a64c0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFulfillmentAdapterFactoryManager_API" = "SRLImplementation<0x28349b630, instanceType: YTFulfillmentAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTFullscreenEngagementCompanionLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x282b87c30, instanceType: YTFullscreenEngagementCompanionLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGELStreamzService_API" = "SRLImplementation<0x283682b20, instanceType: YTGELStreamzService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGLCardboardRenderer_API" = "SRLImplementation<0x283483870, instanceType: YTGLCardboardRenderer, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGLMediaPlayerViewFactory_API" = "SRLImplementation<0x283483a20, instanceType: YTGLMediaPlayerViewFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGLSceneProtocol_API" = "SRLImplementation<0x283484a20, instanceType: YTGLScene, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGaiaIdentityService_API" = "SRLImplementation<0x2837c8ea0, instanceType: YTGaiaIdentityService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGetLocationCommandHandlerClassObservable_API" = "SRLImplementation<0x282bb8ed0, instanceType: YTGetLocationCommandHandlerClassObservable, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGlobalConfig_API" = "SRLImplementation<0x28379b7b0, instanceType: YTGlobalConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGlobalConfigsApplier_API" = "SRLImplementation<0x2837fc780, instanceType: YTGlobalConfigsApplier, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGoogleConversionPingConfig_API" = "SRLImplementation<0x2836cc4e0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGuideServiceCoordinator_API" = "SRLImplementation<0x283692190, instanceType: YTAppGuideServiceCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTGuideService_API" = "SRLImplementation<0x2836921c0, instanceType: YTGuideService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHeaderLogoController_API" = "SRLImplementation<0x2836c6490, instanceType: YTHeaderLogoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHeartbeatService_API" = "SRLImplementation<0x2834adfe0, instanceType: YTHeartbeatService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHintController_API" = "SRLImplementation<0x2836a4060, instanceType: YTHintController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHintsConfig_API" = "SRLImplementation<0x2836a4090, instanceType: YTAppHintsConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHomeFeedGlobalMonitor_API" = "SRLImplementation<0x28360b3f0, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHomeOfflineController_API" = "SRLImplementation<0x28368cab0, instanceType: YTHomeOfflineController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTHotConfig_API" = "SRLImplementation<0x2837a5140, instanceType: YTHotConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIOSGuardSnapshotController_API" = "SRLImplementation<0x283704150, instanceType: YTIOSGuardSnapshotController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIdentityController_API" = "SRLImplementation<0x2837f7c30, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityEntityTransformer_API" = "SRLImplementation<0x28361a430, instanceType: YTIdentityEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIdentityNotifier_API" = "SRLImplementation<0x2837c9890, instanceType: YTIdentityNotifier, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityProvider_API" = "SRLImplementation<0x2837c9830, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityRestorer_API" = "SRLImplementation<0x2837c9590, instanceType: YTIdentityRestorer, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityRetriever_API" = "SRLImplementation<0x2837c9560, instanceType: YTIdentityRetriever, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIdentityScopedPersistentEntityStoreProvider_API" = "SRLImplementation<0x2837130f0, instanceType: YTIdentityScopedPersistentEntityStoreProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIdentityScopedPersistentEntityStore_API" = "SRLImplementation<0x283718a50, instanceType: YTIdentityScopedPersistentEntityStoreV2, lifetime: 0, scopeType: 1, configuration: None>";
    "YTIdentityStateLoggingController_API" = "SRLImplementation<0x2837656b0, instanceType: YTIdentityStateLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTIdentityStore_API" = "SRLImplementation<0x2837c9320, instanceType: YTIdentityStore, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityStrategy_API" = "SRLImplementation<0x2837c9110, instanceType: YTInlineIdentityStrategy, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityTransactionCoalescer_API" = "SRLImplementation<0x2837c9020, instanceType: YTIdentityTransactionCoalescer, lifetime: 0, scopeType: 4, configuration: None>";
    "YTIdentityTransactionFactory_API" = "SRLImplementation<0x2837c90e0, instanceType: YTIdentityTransactionFactory, lifetime: 0, scopeType: 4, configuration: None>";
    "YTImageFetcherService_API" = "SRLImplementation<0x2837cb300, instanceType: YTHotSwappableImageFetcherService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTImageOperationQueue_API" = "SRLImplementation<0x2836922e0, instanceType: YTImageOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
    "YTImageSelectionStrategy_API" = "SRLImplementation<0x283692310, instanceType: YTBestMatchImageSelectionStrategy, lifetime: 0, scopeType: 0, configuration: None>";
    "YTImageServiceImageDataSource_API" = "SRLImplementation<0x283692370, instanceType: YTOfflineLocalImageEntitySource, lifetime: 0, scopeType: 0, configuration: None>";
    "YTImageService_API" = "SRLImplementation<0x2836922b0, instanceType: YTImageService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTImageStyle_API" = "SRLImplementation<0x2836bf180, instanceType: YTAppImageStyle, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInMemoryEntityStoreObserverTransformationTrigger_API" = "SRLImplementation<0x2829f03f0, instanceType: YTInMemoryEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInMemoryEntityStore_API" = "SRLImplementation<0x28376bf30, instanceType: YTInMemoryEntityStoreV2, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInPlayerDAIExternallyManagedSlotAdapter_API" = "SRLImplementation<0x283487ba0, instanceType: YTInPlayerDAIExternallyManagedSlotAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInceptionControllerProtocol_API" = "SRLImplementation<0x2836eac70, instanceType: YTInceptionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInfoCardControllerProviderProtocol_API" = "SRLImplementation<0x2834ace40, instanceType: YTInfoCardControllerProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInlineMutedPlaybackStateController_API" = "SRLImplementation<0x28354bc60, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInlineMutedWatchEndpointMutationCommandHandler_API" = "SRLImplementation<0x282b80600, instanceType: YTInlineMutedWatchEndpointMutationCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
    "YTInnerTubeConfig_API" = "SRLImplementation<0x2837cab20, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeContextFactory_API" = "SRLImplementation<0x2837fc210, instanceType: YTInnerTubeContextFactory, lifetime: 0, scopeType: 4, configuration: None>";
    "YTInnerTubeControllerFactory_API" = "SRLImplementation<0x2836dc750, instanceType: YTAppInnerTubeControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeCoreDataContext_API" = "SRLImplementation<0x2836f47b0, instanceType: YTInnerTubeCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeFetcherService_API" = "SRLImplementation<0x2837cff90, instanceType: YTHotSwappableFetcherServiceAndURLBuilder, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeOperationQueue_API" = "SRLImplementation<0x2837fc600, instanceType: YTInnerTubeOperationQueue, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeRequestFactory_API" = "SRLImplementation<0x2837fc1e0, instanceType: YTInnerTubeRequestFactory, lifetime: 0, scopeType: 4, configuration: None>";
    "YTInnerTubeRequestorFactory_API" = "SRLImplementation<0x2837fc4b0, instanceType: YTInnerTubeRequestorFactory, lifetime: 0, scopeType: 4, configuration: None>";
    "YTInnerTubeResponseCache_API" = "SRLImplementation<0x2837fc6f0, instanceType: YTInnerTubeResponseCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeRetryTaskController_API" = "SRLImplementation<0x2836fd2f0, instanceType: YTInnerTubeRetryTaskController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeSharedData_API" = "SRLImplementation<0x2837fc6c0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeUIGlobals_API" = "SRLImplementation<0x2836c6a60, instanceType: YTLiveServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeUIServiceMapper_API" = "SRLImplementation<0x2836dc780, instanceType: YTAppInnerTubeUIServiceMapper, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInnerTubeURLBuilder_API" = "SRLImplementation<0x283765440, instanceType: YTHotSwappableFetcherServiceAndURLBuilder, lifetime: 0, scopeType: 0, configuration: None>";
    "YTInteractionLoggingOnGELController_API" = "SRLImplementation<0x2836ad320, instanceType: YTInteractionLoggingOnGELController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLastActionController_API" = "SRLImplementation<0x2837657a0, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLastActionProvider_API" = "SRLImplementation<0x2837fcc90, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLatencyLogger_API" = "SRLImplementation<0x2836ff1b0, instanceType: YTLatencyLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLayoutFactory_API" = "SRLImplementation<0x28362a070, instanceType: YTLayoutFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLayoutRenderingAdapterFactoryManager_API" = "SRLImplementation<0x2834ae250, instanceType: YTLayoutRenderingAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLayoutSelfExitRequestedTriggerAdapter_API" = "SRLImplementation<0x282b88ab0, instanceType: YTLayoutSelfExitRequestedTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLayoutStyle_API" = "SRLImplementation<0x283767540, instanceType: YTAppLayoutStyle, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLiveMidrollCuepointOpportunityAdapter_API" = "SRLImplementation<0x283487990, instanceType: YTLiveMidrollCuepointOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLiveStreamBreakTransitionTriggerAdapter_API" = "SRLImplementation<0x283487ae0, instanceType: YTLiveStreamBreakTransitionTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLocationInfoMonitor_API" = "SRLImplementation<0x2837198c0, instanceType: YTLocationInfoMonitor, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLockScreenController_API" = "SRLImplementation<0x283487d20, instanceType: YTLockScreenController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLoggingCoreDataContext_API" = "SRLImplementation<0x2837ef720, instanceType: YTLoggingCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLoggingDispatchQueue_API" = "SRLImplementation<0x2837fcf30, instanceType: YTLoggingDispatchQueue, lifetime: 0, scopeType: 0, configuration: None>";
    "YTLoggingIdentityProvider_API" = "SRLImplementation<0x2837ca7c0, instanceType: YTLoggingIdentityProvider, lifetime: 0, scopeType: 4, configuration: None>";
    "YTLoggingURLController_API" = "SRLImplementation<0x283650600, instanceType: YTLoggingURLController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMERegistry_API" = "SRLImplementation<0x2836cd440, instanceType: YTMERegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMacroMarkersController_API" = "SRLImplementation<0x282b87ea0, instanceType: YTMacroMarkersController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMacroMarkersTimedSyncController_API" = "SRLImplementation<0x282b87f90, instanceType: YTMacroMarkersTimedSyncController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMainAppDiscoveryInPlayerRenderingAPI_API" = "SRLImplementation<0x282b829a0, instanceType: YTMainAppDiscoveryInPlayerRenderingAPI, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMainAppEngagementPanelDataCollector_API" = "SRLImplementation<0x283681b30, instanceType: YTMainAppEngagementPanelDataCollector, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMainAppPlayerOverlayDataCollector_API" = "SRLImplementation<0x282b86130, instanceType: YTMainAppPlayerOverlayDataCollector, lifetime: 0, scopeType: 0, configuration: None>";
    "YTMemoryWatchdog_API" = "SRLImplementation<0x28368a1c0, instanceType: YTMemoryWatchdog, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNavigationCommandHandler_API" = "SRLImplementation<0x2836d8ff0, instanceType: YTNavigationCommandHandler, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNetworkActiveController_API" = "SRLImplementation<0x283562820, instanceType: YTNetworkActiveControllerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNetworkBaselineLogger_API" = "SRLImplementation<0x2837fcb10, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNetworkEventLogger_API" = "SRLImplementation<0x2837fc960, instanceType: YTNetworkEventLogger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNetworkHealthController_API" = "SRLImplementation<0x2836f4660, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNetworkHealthLogger_API" = "SRLImplementation<0x2837fc930, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNetworkReceivedDelegate_API" = "SRLImplementation<0x2837fc690, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNetworkRequestTracker_API" = "SRLImplementation<0x2837cb330, instanceType: YTNetworkRequestTrackerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNetworkRetryDelegate_API" = "SRLImplementation<0x2837fc420, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNetworkStatusEntityTransformationTrigger_API" = "SRLImplementation<0x2836eab50, instanceType: YTNetworkStatusEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNetworkUsageNotifier_API" = "SRLImplementation<0x28357eac0, instanceType: YTNetworkUsageNotifier, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNonCriticalStartupSchedulerConfig_API" = "SRLImplementation<0x28376fc60, instanceType: YTAppNonCriticalStartupSchedulerConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNonCriticalStartupScheduler_API" = "SRLImplementation<0x28376fc00, instanceType: (null), lifetime: 1, scopeType: 0, configuration: None>";
    "YTNotificationAccountScopedInnerTubeContextDecorator_API" = "SRLImplementation<0x2836aa910, instanceType: YTNotificationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>";
    "YTNotificationConfig_API" = "SRLImplementation<0x283682730, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNotificationInnerTubeContextDecorator_API" = "SRLImplementation<0x2836aa760, instanceType: YTNotificationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
    "YTNotificationOSSettingEntityController_API" = "SRLImplementation<0x2834803c0, instanceType: YTNotificationOSSettingEntityController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNotificationRegistrationManager_API" = "SRLImplementation<0x283682760, instanceType: YTNotificationRegistrationManager, lifetime: 1, scopeType: 0, configuration: None>";
    "YTNotificationService_API" = "SRLImplementation<0x283682790, instanceType: YTNotificationService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNthThumbnailLoadInstrumentation_API" = "SRLImplementation<0x283684f60, instanceType: YTNthThumbnailLoadInstrumentation, lifetime: 0, scopeType: 0, configuration: None>";
    "YTNthThumbnailLoadTransmitter_API" = "SRLImplementation<0x28356e190, instanceType: YTAppStartupInstrumentationThumbnailLoadTransmitter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOcclusionMonitoringController_API" = "SRLImplementation<0x2836ead90, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAdController_API" = "SRLImplementation<0x28369f660, instanceType: YTOfflineAdController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAdFrequencyCapProvider_API" = "SRLImplementation<0x283494c30, instanceType: YTOfflineAdFrequencyCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAdParser_API" = "SRLImplementation<0x28369f690, instanceType: YTOfflineAdParser, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAdPlaylistController_API" = "SRLImplementation<0x283682580, instanceType: YTOfflineAdPlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAdProvider_API" = "SRLImplementation<0x282bbb000, instanceType: YTOfflineAdPlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineAppStateEventCenter_API" = "SRLImplementation<0x2836fd320, instanceType: YTOfflineAppStateEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineCacheSynchronizer_API" = "SRLImplementation<0x2836f4870, instanceType: YTOfflineCacheSynchronizer, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineClientStateLogger_API" = "SRLImplementation<0x2836fed90, instanceType: YTOfflineClientStateLogger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineClientStateProvider_API" = "SRLImplementation<0x2836fedc0, instanceType: YTOfflineClientStateProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineConfig_API" = "SRLImplementation<0x283682280, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineContentController_API" = "SRLImplementation<0x28349d9e0, instanceType: YTOfflineContentController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineCoordinator_API" = "SRLImplementation<0x283685560, instanceType: YTOfflineCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineDataService_API" = "SRLImplementation<0x2836821f0, instanceType: YTOfflineDataService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineEntityGenerationController_API" = "SRLImplementation<0x2836feb20, instanceType: YTOfflineEntityGenerationController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineImageController_API" = "SRLImplementation<0x2836822b0, instanceType: YTOfflineImageController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineModeProvider_API" = "SRLImplementation<0x28369f630, instanceType: YTOfflineCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineNotificationController_API" = "SRLImplementation<0x28356ff30, instanceType: YTOfflineNotificationController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineOrchestrationAutoRefreshController_API" = "SRLImplementation<0x2836fed00, instanceType: YTOfflineOrchestrationAutoRefreshController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineOrchestrationController_API" = "SRLImplementation<0x2836fedf0, instanceType: YTOfflineOrchestrationController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflinePlaybackPositionSyncService_API" = "SRLImplementation<0x28349e460, instanceType: YTOfflinePlaybackPositionSyncService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflinePlaylistController_API" = "SRLImplementation<0x283682520, instanceType: YTOfflinePlaylistController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflinePlaylistMonitor_API" = "SRLImplementation<0x282b9b5d0, instanceType: YTNoOpOfflinePlaylistMonitor, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflinePlaylistStore_API" = "SRLImplementation<0x2836f48d0, instanceType: YTOfflinePlaylistStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineRefreshEntityQueryTable_API" = "SRLImplementation<0x2836fec10, instanceType: YTOfflineRefreshEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineServiceController_API" = "SRLImplementation<0x28369dec0, instanceType: YTAppOfflineServiceController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineSettingsServiceSwitch_API" = "SRLImplementation<0x2836825e0, instanceType: YTOfflineSettingsServiceSwitch, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineSettingsService_API" = "SRLImplementation<0x283682610, instanceType: YTOfflineSettingsService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineStoreAPI_API" = "SRLImplementation<0x282bbafd0, instanceType: YTOfflineStoreAPIImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineTracklistCaptionController_API" = "SRLImplementation<0x2836820d0, instanceType: YTOfflineTracklistCaptionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineTransferStatusLogger_API" = "SRLImplementation<0x2836f3060, instanceType: YTOfflineTransferStatusLogger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoController_API" = "SRLImplementation<0x2836821c0, instanceType: YTOfflineVideoController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoDownloadScheduler_API" = "SRLImplementation<0x2836f3330, instanceType: YTOfflineVideoDownloadScheduler, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoDownloader_API" = "SRLImplementation<0x2836f3240, instanceType: YTOfflineVideoDownloader, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoListController_API" = "SRLImplementation<0x283682550, instanceType: YTOfflineVideoListController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoRepairWorker_API" = "SRLImplementation<0x2834809c0, instanceType: YTOfflineVideoRepairWorker, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineVideoStore_API" = "SRLImplementation<0x2836fd260, instanceType: YTOfflineVideoStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOfflineWatchNextServiceAdapter_API" = "SRLImplementation<0x282badf50, instanceType: YTAppOfflineWatchNextServiceAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTOrganicWatchNextResponseOpportunityAdapter_API" = "SRLImplementation<0x2834876f0, instanceType: YTOrganicWatchNextResponseOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPageStyleController_API" = "SRLImplementation<0x2837103f0, instanceType: YTPageStyleController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPeriodicLoggingController_API" = "SRLImplementation<0x2837656e0, instanceType: YTPeriodicLoggingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPersistentToInMemoryEntityStoreProjectionController_API" = "SRLImplementation<0x2836e9740, instanceType: YTPersistentToInMemoryEntityStoreProjectionController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPersonalizedSuggestionsCache_API" = "SRLImplementation<0x283698270, instanceType: YTPersonalizedSuggestionsCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPhotoUploadController_API" = "SRLImplementation<0x283692250, instanceType: YTPhotoUploadController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPingControllerConfig_API" = "SRLImplementation<0x2836fd6b0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPingService_API" = "SRLImplementation<0x28368c0c0, instanceType: YTPingService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPingStore_API" = "SRLImplementation<0x28368c060, instanceType: YTPingStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPingingEndpointCommandHandler_API" = "SRLImplementation<0x2835651a0, instanceType: YTPingingEndpointCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
    "YTPivotBarProvider_API" = "SRLImplementation<0x283614ed0, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayAsYouBrowseSettingController_API" = "SRLImplementation<0x2836eadc0, instanceType: YTPlayAsYouBrowseSettingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackCoordinator_API" = "SRLImplementation<0x283483060, instanceType: MDXPlaybackCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackLockScreenController_API" = "SRLImplementation<0x283487cf0, instanceType: YTPlaybackLockScreenController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackRequestFactory_API" = "SRLImplementation<0x2834b0d80, instanceType: YTPlaybackRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackRouteButtonControllerProvider_API" = "SRLImplementation<0x2836c21c0, instanceType: MDXRealServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackTrackingLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x2834ae580, instanceType: YTPlaybackTrackingLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlaybackTrackingSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x2834a64f0, instanceType: YTPlaybackTrackingSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerAccountScopedInnerTubeContextDecorator_API" = "SRLImplementation<0x2834adfb0, instanceType: YTPlayerAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>";
    "YTPlayerAdEventTriggerAdapter_API" = "SRLImplementation<0x283487930, instanceType: YTPlayerAdEventTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerAdsProvider_API" = "SRLImplementation<0x283487720, instanceType: YTRealAdsPlayerServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesLayoutEnteredAndFullscreenOpportunityAdapter_API" = "SRLImplementation<0x28349b990, instanceType: YTPlayerBytesLayoutEnteredAndFullscreenOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesLayoutEnteredOpportunityAdapter_API" = "SRLImplementation<0x28349bb40, instanceType: YTPlayerBytesLayoutEnteredOpportunityAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesLayoutRenderingAdapterFactory_API" = "SRLImplementation<0x282b88210, instanceType: YTPlayerBytesLayoutRenderingAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesSlotAdapterFactory_API" = "SRLImplementation<0x282bbb180, instanceType: YTPlayerBytesSlotAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesSlotFulfillmentAdapterFactory_API" = "SRLImplementation<0x282bbaf10, instanceType: YTPlayerBytesSlotFulfillmentAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerBytesSlotRegistrationAPI_API" = "SRLImplementation<0x283487c90, instanceType: YTAdsPlaybackService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerInnerTubeContextDecorator_API" = "SRLImplementation<0x2834adef0, instanceType: YTPlayerInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>";
    "YTPlayerOfflineFallbackConfig_API" = "SRLImplementation<0x2834897d0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerPrebufferController_API" = "SRLImplementation<0x2834b0bd0, instanceType: YTPlayerPrebufferController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerPrefetchService_API" = "SRLImplementation<0x283497360, instanceType: YTPlayerPrefetchService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerRequestFactory_API" = "SRLImplementation<0x2834b0de0, instanceType: YTPlayerRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerScrubLoggingService_API" = "SRLImplementation<0x28348f960, instanceType: YTPlayerScrubLoggingService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerServiceConfig_API" = "SRLImplementation<0x2834887b0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerService_API" = "SRLImplementation<0x2834b1fb0, instanceType: YTPlayerService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPlayerViewControllerConfig_API" = "SRLImplementation<0x283483030, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPreviousQuery_API" = "SRLImplementation<0x283698480, instanceType: YTPreviousQuery, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPriorityLoader_API" = "SRLImplementation<0x28376bcc0, instanceType: YTPriorityLoader, lifetime: 0, scopeType: 0, configuration: None>";
    "YTProfileCardController_API" = "SRLImplementation<0x282b80b40, instanceType: YTProfileCardController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPromosheetController_API" = "SRLImplementation<0x283690ff0, instanceType: YTPromosheetController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPushNotificationController_API" = "SRLImplementation<0x283682700, instanceType: YTPushNotificationController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTPushNotificationService_API" = "SRLImplementation<0x2837d3bd0, instanceType: YTPushNotificationService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTQueueConfig_API" = "SRLImplementation<0x282b99ad0, instanceType: YTDefaultQueueConfig, lifetime: 0, scopeType: 0, configuration: None>";
    "YTReachabilityController_API" = "SRLImplementation<0x2837fc240, instanceType: YTReachabilityController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTReelImageFetcher_API" = "SRLImplementation<0x2836f4030, instanceType: YTReelImageFetcher, lifetime: 0, scopeType: 0, configuration: None>";
    "YTRenderingConfig_API" = "SRLImplementation<0x2836c6fd0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTResponderRoot_API" = "SRLImplementation<0x283762dc0, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTRestoreController_API" = "SRLImplementation<0x2836842d0, instanceType: YTRestoreController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTRetroactiveSignInController_API" = "SRLImplementation<0x28357e580, instanceType: YTRetroactiveSignInController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSRLAccountSynchronizer_API" = "SRLImplementation<0x283480270, instanceType: YTSRLAccountSynchronizer, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSSOConfig_API" = "SRLImplementation<0x2837c9e00, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTScrollFocusGlobalStateMonitor_API" = "SRLImplementation<0x28348c7b0, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTScrollFocusGlobalStateProtocol_API" = "SRLImplementation<0x283608690, instanceType: YTInlineMutedPlaybackStateController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSeamlessSignIn_API" = "SRLImplementation<0x28360c210, instanceType: YTSeamlessSignIn, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSearchHistoryService_API" = "SRLImplementation<0x2836984e0, instanceType: YTSearchHistoryService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSearchLatencyCache_API" = "SRLImplementation<0x283698630, instanceType: YTSearchLatencyCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSearchService_API" = "SRLImplementation<0x2834eab20, instanceType: YTAppSearchService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSearchboxStatsTracker_API" = "SRLImplementation<0x28369de00, instanceType: YTSearchboxStatsTracker, lifetime: 0, scopeType: 0, configuration: None>";
    "YTServices_API" = "SRLImplementation<0x283694060, instanceType: YTLiveServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSettings_API" = "SRLImplementation<0x28379bfc0, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTShareObserverController_API" = "SRLImplementation<0x282b997d0, instanceType: YTShareObserverController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTShareServices_API" = "SRLImplementation<0x282bd4390, instanceType: YTRealShareServices, lifetime: 0, scopeType: 0, configuration: None>";
    "YTShortsStartupCoordinator_API" = "SRLImplementation<0x2836f4180, instanceType: YTShortsStartupCoordinator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTShowContentPillNotifier_API" = "SRLImplementation<0x2836c6f70, instanceType: YTShowContentPillCommandHandlerClassObservable, lifetime: 0, scopeType: 0, configuration: None>";
    "YTShowTooltipCommandHandler_API" = "SRLImplementation<0x28291dbc0, instanceType: YTShowTooltipCommandHandler, lifetime: 0, scopeType: 1, configuration: None>";
    "YTShowTransientPlayerScrimOverlayCommandHandlerClassDelegation_API" = "SRLImplementation<0x282b80870, instanceType: YTShowTransientPlayerScrimOverlayCommandHandlerClassDelegation, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSignedOutLocalSearchHistory_API" = "SRLImplementation<0x283482c10, instanceType: YTSignedOutLocalSearchHistory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSingleVideoControllerFactory_API" = "SRLImplementation<0x2834b0c60, instanceType: YTSingleVideoControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSingleVideoOfflineLoggingController_API" = "SRLImplementation<0x2834a72d0, instanceType: YTSingleVideoOfflineLoggingController__657306411_GeneratedFactoryImpl, lifetime: 1, scopeType: 0, configuration: None>";
    "YTSiriShortcutManager_API" = "SRLImplementation<0x2836fd800, instanceType: YTSiriShortcutManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSkipButtonClickedTriggerAdapter_API" = "SRLImplementation<0x282b88360, instanceType: YTSkipButtonClickedTriggerAdapter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSlimStatusBarController_API" = "SRLImplementation<0x283698900, instanceType: YTSlimStatusBarController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSlotAdapterFactoryManager_API" = "SRLImplementation<0x2834a6460, instanceType: YTSlotAdapterFactoryManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSlotFactory_API" = "SRLImplementation<0x283629fe0, instanceType: YTSlotFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSlotOpportunityAdapterDelegate_API" = "SRLImplementation<0x28349a250, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSmartDownloadsSettingsObserver_API" = "SRLImplementation<0x2836feac0, instanceType: YTSmartDownloadsSettingsObserver, lifetime: 0, scopeType: 0, configuration: None>";
    "YTStallDetector_API" = "SRLImplementation<0x283684090, instanceType: YTStallDetector, lifetime: 0, scopeType: 0, configuration: None>";
    "YTStallMinidumpGenerator_API" = "SRLImplementation<0x2837f7090, instanceType: YTStallMinidumpGenerator, lifetime: 0, scopeType: 0, configuration: None>";
    "YTStateTagNotifications_API" = "SRLImplementation<0x2837fc750, instanceType: YTStateTagNotifications, lifetime: 0, scopeType: 0, configuration: None>";
    "YTStorageController_API" = "SRLImplementation<0x28369e160, instanceType: YTStorageController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTStoryboardControllerFactory_API" = "SRLImplementation<0x2834ac9f0, instanceType: YTStoryboardControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSubscriptionService_API" = "SRLImplementation<0x2836da4c0, instanceType: YTSubscriptionService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSuggestConfig_API" = "SRLImplementation<0x283698390, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSuggestParser_API" = "SRLImplementation<0x283482100, instanceType: YTAppSuggestParser, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSuggestRequestFactory_API" = "SRLImplementation<0x283698420, instanceType: YTAppSuggestRequestFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSuggestService_API" = "SRLImplementation<0x2836983f0, instanceType: YTSuggestService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSystemHealthCapturerRegistry_API" = "SRLImplementation<0x2837cb180, instanceType: YTSystemHealthCapturerRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSystemHealthContext_API" = "SRLImplementation<0x2837cadf0, instanceType: YTSystemHealthContext, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSystemHealthController_API" = "SRLImplementation<0x2837ca730, instanceType: YTSystemHealthController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSystemHealthTransmitterRegistry_API" = "SRLImplementation<0x2837ca160, instanceType: YTSystemHealthTransmitterRegistry, lifetime: 0, scopeType: 0, configuration: None>";
    "YTSystemNotifications_API" = "SRLImplementation<0x2837cb090, instanceType: YTSystemNotifications, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTerminationEventPingController_API" = "SRLImplementation<0x2836d9050, instanceType: YTTerminationEventPingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTThemeEntityManager_API" = "SRLImplementation<0x283690cc0, instanceType: YTThemeEntityManager, lifetime: 0, scopeType: 0, configuration: None>";
    "YTThumbnailLatencyLogger_API" = "SRLImplementation<0x2836929d0, instanceType: YTCSIThumbnailLatencyLogger, lifetime: 0, scopeType: 0, configuration: None>";
    "YTToastController_API" = "SRLImplementation<0x282baf9c0, instanceType: YTMainAppToastController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTooltipController_API" = "SRLImplementation<0x2836b2670, instanceType: YTTooltipController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTopViewControllerProvider_API" = "SRLImplementation<0x2836db540, instanceType: YTAppViewController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTransactionQueueController_API" = "SRLImplementation<0x28369e100, instanceType: YTTransactionQueueController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTriggerAdapterDelegate_API" = "SRLImplementation<0x28349b9f0, instanceType: YTAdsControlFlowManagerImpl, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTriggerAdapterFactory_API" = "SRLImplementation<0x283499b90, instanceType: YTTriggerAdapterFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTTypeStyle_API" = "SRLImplementation<0x283693a80, instanceType: YTDefaultTypeStyle, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUnicornTimelyBlockingController_API" = "SRLImplementation<0x2836aed90, instanceType: YTUnicornTimelyBlockingController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUnpluggedResolveLocationService_API" = "SRLImplementation<0x283713cf0, instanceType: YTUnpluggedResolveLocationService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUpdatedMetadataService_API" = "SRLImplementation<0x282b862e0, instanceType: YTUpdatedMetadataService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUpgradeController_API" = "SRLImplementation<0x28357f120, instanceType: YTUpgradeController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadAppSpecificRequirementsStore_API" = "SRLImplementation<0x28362be40, instanceType: YTUploadAppSpecificRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadConfig_API" = "SRLImplementation<0x28349e610, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadCoreDataContext_API" = "SRLImplementation<0x28349ea60, instanceType: YTUploadCoreDataContext, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadEngine_API" = "SRLImplementation<0x283480ae0, instanceType: YTUploadEngine, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadProgressProvider_API" = "SRLImplementation<0x283480300, instanceType: YTUploadProgressProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadRequirementsStore_API" = "SRLImplementation<0x28362b300, instanceType: YTUploadRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadTaskController_API" = "SRLImplementation<0x283480b10, instanceType: YTUploadTaskController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadTaskStore_API" = "SRLImplementation<0x28349eca0, instanceType: YTUploadTaskStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUploadUserSpecificRequirementsStore_API" = "SRLImplementation<0x283484060, instanceType: YTUploadUserSpecificRequirementsStore, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUserDefaultsKeysProvider_API" = "SRLImplementation<0x2837b0630, instanceType: YTYouTubeUserDefaultsKeysProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTUserDefaults_API" = "SRLImplementation<0x2837b05a0, instanceType: YTYouTubeUserDefaults, lifetime: 0, scopeType: 4, configuration: None>";
    "YTVASTParser_API" = "SRLImplementation<0x283681bf0, instanceType: YTVASTParser, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVELoggingAPIProvider_API" = "SRLImplementation<0x282b81ad0, instanceType: YTVELoggingAPIProvider, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVMAPParser_API" = "SRLImplementation<0x283681f20, instanceType: YTVMAPParser, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVSSControllerFactory_API" = "SRLImplementation<0x2834ab000, instanceType: YTVSSControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVideoPlayerOverlayConfig_API" = "SRLImplementation<0x2836a4150, instanceType: YTSettings, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVideoQualitySwitchControllerFactory_API" = "SRLImplementation<0x283561770, instanceType: YTVideoQualitySwitchControllerFactory, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVisitorDataRequestDecorator_API" = "SRLImplementation<0x2837fc990, instanceType: YTVisitorDataRequestDecorator, lifetime: 0, scopeType: 4, configuration: None>";
    "YTVisitorDataStore_API" = "SRLImplementation<0x2837fc900, instanceType: YTIdentityController, lifetime: 0, scopeType: 4, configuration: None>";
    "YTVoiceSearchCache_API" = "SRLImplementation<0x2834f60a0, instanceType: YTVoiceSearchCache, lifetime: 0, scopeType: 0, configuration: None>";
    "YTVoiceSearchService_API" = "SRLImplementation<0x28369de60, instanceType: YTVoiceSearchService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWatchBreakController_API" = "SRLImplementation<0x2836a1aa0, instanceType: YTWatchBreakController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWatchEventCenter_API" = "SRLImplementation<0x2836a4390, instanceType: YTWatchEventCenter, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWatchHistoryService_API" = "SRLImplementation<0x2834e97d0, instanceType: YTWatchHistoryService, lifetime: 0, scopeType: 1, configuration: None>";
    "YTWatchHistoryStatusNotifier_API" = "SRLImplementation<0x28349e100, instanceType: YTWatchHistoryStatusNotifier, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWatchNextResponseFetcherAPI_API" = "SRLImplementation<0x282bbafa0, instanceType: YTAdBreakRendererFetcher, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWatchNextService_API" = "SRLImplementation<0x282b9b090, instanceType: YTAppWatchNextService, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWorkerController_API" = "SRLImplementation<0x28368a220, instanceType: YTWorkerController, lifetime: 0, scopeType: 0, configuration: None>";
    "YTWorkerScheduler_API" = "SRLImplementation<0x28357e880, instanceType: YTWorkerScheduler, lifetime: 0, scopeType: 0, configuration: None>";
    "YTYouTubeUserDefaults_API" = "SRLImplementation<0x2837f7f00, instanceType: YTYouTubeUserDefaults, lifetime: 0, scopeType: 4, configuration: None>";
}
Multi bindings:
{
    "ELMMissingResourceHandler_API" = "{(\n)}";
    "ELMSecurityVerifier_API" = "{(\n)}";
    "YTAccountScopedInnerTubeContextDecorator_API" = "{(\n    SRLImplementation<0x2834e94a0, instanceType: YTAccountScopedAdsInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e9710, instanceType: YTDataPushInnerTubeContextDecorator, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2834e92c0, instanceType: YTELMAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e82a0, instanceType: MLAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e9e30, instanceType: YTAccountScopedClientStoreInfoInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e9da0, instanceType: YTNotificationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e9890, instanceType: YTLocationAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>,\n    SRLImplementation<0x2834e9c80, instanceType: YTPlayerAccountScopedInnerTubeContextDecorator, lifetime: 0, scopeType: 1, configuration: None>\n)}";
    "YTAppBrowseServiceRequestDecorator_API" = "{(\n    SRLImplementation<0x283713030, instanceType: YTDownloadsBrowseParamsBrowseRequestDecorator, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTAppBrowseServiceResponseProvider_API" = "{(\n    SRLImplementation<0x2836b2640, instanceType: YTAppBrowseServiceLibraryResponseProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283689f80, instanceType: YTAppBrowseServicePlaylistResponseProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836b0780, instanceType: YTAppBrowseServiceHomeResponseProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTBackgroundAppRefreshTask_API" = "{(\n    SRLImplementation<0x2836cadf0, instanceType: YTAppBackgroundAppRefreshTask, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTBackgroundProcessingTask_API" = "{(\n    SRLImplementation<0x2836cae50, instanceType: YTAppBackgroundProcessingTask, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTElementsCommandExtensionRegistryProvider_API" = "{(\n    SRLImplementation<0x283572bb0, instanceType: YTCommentElementsCommandRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283572b80, instanceType: YTAdsElementsCommandExtensionRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283572b50, instanceType: YTAccountElementsCommandExtensionRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTElementsNodeClassRegistryProvider_API" = "{(\n    SRLImplementation<0x283572dc0, instanceType: YTAdsElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283572df0, instanceType: YTCommentElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283572e20, instanceType: YTSuggestElementsNodeClassRegistryProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTEntityMergerProvider_API" = "{(\n    SRLImplementation<0x283718ed0, instanceType: YTMarkersEngagementPanelSyncEntityMergerProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTEntityStoreQueryTable_API" = "{(\n    SRLImplementation<0x283718c00, instanceType: YTTransferEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283718ba0, instanceType: YTOfflineActionWrapperEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283718c30, instanceType: YTOfflineRefreshEntityQueryTable, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTEntityTransformationTriggerProtocol_API" = "{(\n    SRLImplementation<0x28361d020, instanceType: YTNetworkStatusEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361d050, instanceType: YTPersistentEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361d0b0, instanceType: YTInMemoryEntityStoreObserverTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361ea60, instanceType: YTClockEntityTransformationTrigger, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTEntityTransformerProtocol_API" = "{(\n    SRLImplementation<0x28361a250, instanceType: YTMainDownloadedVideoEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361adc0, instanceType: YTMainDownloadsListEntityToSmartDownloadsHeaderEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361a580, instanceType: YTMainDownloadedVideoEntityToDownloadsPageVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361ae50, instanceType: YTMainRecommendedDownloadVideoEntityToDownloadsPageRecommendedVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836ee130, instanceType: YTMainVideoEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836eb8a0, instanceType: YTMainVideoEntityToDownloadsPageVideoEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361a220, instanceType: YTMainDownloadedVideoEntityToDownloadedVideoWithContextEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28361ab50, instanceType: YTMainDownloadedPlaylistEntityToDownloadStatusEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283619e90, instanceType: YTMainDownloadedPlaylistEntityToDownloadsPagePlaylistEntityTransformer, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeCellControllerRegistrationProvider_API" = "{(\n    SRLImplementation<0x2836036f0, instanceType: YTReelInnerTubeCellControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeCellRegistrationProvider_API" = "{(\n    SRLImplementation<0x28361f150, instanceType: YTReelInnerTubeCellRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeCommandRegistrationProvider_API" = "{(\n    SRLImplementation<0x283681b90, instanceType: YTFlowCommandRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283681bc0, instanceType: YTReelInnerTubeCommandRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeContextDecorator_API" = "{(\n    SRLImplementation<0x283714960, instanceType: YTELMInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x283714690, instanceType: YTClientStoreInfoInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x283714a50, instanceType: MLInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x283714930, instanceType: YTLocationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x2837148d0, instanceType: YTDataPushInnerTubeContextDecorator, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x283714a80, instanceType: YTNotificationInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x283714b10, instanceType: YTPlayerInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>,\n    SRLImplementation<0x283714630, instanceType: YTAdsInnerTubeContextDecorator, lifetime: 0, scopeType: 4, configuration: None>\n)}";
    "YTInnerTubeControllerRegistrationProvider_API" = "{(\n    SRLImplementation<0x2836dcea0, instanceType: YTReelShortsInnerTubeControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836dce70, instanceType: YTARCameraInnerTubeControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeSectionControllerMatchingRegistrationProvider_API" = "{(\n    SRLImplementation<0x2836c0120, instanceType: YTReelInnerTubeSectionControllerMatchingRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeTopControllerRegistrationProvider_API" = "{(\n    SRLImplementation<0x2836dc7b0, instanceType: YTEditInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836dc7e0, instanceType: YTLiveCreationInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2836dc810, instanceType: YTReelInnerTubeTopControllerRegistrationProvider, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTInnerTubeViewControllerMatchingRegistrationProvider_API" = "{(\n)}";
    "YTMainWindowObserver_API" = "{(\n    SRLImplementation<0x28369f570, instanceType: YTELMWindowFrameObserver, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28369f5a0, instanceType: YTLastActionController, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTModuleInitializer_API" = "{(\n    SRLImplementation<0x2837cf120, instanceType: YTInnerTubeModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2837cf0c0, instanceType: YTAccountModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x2837cf0f0, instanceType: YTFamilyManagementModuleInitializer, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTPlaybackContextDecorator_API" = "{(\n    SRLImplementation<0x2834b0e10, instanceType: MDXYTPlaybackContextDecorator, lifetime: 0, scopeType: 0, configuration: None>\n)}";
    "YTUploadFlowFactory_API" = "{(\n    SRLImplementation<0x28349e9d0, instanceType: YTUploadFeedbackOnlyFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28349e6a0, instanceType: YTUploadShortsFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28349e5e0, instanceType: YTUploadNormalFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28349e910, instanceType: YTUploadArchiveReplacementFlowFactory, lifetime: 0, scopeType: 0, configuration: None>,\n    SRLImplementation<0x28349eac0, instanceType: YTUploadReelsFlowFactory, lifetime: 0, scopeType: 0, configuration: None>\n)}";
}

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:02:46

返回数据

返回数据

某个广告视频的内部返回数据：

hook代码：

- (void)setVideoDetails:(id)arg1{
    iosLogInfo("arg1=%@", arg1);
    %orig;
}

输出：

2022-03-28 20:36:41.954044+0800 YouTube[25775:2715494] hook_ youtubeDylib.xm YTWatchMiniBarViewController$setVideoDetails$: arg1=<YTIVideoDetails 0x281b27f40>: {
    video_id: "LA6szWzus0g"
    title: "Get Chrome for iOS"
    length_seconds: 30
    channel_id: "UCL8ZULXASCc1I_oaOT0NaOQ"
    is_owner_viewing: false
    short_description: "Chrome is a fast, easy to use, and secure web browser for iOS. Get Chrome now. https://apps.apple.com/us/app/google-chrome/id535886823"
    is_crawlable: false
    thumbnail {
      thumbnails {
        url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEYCHgQWkhG8quKqQMMCAEVAACIQnABwAEG&rs=AOn4CLBU26fMso0e3iR2comi4Uz-x5cj7Q"
        width: 120
        height: 90
      }
      thumbnails {
        url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEcCIACEJABSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA2zPsvsB2aQxkZvfPFXMVhwdkpHQ"
        width: 256
        height: 144
      }
      thumbnails {
        url: "https://i.ytimg.com/vi/LA6szWzus0g/hqdefault.jpg?sqp=-oaymwEcCMACELQBSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDOaI6fXD2ptZTQmDP1myZBfcg13Q"
        width: 320
        height: 180
      }
      thumbnails {
        url: "https://i.ytimg.com/vi_webp/LA6szWzus0g/hqdefault.webp"
        width: 480
        height: 360
      }
      thumbnails {
        url: "https://i.ytimg.com/vi_webp/LA6szWzus0g/sddefault.webp"
        width: 640
        height: 480
      }
      thumbnails {
        url: "https://i.ytimg.com/vi/LA6szWzus0g/hq720.jpg?sqp=-oaymwEcCK4FEIIDSEbyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDvGWQtBtiONoEcK933xt4Aypr_7w"
        width: 686
        height: 386
      }
    }
    allow_ratings: true
    view_count: "26531222"
    author: "Google Chrome"
    is_private: false
    is_unplugged_corpus: false
    is_live_content: false
}

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:11:46

YouTube广告过滤相关

YouTube广告过滤相关

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:04:57

hook的类

hook的类

一些hook的核心的类

youtubeReqResp.xm

youtubeDylib/Logos/youtubeReqResp.xm

/*
 File: youtubeReqResp.xm
 Function: Youtube hook request and response related
*/

#import <UIKit/UIKit.h>
#import <objc/objc-runtime.h>
#import "CrifanLibiOS.h"

#import "youtubeCommon.h"

/*------------------------------------------------------------------------------
 NSURLRequest
------------------------------------------------------------------------------*/

%hook NSURLRequest

+ (NSURLRequest*)requestWithURL:(NSURL *)URL{
    NSURLRequest* rwu =  %orig;

    if (isYoutubeAdsVideo_current(URL)){
        iosLogInfo("isYoutubeAdsVideo_current: %@ -> rwu=%@", URL, rwu);
        gNoUse = 1;
    }

    return rwu;
}

- (NSURLRequest*)initWithURL:(NSURL *)URL{
    NSURLRequest* iwu =  %orig;

    if (isYoutubeAdsVideo_current(URL)){
        iosLogInfo("isYoutubeAdsVideo_current: %@ -> iwu=%@", URL, iwu);
        gNoUse = 1;
    }

    return iwu;
}

+ (NSURLRequest*)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval{
    NSURLRequest* rwu_uct =  %orig;

    iosLogInfo("URL=%@,cachePolicy=%lu,timeoutInterval=%f -> rwu_uct=%@", URL, (unsigned long)cachePolicy, timeoutInterval, rwu_uct);
    if (is1SecondVideo(URL)){
        iosLogInfo("URL=%@", URL);
        gNoUse = 1;
    }

    if (isYoutubeAdsVideo_current(URL)){
        gNoUse = 1;
    }

    return rwu_uct;
}

- (NSURLRequest*)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval{
    NSURLRequest* iwu_uct =  %orig;

    if (isYoutubeAdsVideo_current(URL)){
        iosLogInfo("isYoutubeAdsVideo_current: URL=%@,cachePolicy=%lu,timeoutInterval=%f -> iwu_uct=%@", URL, (unsigned long)cachePolicy, timeoutInterval, iwu_uct);
        gNoUse = 1;
    }

    return iwu_uct;
}

%end

/*------------------------------------------------------------------------------
 NSMutableURLRequest
------------------------------------------------------------------------------*/

%hook NSMutableURLRequest

- (void)setHTTPBody: (NSData*)newHttpBodyData {
    NSURL *reqUrl = [self URL];
    if (isYoutubeAdsVideo_current(reqUrl)){
        iosLogInfo("isYoutubeAdsVideo_current: reqUrl=%@", reqUrl);
        gNoUse = 1;
    }

    %orig;
}

%end

/*------------------------------------------------------------------------------
 NSHTTPURLResponse
------------------------------------------------------------------------------*/

%hook NSHTTPURLResponse

- (NSHTTPURLResponse*)initWithURL:(NSURL *)url
                 statusCode:(NSInteger)statusCode
                HTTPVersion:(NSString *)HTTPVersion
                headerFields:(NSDictionary<NSString *,NSString *> *)headerFields{
    NSHTTPURLResponse* newUrlResp =  %orig;

    if (is1SecondVideo(url)){
        iosLogInfo("url=%@", url);
        gNoUse = 1;
    }

    if (isYoutubeAdsVideo_current(url)){
        iosLogInfo("isYoutubeAdsVideo_current: url=%@,statusCode=%ld,HTTPVersion=%@,headerFields=%@ -> newUrlResp=%@", url, statusCode, HTTPVersion, headerFields, newUrlResp);
        gNoUse = 1;

        if (isYoutubeAdsVideo_ctierA(url)){
            iosLogInfo("isYoutubeAdsVideo_ctierA: url=%@,statusCode=%ld,HTTPVersion=%@,headerFields=%@ -> newUrlResp=%@", url, statusCode, HTTPVersion, headerFields, newUrlResp);
            gNoUse = 1;
        }
    } else {
        // TODO: after test, change back to ads video filter
        iosLogInfo("url=%@", url);
        gNoUse = 1;
    }

    return newUrlResp;
}

-(NSDictionary *)allHeaderFields{
    NSURL* curUrl = [self URL];
    if (isYoutubeAdsVideo_current(curUrl)){
//        iosLogInfo("isYoutubeAdsVideo: self=%@", self);
        gNoUse = 1;
    }

    NSDictionary* allHeader = %orig;
    iosLogInfo("curUrl=%@ : allHeader=%@", curUrl, allHeader);
    return allHeader;
}

-(NSInteger)statusCode{
    NSURL* curUrl = [self URL];
    if (isYoutubeAdsVideo_current(curUrl)){
//        iosLogInfo("isYoutubeAdsVideo: self=%@", self);
        gNoUse = 1;
    }

    NSInteger respStatusCode = %orig;
    iosLogInfo("respStatusCode=%ld", respStatusCode);
    return respStatusCode;
}

%end

/*------------------------------------------------------------------------------
 HAMDataLoadRequest
------------------------------------------------------------------------------*/

%hook HAMDataLoadRequest

- (id)initWithRangedURL:(id)rangeUrl timeoutInterval:(double)timeoutInterval HTTPMethod:(NSString*)HTTPMethod HTTPContentType:(NSString*)HTTPContentType HTTPBody:(id)HTTPBody idempotent:(_Bool)idempotent{
    iosLogInfo("rangeUrl=%@,timeoutInterval=%f,HTTPMethod=%@,HTTPContentType=%@,HTTPBody=%@,idempotent=%s", rangeUrl, timeoutInterval, HTTPMethod, HTTPContentType, HTTPBody, boolToStr(idempotent));
    gNoUse = 1;
    id newDataLoadReq = %orig;
    return newDataLoadReq;
}

- (id)initWithRangedURL:(id)rangeUrl{
    iosLogInfo("rangeUrl=%@", rangeUrl);
    gNoUse = 1;
    id newDataLoadReq = %orig;
    return newDataLoadReq;
}

- (id)initWithURL:(id)url{
    iosLogInfo("url=%@", url);
    gNoUse = 1;
    id newDataLoadReq = %orig;
    return newDataLoadReq;
}

%end

/*------------------------------------------------------------------------------
 MLOnesieRequestFactory
------------------------------------------------------------------------------*/

%hook MLOnesieRequestFactory

- (id)onesieRequestForPlayerRequest:(id)request dataLoader:(id)dataLoader context:(id)context cryptor:(id)cryptor requestNumber:(long long)requestNumber error:(id *)error{
    iosLogInfo("request=%@,dataLoader=%@,context=%@,cryptor=%@,requestNumber=%lld,error=%p", request, dataLoader, context, cryptor, requestNumber, error);
    gNoUse = 1;
    id newReqFactory = %orig;
    iosLogInfo("-> newReqFactory=%@", newReqFactory);
    return newReqFactory;
}

- (void)onesieRequestForPlayerRequest:(id)request authorization:(id)authorization dataLoader:(id)dataLoader context:(id)context cryptor:(id)cryptor requestNumber:(long long)requestNumber completionHandler:(id)completionHandler{
    iosLogInfo("request=%@,authorization=%@,dataLoader=%@,context=%@,cryptor=%@,requestNumber=%lld,completionHandler=%@", request, authorization, dataLoader, context, cryptor, requestNumber, completionHandler);
    gNoUse = 1;
    %orig;
}

%end

/*------------------------------------------------------------------------------
 YTIInnerTubeContext
------------------------------------------------------------------------------*/

%hook YTIInnerTubeContext

- (id)data{
    id ctxData = %orig;
    iosLogInfo("ctxData=%@", ctxData);
    return ctxData;
}

+ (id)descriptor{
    gNoUse = 1;
    id curDesc = %orig;
    iosLogInfo("curDesc=%@", curDesc);
    return curDesc;
}

-(YTIClientInfo*)remoteClient{
    gNoUse = 1;
    YTIClientInfo* newClientInfo = %orig;
    iosLogInfo("newClientInfo=%@", newClientInfo);
    return newClientInfo;
}

%end

/*------------------------------------------------------------------------------
 YTPlayerService
------------------------------------------------------------------------------*/

%hook YTPlayerService

- (id)makePlaybackRequest:(id)playbackRequest responseBlock:(id)responseBlock errorBlock:(id)errorBlock{
    iosLogInfo("playbackRequest=%@,responseBlock=%@,errorBlock=%@", playbackRequest, responseBlock, errorBlock);
    gNoUse = 1;
    id newPlayService = %orig;
    iosLogInfo("-> newPlayService=%@", newPlayService);
    return newPlayService;
}

%end

/*------------------------------------------------------------------------------
 YTPlayerRequestFactory
------------------------------------------------------------------------------*/

%hook YTPlayerRequestFactory

- (id)requestForPlayerWithPlayerRequest:(id)playerRequest URLRequestProperties:(id)URLRequestProperties{
    iosLogInfo("playerRequest=%@,URLRequestProperties=%@", playerRequest, URLRequestProperties);
    gNoUse = 1;
    id newReqFactory = %orig;
    iosLogInfo("-> newReqFactory=%@", newReqFactory);
    return newReqFactory;
}

- (id)innerTubeRequestForPlayerWithVideoID:(id)videoID playlistID:(id)playlistID playlistIndex:(unsigned long long)playlistIndex playbackContext:(id)playbackContext forOffline:(_Bool)forOffline clickTrackingParams:(id)clickTrackingParams playerParams:(id)playerParams{
    iosLogInfo("videoID=%@,playlistID=%@,playlistIndex=%lld,playbackContext=%@,forOffline=%s,clickTrackingParams=%@,playerParams=%@", videoID, playlistID, playlistIndex, playbackContext, boolToStr(forOffline), clickTrackingParams, playerParams);
    gNoUse = 1;
    id newPlayerReqFactory = %orig;
    iosLogInfo("-> newPlayerReqFactory=%@", newPlayerReqFactory);
    return newPlayerReqFactory;
}

%end

/*------------------------------------------------------------------------------
 YTPlaybackDataLoader
------------------------------------------------------------------------------*/

%hook YTPlaybackDataLoader

- (id)onlinePromise{
    iosLogInfo("%s", "");
    gNoUse = 1;
    id newPromise = %orig;
    iosLogInfo("-> newPromise=%@", newPromise);
    return newPromise;
}

- (id)createPlaybackRequest{
    iosLogInfo("%s", "");
    gNoUse = 1;
    id newReq = %orig;
    iosLogInfo("-> newReq=%@", newReq);
    return newReq;
}

%end

/*------------------------------------------------------------------------------
 YTPlaybackRequestFactory
------------------------------------------------------------------------------*/

%hook YTPlaybackRequestFactory

- (id)playbackRequestForPlayerTransition:(id)playerTransition visibility:(int)visibility viewportSizeProvider:(id)viewportSizeProvider mediaStickySettings:(id)mediaStickySettings prefetchContext:(id)prefetchContext{
    iosLogInfo("playerTransition=%@,visibility=%d,viewportSizeProvider=%@,mediaStickySettings=%@,prefetchContext=%@", playerTransition, visibility, viewportSizeProvider, mediaStickySettings, prefetchContext);
    gNoUse = 1;
    id newPlaybackReqFactory = %orig;
    iosLogInfo("-> newPlaybackReqFactory=%@", newPlaybackReqFactory);
    return newPlaybackReqFactory;
}

%end

/*------------------------------------------------------------------------------
 GPBMessage
------------------------------------------------------------------------------*/

%hook GPBMessage

- (id)data{
    gNoUse = 1;
    id neGpbwData = %orig;
    iosLogInfo("-> neGpbwData=%@", neGpbwData);
    return neGpbwData;
}

%end

/*------------------------------------------------------------------------------
 YTAccountScopedInnerTubeRequestFactory
------------------------------------------------------------------------------*/

%hook YTAccountScopedInnerTubeRequestFactory

- (id)requestForProtoRequest:(id)protoRequest withService:(long long)serviceNumber needsClickTrackingParams:(_Bool)needsClickTrackingParams{
    iosLogInfo("protoRequest=%@,serviceNumber=%lld,needsClickTrackingParams=%s", protoRequest, serviceNumber, boolToStr(needsClickTrackingParams));
    if (ServiceNumber_AdBreak == serviceNumber){
        iosLogInfo("is ServiceNumber_AdBreak: %lld", serviceNumber);
        gNoUse = 1;
    }

    id newRequest = %orig;
    return newRequest;
}

%end

/*------------------------------------------------------------------------------
 YTPlayerBytesSlotFulfillmentAdapter
------------------------------------------------------------------------------*/

%hook YTPlayerBytesSlotFulfillmentAdapter

- (void)fillSlot{
    iosLogInfo("%s", "");
    %orig;
}

%end

/*------------------------------------------------------------------------------
 YTAdBreakMetadataProvider
------------------------------------------------------------------------------*/

%hook YTAdBreakMetadataProvider

+ (id)dataFromMetadata:(id)metadata{
    id data = %orig;
    iosLogInfo("metadata=%@ -> data=%@", metadata, data);
    return data;
}

%end

/*------------------------------------------------------------------------------
 YTAdClientMetadataAbstractProvider
------------------------------------------------------------------------------*/

%hook YTAdClientMetadataAbstractProvider

+ (id)tagName{
    id curTagName = %orig;
    iosLogInfo("curTagName=%@", curTagName);
    return curTagName;
}

%end

/*------------------------------------------------------------------------------
 YTAdClientMetadata
------------------------------------------------------------------------------*/

%hook YTAdClientMetadata

- (id)metadataProviderForProviderName:(id)providerName{
    id metadataProvider = %orig;
    iosLogInfo("providerName=%@ -> metadataProvider=%@", providerName, metadataProvider);
    return metadataProvider;
}

%end

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:03:35

IDA伪代码

IDA伪代码

一些核心的类的IDA伪代码

HAMCronetDataLoadTask

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]

HAMCronetDataLoadTask_startWithDelegate_delegateQueue.coffee

void __cdecl -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:](HAMCronetDataLoadTask *self, SEL a2, id inputDelegate, id inputDispatchQueue)
{
  struct objc_object *dispatchQueue; // x21
  struct objc_object *curDelegate; // x20
  HAMCronetDataLoadTask *curHAMCronetDataLoadTask; // x27
  struct objc_object *dispatchQueue_; // x23
  double absoluteTime; // d0
  __int64 CronetDataLoadTask; // x19
  NSURLRequest *request; // x28
  double timeoutInterval; // d8
  NSDictionary *userInfo; // x26
  struct objc_object *clock; // x24
  Cronet_Engine *engine; // ST30_8
  id request_; // x20
  id clock_; // x22
  HAMCronetDataLoadTask *curHAMCronetDataLoadTask_; // x25
  OS_dispatch_queue **v18; // x27
  __int64 v19; // x0
  Cronet_UrlRequestCallback *cronetUrlRequestCallback; // x21
  id clock__; // x0
  CronetDataLoadTask *CronetDataLoadTask_; // x22
  double clockAbsoluteTime; // d0
  struct objc_object *v24; // x0
  HAMDataLoadTaskObserver *MLHAMDataLoadTaskObserverImpl; // x0
  struct objc_object *v26; // x8
  Cronet_Executor *Cronet_ExecutorPtr; // x0
  void *Cronet_UrlRequestParamsPtr; // x19
  struct objc_object *v29; // x0
  NSString *httpMethod; // x28
  NSString *requestMethod_1; // x0
  char *requestMethodStr; // x0
  struct objc_object *v33; // x0
  id allHTTPHeaderFields; // x21
  struct objc_object *v35; // x0
  id HTTPBody; // x21
  Cronet_UploadDataProvider *Cronet_UploadDataProviderPtr; // x0
  struct objc_object *v38; // x0
  id v39; // x0
  struct objc_object *requestUrl; // x24
  struct objc_object *v41; // x0
  struct objc_object *requestUrlNSString; // x26
  Cronet_Executor *v43; // x5
  int Cronet_RESULT_InitWithParams; // w26
  OS_dispatch_queue *v45; // x0
  void (__fastcall *blockInvokeFunc)(__int64); // x8
  struct objc_object *inputDelegate_1; // x19
  struct objc_object *userInfo_1; // x23
  struct objc_object *dispatchQueue_2; // x24
  int Cronet_RESULT_Start; // w0
  id dispatchQueue_1; // [xsp+8h] [xbp-F8h]
  id userInfo_; // [xsp+10h] [xbp-F0h]
  id inputDelegate_; // [xsp+18h] [xbp-E8h]
  BOOL idempotent; // [xsp+2Ch] [xbp-D4h]
  struct objc_object *object; // [xsp+38h] [xbp-C8h]
  void **stackBlock; // [xsp+40h] [xbp-C0h]
  InternalMetadata v57; // [xsp+48h] [xbp-B8h]
  HasBits<1> v58[2]; // [xsp+50h] [xbp-B0h]
  void *v59; // [xsp+58h] [xbp-A8h]
  CronetDataLoadTask *v60; // [xsp+60h] [xbp-A0h]
  int v61; // [xsp+68h] [xbp-98h]
  void **globalBlock; // [xsp+70h] [xbp-90h]
  __int64 blockFlags; // [xsp+78h] [xbp-88h]
  void (__fastcall *blockInvoke)(__int64, struct objc_object *, struct objc_object *); // [xsp+80h] [xbp-80h]
  void **blockDescriptor; // [xsp+88h] [xbp-78h]
  void *v66; // [xsp+90h] [xbp-70h]

  dispatchQueue = inputDispatchQueue;
  curDelegate = inputDelegate;
  curHAMCronetDataLoadTask = self;
  inputDelegate_ = objc_retain(inputDelegate);
  dispatchQueue_ = objc_retain(dispatchQueue);
  objc_msgSend_3E84298((void *)curHAMCronetDataLoadTask->_clock, "absoluteTime");
  curHAMCronetDataLoadTask->_startTime = absoluteTime;
  CronetDataLoadTask = (__int64)&curHAMCronetDataLoadTask->_task;
  objc_storeStrong((id *)&curHAMCronetDataLoadTask->_task.delegate_, curDelegate);
  request = curHAMCronetDataLoadTask->_request;
  timeoutInterval = curHAMCronetDataLoadTask->_timeoutInterval;
  idempotent = curHAMCronetDataLoadTask->_idempotent;
  userInfo = curHAMCronetDataLoadTask->_userInfo;
  clock = (struct objc_object *)curHAMCronetDataLoadTask->_clock;
  engine = curHAMCronetDataLoadTask->_engine;
  request_ = objc_retain((id)curHAMCronetDataLoadTask->_request);
  userInfo_ = objc_retain((id)userInfo);
  clock_ = objc_retain(clock);
  curHAMCronetDataLoadTask_ = (HAMCronetDataLoadTask *)objc_retain((id)curHAMCronetDataLoadTask);
  dispatchQueue_1 = objc_retain(dispatchQueue_);
  objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.parentTask_, (id)curHAMCronetDataLoadTask);
  objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.URLRequest_, (id)request);
  curHAMCronetDataLoadTask_->_task.timeoutInterval_ = timeoutInterval;
  objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.userInfo_, (id)userInfo);
  objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.clock_, clock);
  v18 = &curHAMCronetDataLoadTask_->_task.queue_;
  objc_storeStrong((id *)&curHAMCronetDataLoadTask_->_task.queue_, dispatchQueue);
  curHAMCronetDataLoadTask_->_task.request_ = (Cronet_UrlRequest *)sub_3DF6D08(v19);
  cronetUrlRequestCallback = (Cronet_UrlRequestCallback *)mallocAndSetResponseCallbacks_3DF91D8(
                                                            (__int64)Cronet_UrlRequestCallback_OnRedirectReceived_194C9D8,
                                                            (__int64)Cronet_UrlRequestCallback_OnResponseStarted_194CCE4,
                                                            (__int64)Cronet_UrlRequestCallback_OnReadCompleted_194CFE8,
                                                            (__int64)Cronet_UrlRequestCallback_OnSucceeded_194D248,
                                                            (__int64)Cronet_UrlRequestCallback_OnFailed_194D310,
                                                            (__int64)Cronet_UrlRequestCallback_OnCanceled_194D5C0);
  setOffest8Value_3DF9198((__int64)cronetUrlRequestCallback, CronetDataLoadTask);
  curHAMCronetDataLoadTask_->_task.callback_ = cronetUrlRequestCallback;
  object = clock_;
  clock__ = clock_;
  CronetDataLoadTask_ = (CronetDataLoadTask *)CronetDataLoadTask;
  objc_msgSend_3E84298(clock__, "absoluteTime");
  curHAMCronetDataLoadTask_->_task.absoluteTime_ = clockAbsoluteTime;
  v24 = (struct objc_object *)InjectOptionalHAMDataLoadTaskObserver();
  MLHAMDataLoadTaskObserverImpl = (HAMDataLoadTaskObserver *)objc_retainAutoreleasedReturnValue_3E842EC(v24);
  v26 = (struct objc_object *)curHAMCronetDataLoadTask_->_task.observer_;
  curHAMCronetDataLoadTask_->_task.observer_ = MLHAMDataLoadTaskObserverImpl;
  objc_release_3E842BC(v26);
  objc_msgSend_3E84298(
    (void *)curHAMCronetDataLoadTask_->_task.observer_,
    "dataLoadTaskDidStart:",
    curHAMCronetDataLoadTask_);
  Cronet_ExecutorPtr = (Cronet_Executor *)Cronet_Executor_CreateWith_3DF9004(Cronet_Executor_ExecuteFunc_194C27C);
  curHAMCronetDataLoadTask_->_task.executor_ = Cronet_ExecutorPtr;
  setOffest8Value_3DF8FF8((__int64)Cronet_ExecutorPtr, CronetDataLoadTask);
  Cronet_UrlRequestParamsPtr = (void *)Cronet_UrlRequestParams_Create_3DFA39C();
  v29 = (struct objc_object *)objc_msgSend_3E84298(request_, "HTTPMethod");
  httpMethod = (NSString *)objc_retainAutoreleasedReturnValue_3E842EC(v29);
  if ( httpMethod )
  {
    requestMethod_1 = (NSString *)objc_retainAutorelease_3E842D4();
    requestMethodStr = (char *)objc_msgSend_3E84298(requestMethod_1, "UTF8String");
    Cronet_UrlRequestParams_http_method_set_3DFA3D0((__int64)Cronet_UrlRequestParamsPtr, (__int64)requestMethodStr);
  }
  if ( idempotent )
    Cronet_UrlRequestParams_idempotency_set_3DFA45C((__int64)Cronet_UrlRequestParamsPtr, 1);// 1=Cronet_UrlRequestParams_IDEMPOTENCY_IDEMPOTENT
  v33 = (struct objc_object *)objc_msgSend_3E84298(request_, "allHTTPHeaderFields");
  allHTTPHeaderFields = objc_retainAutoreleasedReturnValue_3E842EC(v33);
  globalBlock = _NSConcreteGlobalBlock;
  blockFlags = 0xD0800000LL;
  blockInvoke = cornetAddHeader_194C2FC;
  blockDescriptor = (void **)&unk_4EF9AF8;
  v66 = Cronet_UrlRequestParamsPtr;
  objc_msgSend_3E84298(allHTTPHeaderFields, "enumerateKeysAndObjectsUsingBlock:", &globalBlock);
  objc_release_3E842BC(allHTTPHeaderFields);
  v35 = (struct objc_object *)objc_msgSend_3E84298(request_, "HTTPBody");
  HTTPBody = objc_retainAutoreleasedReturnValue_3E842EC(v35);
  if ( objc_msgSend_3E84298(HTTPBody, "length") )
  {
    Cronet_UploadDataProviderPtr = (Cronet_UploadDataProvider *)Cronet_UploadDataProvider_CreateWith_3DF92E0(
                                                                  (__int64)Cronet_UploadDataProvider_GetLengthFunc_194C3C4,
                                                                  (__int64)Cronet_UploadDataProvider_ReadFunc_194C418,
                                                                  (__int64)Cronet_UploadDataProvider_RewindFunc_194C4F4,
                                                                  (__int64)Cronet_UploadDataProvider_CloseFunc_194C51C);
    curHAMCronetDataLoadTask_->_task.uploadDataProvider_ = Cronet_UploadDataProviderPtr;
    setOffest8Value_3DF92A0((__int64)Cronet_UploadDataProviderPtr, (__int64)CronetDataLoadTask_);
    Cronet_UrlRequestParams_upload_data_provider_set_3DFA3EC(
      (__int64)Cronet_UrlRequestParamsPtr,
      (__int64)curHAMCronetDataLoadTask_->_task.uploadDataProvider_);
    Cronet_UrlRequestParams_upload_data_provider_executor_set_3DFA3F4(
      (__int64)Cronet_UrlRequestParamsPtr,
      (__int64)curHAMCronetDataLoadTask_->_task.executor_);
  }
  v38 = (struct objc_object *)objc_msgSend_3E84298(request_, "URL");
  v39 = objc_retainAutoreleasedReturnValue_3E842EC(v38);
  requestUrl = v39;
  v41 = (struct objc_object *)objc_msgSend_3E84298(v39, "absoluteString");
  objc_retainAutoreleasedReturnValue_3E842EC(v41);
  requestUrlNSString = (struct objc_object *)objc_retainAutorelease_3E842D4();
  objc_msgSend_3E84298(requestUrlNSString, "cStringUsingEncoding:", 4LL);
  objc_release_3E842BC(requestUrlNSString);
  objc_release_3E842BC(requestUrl);
  v43 = curHAMCronetDataLoadTask_->_task.executor_;
  Cronet_RESULT_InitWithParams = Cronet_UrlRequest_InitWithParams_3DF931C((__int64)curHAMCronetDataLoadTask_->_task.request_);
  Cronet_UrlRequestParams_Destroy_3DFA3B8(Cronet_UrlRequestParamsPtr);
  if ( Cronet_RESULT_InitWithParams )
  {
    v45 = *v18;
    stackBlock = _NSConcreteStackBlock;
    blockInvokeFunc = InitWithParamsErrorCallback_194C520;
    userInfo_1 = userInfo_;
    inputDelegate_1 = inputDelegate_;
    dispatchQueue_2 = dispatchQueue_1;
LABEL_11:
    v57.var0 = 0xC0000000LL;
    *(_QWORD *)v58[0].var0 = blockInvokeFunc;
    v59 = &unk_4EF9B18;
    v60 = CronetDataLoadTask_;
    v61 = Cronet_RESULT_InitWithParams;
    dispatch_async(v45, &stackBlock);
    goto LABEL_12;
  }
  tryResetTimeoutTimer_194C704(CronetDataLoadTask_);
  Cronet_RESULT_Start = callCronetUrlRequestStart_3DF9338((__int64)curHAMCronetDataLoadTask_->_task.request_);
  userInfo_1 = userInfo_;
  inputDelegate_1 = inputDelegate_;
  dispatchQueue_2 = dispatchQueue_1;
  if ( Cronet_RESULT_Start )
  {
    Cronet_RESULT_InitWithParams = Cronet_RESULT_Start;
    v45 = *v18;
    stackBlock = _NSConcreteStackBlock;
    blockInvokeFunc = startErrorCallback_194C7FC;
    goto LABEL_11;
  }
LABEL_12:
  objc_release_3E842BC(HTTPBody);
  objc_release_3E842BC((id)httpMethod);
  objc_release_3E842BC(dispatchQueue_2);
  objc_release_3E842BC((id)curHAMCronetDataLoadTask_);
  objc_release_3E842BC(object);
  objc_release_3E842BC(userInfo_1);
  objc_release_3E842BC(request_);
  objc_release_3E842BC(dispatchQueue_2);
  objc_release_3E842BC(inputDelegate_1);
}

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:04:29

函数调用逻辑

函数调用逻辑

广告过滤内部调用逻辑，涉及到多个函数多个参数：

disable_ads_filter_logic

disable_ads_filter_logic.coffee

禁用广告过滤时，多次调试

目前的发现的逻辑是：

---

【1】即使是 oad 的 initplayback ，正常返回response，也会返回错误

(1) case 1:

请求：
NSURLRequest requestWithURL:cachePolicy:timeoutInterval
  URL=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
  cachePolicy=0
  timeoutInterval=60.000000

响应：
NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
  url=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
  statusCode=200
  HTTPVersion=(null)
  headerFields={
    "alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
    "cache-control" = "public, max-age=86400";
    "client-protocol" = quic;
    "content-type" = "application/vnd.yt-ump";
    "cross-origin-resource-policy" = "cross-origin";
    date = "Tue, 12 Jul 2022 01:52:01 GMT";
    expires = "Wed, 13 Jul 2022 01:52:01 GMT";
    server = "gvs 1.0";
    vary = Origin;
    "x-content-type-options" = nosniff;
  }

但还是会报错：

NSError errorWithDomain:code:userInfo:
  errDomain=com.google.ios.hamplayer
  code=6000
  userInfo={
    HAMErrorDetails = "cronet=10|internal=-356|quic=85";
    HAMErrorURLRequest = "<NSMutableURLRequest: 0x282833ae0>
      {
        URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
      }";
    HAMRequestNumberLoadTaskKey = 1;
  }

以及：

NSError ml_mediaErrorWithCode:underlyingError:
  arg1=708
  underlyingError=
    Error Domain=com.google.ios.hamplayer
    Code=6000 "(null)"
    UserInfo={
      HAMErrorDetails=cronet=10|internal=-356|quic=85
      HAMRequestNumberLoadTaskKey=1
      HAMErrorURLRequest=<NSMutableURLRequest: 0x282833ae0>
      {
        URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140 }} -> mmewc=Error Domain=YTMediaError Code=708 "(null)" UserInfo={NSUnderlyingError=0x283bda940 {Error Domain=com.google.ios.hamplayer Code=6000 "(null)" UserInfo={HAMErrorDetails=cronet=10|internal=-356|quic=85, HAMRequestNumberLoadTaskKey=1, HAMErrorURLRequest=<NSMutableURLRequest: 0x282833ae0> { URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=be5e83dddc65db9b&initcwndbps=1127500&mt=1657589100&ack=1&cpn=j3M40XDCGhcG1Jgj&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
      }
    }

(2) case 2:

NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
  URL=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
  cachePolicy=0
  timeoutInterval=60.000000

响应：

NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
  url=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
  statusCode=200
  HTTPVersion=(null)
  headerFields={
    "alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
    "cache-control" = "public, max-age=86400";
    "client-protocol" = quic;
    "content-type" = "application/vnd.yt-ump";
    "cross-origin-resource-policy" = "cross-origin";
    date = "Tue, 12 Jul 2022 02:00:07 GMT";
    expires = "Wed, 13 Jul 2022 02:00:07 GMT";
    server = "gvs 1.0";
    vary = Origin;
    "x-content-type-options" = nosniff;
  }

也还是会报错：

NSError errorWithDomain:code:userInfo:
  errDomain=com.google.ios.hamplayer
  code=6000
  userInfo={
    HAMErrorDetails = "cronet=10|internal=-356|quic=85";
    HAMErrorURLRequest = "<NSMutableURLRequest: 0x2828fc1b0> {
       URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
    }";
    HAMRequestNumberLoadTaskKey = 1;
  }

以及：

NSError HAMErrorWithCode:userInfo:
  reqUrl=https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140

以及：

NSError ml_mediaErrorWithCode:underlyingError:
  arg1=708
  underlyingError=
    Error Domain=com.google.ios.hamplayer
    Code=6000 "(null)"
    UserInfo={
      HAMErrorDetails=cronet=10|internal=-356|quic=85
      HAMRequestNumberLoadTaskKey=1
      HAMErrorURLRequest=<NSMutableURLRequest: 0x2828fc1b0> {
        URL: https://rr2---sn-phvo-jpqe.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=38d955056e41c6f3&initcwndbps=1195000&mt=1657590782&ack=1&cpn=SKSZKIy7lZZ2pxor&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140
      }
    }

【2】即使是 ctier=L 的 videoplayback，在 前几次请求（rn=1、rn=2等）时，正常返回response，也会报错

(1) rn=1 的 ctier=L

NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
  URL=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1
  cachePolicy=0
  timeoutInterval=60.000000

也还是会报错：

NSError errorWithDomain:code:userInfo:
  reqUrl=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1

以及：

NSError HAMErrorWithCode:userInfo:
  reqUrl=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=1

(2) rn=2 的 ctier=L

正常响应，但也报错：

NSHTTPURLResponse initWithURL:statusCode:HTTPVersionLheaderFields:
  url=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=2
  statusCode=200
  HTTPVersion=(null)
  headerFields={
    "alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
    "cache-control" = "private, max-age=21041";
    "client-protocol" = quic;
    "content-type" = "application/vnd.yt-ump";
    "cross-origin-resource-policy" = "cross-origin";
    date = "Tue, 12 Jul 2022 02:14:24 GMT";
    expires = "Tue, 12 Jul 2022 02:14:24 GMT";
    server = "gvs 1.0";
    vary = Origin;
    "x-content-type-options" = nosniff;
  }

但也会报错：

NSError errorWithDomain:code:userInfo:

【3】当 rn=2 或 rn=3 时的 ctier=L 就正常了，不报错了，能正常返回数据了

(1) rn=3 的 ctier=L

NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
  URL=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=3
  cachePolicy=0
  timeoutInterval=60.000000

响应：

NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
  url=https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657613405&ei=_dfMYqC2IuGajQTGv7PYAw&ip=162.253.45.206&id=o-AIjeweHrLqp_Pz6Ozv20T5JprNQBR0HmN6o8txqvBehU&source=youtube&requiressl=yes&mh=GE&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnlk&ms=au,rdu&mv=m&mvi=2&pl=22&ctier=L&initcwndbps=1213750&svpuc=1&sabr=1&mt=1657591502&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgVsPJepnUO4V9FcfXV3OqVZtNkVp5xDAw-jIIOVaPqpUCID1hXsWyAMG-_A41aRCm2HF5eqtfDTt5IJs_ATne2Jfz&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgTJgONnp0_iio87Dj5f9DciH8TzxX_zPCs1clwp4poqACIDPhiXjWBAuAs9GAhBSD11lyHobe7EfWyHSV4Eoixwhh&cpn=aFN2DnMpoKgorDiB&rn=3
  statusCode=200
  HTTPVersion=(null)
  headerFields={
    "alt-svc" = "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"";
    "cache-control" = "private, max-age=20802";
    "client-protocol" = quic;
    "content-type" = "application/vnd.yt-ump";
    "cross-origin-resource-policy" = "cross-origin";
    date = "Tue, 12 Jul 2022 02:18:23 GMT";
    expires = "Tue, 12 Jul 2022 02:18:23 GMT";
    server = "gvs 1.0";
    vary = Origin;
    "x-content-type-options" = nosniff;
  }

(2) rn=2 的 ctier=L，且能正常返回视频数据chunks

MLServerABRLoader dataLoadTask:didReceiveResponse:
  arg1=<MLServerABRDataLoadTask: 0x285a0bb70>
  didReceiveResponse=<NSHTTPURLResponse: 0x280dae440>
    {
      URL: https://rr1---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657615602&ei=kuDMYrOaBpHDigT5y4LYDw&ip=162.253.45.206&id=o-AMkZiBzQ6p7kCJW94A6DtyMGG3HfqwKg1KnZ-fNzwp2U&source=youtube&requiressl=yes&mh=Mk&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknsk&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=22&ctier=L&initcwndbps=1266250&svpuc=1&sabr=1&mt=1657593666&fvip=4&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgAqEYZlR2jQz3cDKbLMWJKMhZa_JyTS1vtd_9O64WLDkCIQDfL32Gx3XA9C4XUvNdiiXvM8TQjClSjAv2N0B2bt-flw%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRgIhAJ8F9p0MlD7yBXsonsAKJ95tApty4njmPKzuAFqoM81WAiEAlFcqzn3LXLCxMMe_WxKUJOd4L9uLrZ7oP_BtbspIFBY%3D&cpn=tuURUWDAKHN5FNX8&rn=2
    }
    {
      Status Code: 200
      Headers {
        "Cache-Control" =     (
            "private, max-age=20896"
        );
        "Content-Type" =     (
            "application/vnd.yt-ump"
        );
        Date =     (
            "Tue, 12 Jul 2022 02:53:26 GMT"
        );
        Expires =     (
            "Tue, 12 Jul 2022 02:53:26 GMT"
        );
        Server =     (
            "gvs 1.0"
        );
        Vary =     (
            Origin
        );
        "alt-svc" =     (
            "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\""
        );
        "client-protocol" =     (
            quic
        );
        "cross-origin-resource-policy" =     (
            "cross-origin"
        );
        "x-content-type-options" =     (
            nosniff
        );
      }
    }

MLServerABRLoader dataLoadTask:didReceiveData:
  arg1=<MLServerABRDataLoadTask: 0x285a0bb70>
  didReceiveData={length = 65536, bytes = 0x235908d0 fa0610d0 fa0618e0 d4033a4b ... 4286a906 e50ad07b }

不过后续此处 rn=2 的 ctier=L 也报错了：

NSError errorWithDomain:code:userInfo:
  https://rr1---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1657615602&ei=kuDMYrOaBpHDigT5y4LYDw&ip=162.253.45.206&id=o-AMkZiBzQ6p7kCJW94A6DtyMGG3HfqwKg1KnZ-fNzwp2U&source=youtube&requiressl=yes&mh=Mk&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknsk&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=22&ctier=L&initcwndbps=1266250&svpuc=1&sabr=1&mt=1657593666&fvip=4&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgAqEYZlR2jQz3cDKbLMWJKMhZa_JyTS1vtd_9O64WLDkCIQDfL32Gx3XA9C4XUvNdiiXvM8TQjClSjAv2N0B2bt-flw%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRgIhAJ8F9p0MlD7yBXsonsAKJ95tApty4njmPKzuAFqoM81WAiEAlFcqzn3LXLCxMMe_WxKUJOd4L9uLrZ7oP_BtbspIFBY%3D&cpn=tuURUWDAKHN5FNX8&rn=2

youtubeCallSequence

内部多个函数的调用过程：最初是从播放时间变成0开始分析，慢慢找到的函数调用逻辑

其中最核心的几个函数：

请求request

NSURLRequest requestWithURL:cachePolicy:timeoutInterval:

NSURLRequest initWithURL:cachePolicy:timeoutInterval:

响应response

NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:

其他

Cronet

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]

全部内容详见：

youtubeCallSequence.coffee

最后更新: 20220823

================================================================================

【第一个广告视频ID的产生来源：googlevideo.com/initplayback】

--------------------------------------------------------------------------------

最早的 initplayback 的 request (的 http body 的 data )的来源：

YTPlaybackDataLoader onlinePromise
    YTPlaybackDataLoader createPlaybackRequest
        YTPlaybackRequestFactory playbackRequestForPlayerTransition:visibility:viewportSizeProvider:mediaStickySettings:prefetchContext:
            YTPlaybackRequestFactory playbackRequestForNavigationEndpoint:autoplay:autonav:flungFromMDX:expiredForSeconds:visibility:viewportSizeProvider:mediaStickySettings:playerRequestDecorator:prefetchContext:latencyLogger:watchEndpointLoggingContext:
                YTPlaybackRequest initWithProtoRequest:URLRequestProperties:CPN:QOEController:latencyLogger:
                    参数:
                        URLRequestProperties={
                            MLOnesieRequestContext = "<MLOnesieRequestContext: 0x28240cd80>";
                            inline = 1;
                        }
                YTPlayerRequestFactory innerTubeRequestForPlayerWithVideoID:playlistID:playlistIndex:playbackContext:forOffline:clickTrackingParams:playerParams:
                    参数:
                        videoID=DpJ7BL6RdFM
                        playlistID=(null)
                        playlistIndex=0
                        playbackContext=<YTIPlaybackContext 0x282fbc480>: {
                            content_playback_context {
                                time_since_last_ad_seconds: 0
                                lact_milliseconds: 1834558
                                autoplays_since_last_ad: 0
                                conn: 3
                                vis: 5
                                fling: false
                                autoplay: true
                                adsense_client_params: "video_format=22&sdkv=i.17.08&output=xml_vast2"
                                autonav: true
                            }
                        }
                        forOffline=False
                        clickTrackingParams={length = 26, bytes = 0x08001084 67221308 95b584e3 95ddf902 ... d494091d 560607d6 }
                        playerParams=CkkIDxAGQhd3LU1FWTViSkRJUE5vOWtQaU1tdHlBa4oDKSADKAIwBzgFShMI1raF45Xd-QIVg-YoBR2IZAuZUgYIBT........TElUWV0mZ3Y9W0dPT0dMRV9WSUVXQUJJTElUWV0Y0A8YAfAEAfgEAQ%3D%3D

                    返回值:
                        <YTIPlayerRequest 0x2838233a0>: {
                            context {
                                client {
                                    hl: "zh-CN"
                                    gl: "CN"
                                    device_make: "Apple"
                                    device_model: "iPhone9,1"
                                    client_name: IOS
                                    client_version: "17.08.2"
                                    os_name: "iOS"
                                    os_version: "13.3.1.17D50"
                                    raw_device_id: "FC1C0EA4-13EB-4B2E-AB49-32609F28DC8B"
                                    screen_width_points: 375
                                    screen_height_points: 667
                                    screen_pixel_density: 2
                                    client_form_factor: SMALL_FORM_FACTOR
                                    window_width_points: 375
                                    window_height_points: 667
                                    connection_type: CONN_WIFI
                                    config_info {
                                        cold_config_data: "CMvakJgGENLcrQUQjPKtBRCl760FEMaFrQUQmNStBRCFta4FEKedrgUQgYauBRDXka0FEOK5rgUQx7GtBRCHqq4FEJOvrgUQhqGuBRCBxa0FEI6lrQUQkJmuBRCvs64FEOW4rgUQz4WuBRDxuq0FEIjprQUQj5SuBRDBvK4FEIy9rgUQxZquBRDtiq0FELytrgUQjZSuBRDqna0FEL22rgUQqM-oFxCcva4FEJyxrgUQy6KuBRD0x60FEIH4rQUQuIuuBRDUg64FEKmqrgUQnv2tBRCFka4FELTPqBcQibGuBRD3iK4FEOK8rgUQ0_GtBRDYvK4FEIG4rgUQpbCuBRCboK4FENm7rQUQ4a2uBRCX-60FEMWFrgUQt8utBRDrma0FEJaarQUQzeCtBRDr5K0FEPy6rgUQ6pesBRDX9a0FEO-3rgUaMkFDS0c1cG5XU0dZOFRhMFRnNkJ5VjlieWtLUGRUVmxQUkxCWHhkRktXclJ5XzVNNmxRIjJBQ0tHNXBuV1NHWThUYTBUZzZCeVY5YnlrS1BkVFZsUFJMQlh4ZEZLV3JSeV81TTZsUSoYQ0FNU0RBMERzTXlxQWhVRGdvdTVEQT09"
                                        cold_hash_data: "CPnFk5gGEhQxMTU5NDYyMDIxMjM1NDQwNDMxOBjL2pCYBii0z6gXKOK8rgUoibGuBSj3iK4FKJugrgUogbiuBSilsK4FKNi8rgUo0_GtBSiB-K0FKMuirgUonLGuBSiFka4FKJ79rQUouIuuBSipqq4FKPTHrQUo1IOuBSj8uq4FKNf1rQUo77euBSjql6wFKJf7rQUo4a2uBSjZu60FKLfLrQUolpqtBSjr5K0FKMWFrgUo65mtBSjN4K0FKJOvrgUoh6quBSjXka0FKOK5rgUox7GtBSiOpa0FKK-zrgUokJmuBSiBxa0FKIahrgUo0tytBSinna4FKMaFrQUogYauBSil760FKIW1rgUojPKtBSjqna0FKI2UrgUovK2uBSi9tq4FKJjUrQUoxZquBSjtiq0FKKjPqBconL2uBSjxuq0FKIjprQUoj5SuBSjluK4FKIy9rgUoz4WuBSjBvK4FMjJBQ0tHNXBuV1NHWThUYTBUZzZCeVY5YnlrS1BkVFZsUFJMQlh4ZEZLV3JSeV81TTZsUToyQUNLRzVwbldTR1k4VGEwVGc2QnlWOWJ5a0tQZFRWbFBSTEJYeGRGS1dyUnlfNU02bFFCGENBTVNEQTBEc015cUFoVURnb3U1REE9PQ%3D%3D"
                                        hot_hash_data: "CPnFk5gGEhQxNjEzNDg0MTcwMTQ4MTYyODk3Nxj5xZOYBijJ-f0SKPne_RIo1P_9EiiRvv0SKIPt_RIoy639Eijc4P0SKOK__RIo0979Eii7_v0SKILG_RIopdD9Eijizv0SKNLL_RIopqr9EiiFrP0SKKXv_RIonv_8EijI8f0SKL3K_RIope39EijU-f0SKIrg_RIo4az9EiibzP0SKNfM_RIomcb9EiiLqP0SKM7A_RIolOT8EiifgP4SKLn1_BIo89_9EijC_v0SKMvs_RIoytj9EiikxP0SKNGf_RIoyvD9EiiZ-f0SKML2_RIovL79EijGsv0SKNCy_RIo3JP9EiiqtP0SKOO4_RIo4Oz9Eiir1v0SKOPJ_RIo-Pn9EiiBgv0SKKbw_RIoqar9Eii93v0SKMTs_RIyMkFDS0c1cG5XU0dZOFRhMFRnNkJ5VjlieWtLUGRUVmxQUkxCWHhkRktXclJ5XzVNNmxROjJBQ0tHNXBuV1NHWThUYTBUZzZCeVY5YnlrS1BkVFZsUFJMQlh4ZEZLV3JSeV81TTZsUUIcQ0FNU0VRMEJvdGY2RlpzcEZRRGR6OElNbk13RQ%3D%3D"
                                    }
                                    screen_density_float: 2
                                    utc_offset_minutes: 480
                                    user_interface_theme: USER_INTERFACE_THEME_DARK
                                    time_zone: "Asia/Shanghai"
                                    eml_template_context: " \313\334\314\373\331\206\352\310\001 \206\327\321\205\205\213\346\323\361\001 \212\221\203\351\370\266\265\3168 \270\361\327\226\250\315\324\301) \221\307\376\333\240\306\304\357\370\001 \204\255\254\350\361\275\307\370\203\001 \365\360\247\340\223\316\264\322\016 \263\301\327\347\206\371\271\266. \320\301\200\233\321\362\214\245\027 \220\364\314\240\332\360\264\300\314\001 \270\365\242\255\321\241\372\326y \360\322\224\360\247\344\261\322\033 \310\335\301\224\261\262\275\372> \346\261\374\316\345\221\323\350\321\001 \217\375\340\345\313\225\361\264% \206\370\205\214\332\344\367\272\247\001 \343\237\335\242\271\344\250\261\023 \333\236\251\262\323\323\306\322\200\001 \201\311\332\214\371\363\217\252\267\001 \223\240\255\221\227\300\300\301\267\001 \332\271\246\252\206\257\225\273~ \214\327\321\232\303\213\204\363\251\001 \250\321\220\302\333\240\347\222\327\001 \307\306\342\230\345\316\241\330~ \233\311\261\225\335\357\225\226\030 \214\222\262\254\377\315\326\267\365\001 \207\251\305\212\325\337\205\206\345\001 \252\207\217\352\236\264\232\265r"
                                    memory_total_kbytes: 2099249
                                    notification_permission_info {
                                        notifications_setting: NOTIFICATIONS_SETTING_ENABLED
                                        last_device_opt_in_change_time_ago_sec: 5707596
                                    }
                                    client_store_info {
                                        ios_store_country: "CHN"
                                    }
                                }
                                user {
                                }
                                request {
                                }
                                click_tracking {
                                    click_tracking_params: "\010\000\020\204g\"\023\010\225\265\204\343\225\335\371\002\025=\324\224\t\035V\006\007\326"
                                }
                                ad_signals_info {
                                    params {
                                        key: "ms"
                                        value: "zNCgkMGJRpQCc6aMdpeOGv6ez_sOHNtGlWj7lg6EjWr7O7ZqIEwzYOOSsfzRnPhx3kY3I33makVsgrtFOzKammmPQqrf9Jq_eK18MyBdl-obQx_U8oanWw-_NlQf7l191piuk2G3xzWMnXXln426o9M5jcbqwVPf5Nf8opchuOQBNPYwEbDXj6uTpkZl47lPLlO0BZpF5xWpjI14zuD3co0YMnBQHEcZv3AKQlp0UEksZdiohp69QkO1ZoUPZrZrjty7kzuy6swSY7C5Baex2ZA11fj7Qkd_oxnqRxRlsMQuxaBF5CjfVUE5DMAQyxDg3aC3iCqE83h7TJTnSRhOIQ"
                                    }
                                }
                            }
                            video_id: "DpJ7BL6RdFM"
                            playback_context {
                                content_playback_context {
                                    time_since_last_ad_seconds: 0
                                    lact_milliseconds: 1834558
                                    autoplays_since_last_ad: 0
                                    conn: 3
                                    vis: 5
                                    fling: false
                                    autoplay: true
                                    adsense_client_params: "video_format=22&sdkv=i.17.08&output=xml_vast2"
                                    autonav: true
                                    mdx_context { mdx_context {} }
                                }
                            }
                            racy_check_ok: false
                            for_offline: false
                            params: "CkkIDxAGQhd3LU1FWTViSkRJUE5vOWtQaU1tdHlBa4oDKSADKAIwBzgFShMI1raF45Xd-QIVg-YoBR2IZAuZUgYIBTABWAFoAXAJEpkaEpYaCAESkRoSDXByb21vdGVkVmlkZW9K_xkIARL6GSKpCwgTEp0LaHR0cHM6Ly93d3cuZ29vZ2xl ... ... tDTElDS19NU10mYWRfbXQ9W0FEX01UXSZhY3Z3PVtWSUVXQUJJTElUWV0mZ3Y9W0dPT0dMRV9WSUVXQUJJTElUWV0Y0A8YAfAEAfgEAQ%3D%3D"
                            cpn: "Fmq_1vPSmpZkjLS0"
                            override_muted_at_start: false
                            caption_params {
                                device_captions_on: false
                            }
                            video_quality_setting_params {
                                video_quality_setting_mobile_network: VIDEO_QUALITY_SETTING_UNKNOWN
                                video_quality_setting_wifi: VIDEO_QUALITY_SETTING_UNKNOWN
                                video_quality_last_written_ms: 0
                            }
                        }

                    YTIPlayerRequest init
                        GPBMessage

注：

GPBMessage ~= General Protocol Buffer Message

--------------------------------------------------------------------------------

调用 HAMDataLoadRequest 时 传入了 POST的application/x-protobuf的NSData：

Module_Framework`-[YTTimedAction startTimerWithFireDate:timeInterval:repeats:runLoopMode:]_block + 40
    Module_Framework`-[YTTimedAction triggerAction] + 124
        YouTube`-[YTInlineMutedPlaybackContainerController startPlaybackImmediately] + 324
            YouTube`-[YTInlineMutedPlaybackWatchController loadVideoAndAttachView:] + 256
                Module_Framework`-[YTPlayerViewController prepareToLoadWithPlayerTransition:expectedLayout:] + 276
                    Module_Framework`-[YTLocalPlaybackController prepareToLoadWithPlayerTransition:expectedLayout:] + 556
                        Module_Framework`-[YTPlaybackDataLoader startLoading] + 1060
                            Module_Framework`-[YTPlaybackDataLoader onlinePromise] + 332
                                Module_Framework`-[YTPlayerService makePlaybackRequest:responseBlock:errorBlock:] + 524
                                    Module_Framework`-[YTPlayerServiceTask sendRequest] + 248
                                        Module_Framework`-[YTInnerTubeRequestor makeInnerTubeRequest:withParser:completionBlock:retryEnabled:timeoutInterval:enableLatencyTicks:mutableSharedData:] + 28
                                            Module_Framework`-[YTInnerTubeRequestor makeInnerTubeRequest:withParser:completionBlock:retryEnabled:timeoutInterval:enableLatencyTicks:mutableSharedData:nilIdentityIsSignedOut:] + 36
                                                Module_Framework`-[YTBaseInnerTubeService makePOSTRequest:withParser:completionBlock:retryEnabled:timeoutInterval:enableLatencyTicks:mutableSharedData:nilIdentityIsSignedOut:] + 540
                                                    Module_Framework`-[YTBaseInnerTubeService performHTTPRequest:service:withIdentity:dataBlock:errorBlock:retryEnabled:nilIdentityIsSignedOut:] + 628
                                                        Module_Framework`-[YTVisitorDataRequestDecorator decorateRequest:withCompletionBlock:] + 260
                                                            sub_186AB30 = Module_Framework`___lldb_unnamed_symbol14785$$Module_Framework + 608
                                                                Module_Framework`-[YTBaseNetworkService performHTTPRequest:withAuthorizer:responseBlock:errorBlock:retryConfig:] + 184
                                                                    Module_Framework`-[YTBaseNetworkService performHTTPRequest:withAuthorizer:backgroundCompletionBlock:retryConfig:] + 928
                                                                        Module_Framework`-[MLOnesieUMPFetcherTask resume] + 208
                                                                            Module_Framework`-[MLOnesieRequestFactory onesieRequestForPlayerRequest:authorization:dataLoader:context:cryptor:requestNumber:completionHandler:] + 432
                                                                                Module_Framework`-[MLOnesieRequestFactory onesieRequestForPlayerRequest:authorization:dataLoader:context:cryptor:requestNumber:completionHandler:]_block + 64
                                                                                    Module_Framework`-[MLOnesieRequestFactory onesieRequestForPlayerRequest:dataLoader:context:cryptor:requestNumber:error:] + 5628
                                                                                        参数:
                                                                                            request=<NSMutableURLRequest: 0x282e83150> {
                                                                                                URL: "https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc&id=r17kWuxKXKs&t=DA5C7286-F10C-4EBC-942E-96B8CA551C57"
                                                                                            }
                                                                                            dataLoader=<HAMCronetDataLoader: 0x283c621f0>
                                                                                            context=<MLOnesieRequestContext: 0x2809ae3a0>
                                                                                            cryptor=<MLOnesiePlayerServiceCryptor: 0x283c68930>
                                                                                            requestNumber=1
                                                                                            error=0x16d760c08

                                                                                        HAMDataLoadRequest initWithRangedURL:timeoutInterval:HTTPMethod:HTTPContentType:HTTPBody:idempotent:
                                                                                            参数:
                                                                                                rangeUrl=<HAMRangedURL: 0x281963320>
                                                                                                    URL = "https://rr1---sn-hp57kndr.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&rbqsm=fr&msp=1&odeak=1&odepv=1&osfc=1&id=fd97bcf151a359c8&initcwndbps=1645000&mt=1661156982&pxtags=Cg4KAnR4EggyNDE5NzI3NQ&rxtags=Cg4KAnR4EggyNDE5NzI3NQ,Cg4KAnR4EggyNDE5NzI3Ng,Cg4KAnR4EggyNDE5NzI3Nw&ack=1&cpn=AuykYLjoeyBPVKWO&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140"
                                                                                                timeoutInterval=60
                                                                                                HTTPMethod="POST"
                                                                                                HTTPContentType="application/x-protobuf"
                                                                                                HTTPBody=7647 bytes
                                                                                                idempotent=true

--------------------------------------------------------------------------------

googlevideo.com/initplayback 的调用顺序：

[case 1]

MLOnesieUMPFetcherTask onRequestFactoryCompletionWithRequest:error:
    参数:
        request=<HAMDataLoadRequest: 0x282027040>
            _idempotent (BOOL): YES
            _rangedURL (HAMRangedURL*): <HAMRangedURL: 0x283831120>
            _timeoutInterval (double): 60
            _HTTPMethod (NSString*): @"POST"
            _HTTPContentType (NSString*): @"application/x-protobuf"
            _HTTPBody (NSData*): <NSConcreteData: 0x283831140>
        error=(null)

    startRequestTask_104238C = -[MLOnesieUMPFetcherTask onRequestFactoryCompletionWithRequest:error:]_block + 64
        -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
            -[HAMDataLoadRequest buildURLRequest] + 140
                NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
                    参数:
                        URL="https://rr5---sn-p5qddn76.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&rbqsm=fr&msp=1&odeak=1&odepv=1&osfc=1&id=a52feece777301a2&initcwndbps=1786250&mt=1660899670&pxtags=Cg4KAnR4EggyNDE5NzI3NQ&rxtags=Cg4KAnR4EggyNDE5NzI3NQ,Cg4KAnR4EggyNDE5NzI3Ng,Cg4KAnR4EggyNDE5NzI3Nw&ack=1&cpn=Bu494mABvg3R6sCr&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140"
                        cachePolicy=NSURLRequestUseProtocolCachePolicy
                        timeoutInterval=60

[case 2]

callPrewarmConnection_10470B8
    startTask_1048AA0 = ___lldb_unnamed_symbol12576$$Module_Framework + 72
        -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
            -[HAMDataLoadRequest buildURLRequest] + 380
                NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
                    参数:
                        URL="https://rr2---sn-p5qs7nsr.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&rbqsm=fr&msp=1&odeak=1&odepv=1&osfc=1&id=8bfb111f4c684ce5&initcwndbps=1683750&mt=1660916238&pxtags=Cg4KAnR4EggyNDE5NzI3NQ&rxtags=Cg4KAnR4EggyNDE5NzI3NQ,Cg4KAnR4EggyNDE5NzI3Ng,Cg4KAnR4EggyNDE5NzI3Nw&cpn=YCXS_oBo1TcIotC0&pai=0&pvi=0&owc=1"
                        cachePolicy=NSURLRequestUseProtocolCachePolicy
                        timeoutInterval=60

--------------------------------------------------------------------------------

MLServerABRLoader dataLoadTask:didReceiveData: 的后续response的data的parse解析过程

当 禁用广告过滤 正常加载广告时的流程：

(1) MLServerABRLoader -> HAMMP4InitializationChunk

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36
    -[MLServerABRDataLoadTask dataLoadTask:didReceiveData:] + 292
        MLServerABRLoader dataLoadTask:didReceiveData:
            serverABRUMPParserParseResponseData_FE2F90 = ___lldb_unnamed_symbol12192$$Module_Framework + 136
                parserParseData_32CAA84 = ___lldb_unnamed_symbol84370$$Module_Framework + 160
                    extractMediaHeaderBytes_32CAC60
                    callParseData_32CAE80 = ___lldb_unnamed_symbol84372$$Module_Framework + 52
                        sub_FE4C80 = ___lldb_unnamed_symbol12224$$Module_Framework
                            BaseUMPParser_parseData_FE37D4 = ___lldb_unnamed_symbol12209$$Module_Framework + 172
                                citer 的 videoplayback
                                    for youtube::media::ServerABRUMPParser + 16 => checkMediaHeaderUmpBadPartid_107DD4C = ___lldb_unnamed_symbol12801$$Module_Framework
                                        MLQOEError QOEErrorWithCode:details:
                                            参数：
                                                code=ump.badpartid
                                                details={ partid = 0xA; }

                                其他情况，比如: 正常流程 或  oad 的 initplayback
                                    for youtube::media::OnesieUMPParser + 504 => checkMediaHeaderUmpBadPartid_1046494 = ___lldb_unnamed_symbol12555$$Module_Framework
                                        toCallProcessMediaHeader_FE2EB0 = ___lldb_unnamed_symbol12191$$Module_Framework + 108
                                            validateMediaHeader_FE72BC = ___lldb_unnamed_symbol12318$$Module_Framework + 144
                                                parseAndSaveChunk_107D850 = ___lldb_unnamed_symbol12797$$Module_Framework + 64
                                                    -[MLServerABRLoader chunkForMediaHeader:] + 324
                                                        -[MLMP4ChunkFactory initializationChunkWithURL:] + 72
                                                            HAMMP4InitializationChunk initWithFormat:rangedURL:preferTrackTimescale:
                                                                参数： case 1
                                                                    arg1=0x0000000282ca6b80
                                                                    arg2=0x000000028116c800
                                                                    arg3=false

(2) MLOnesieUMPFetcherTask -> HAMMP4InitializationChunk

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36
    -[MLOnesieUMPFetcherTask dataLoadTask:didReceiveData:] + 196
        ___lldb_unnamed_symbol12192$$Module_Framework + 136
            ___lldb_unnamed_symbol84370$$Module_Framework + 160
                ___lldb_unnamed_symbol84372$$Module_Framework + 52
                    ___lldb_unnamed_symbol12209$$Module_Framework + 312
                        sub_1045904 = ___lldb_unnamed_symbol12549$$Module_Framework + 168
                            ___lldb_unnamed_symbol12191$$Module_Framework + 108
                                processOnesieMediaHeader_10482D8 = ___lldb_unnamed_symbol12575$$Module_Framework + 1120
                                    -[MLMP4ChunkFactory initializationChunkWithURL:] + 72
                                        HAMMP4InitializationChunk initWithFormat:rangedURL:preferTrackTimescale:

(3) MLServerABRDataLoadTask -> HAMChunk

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36
    -[MLServerABRDataLoadTask dataLoadTask:didReceiveData:] + 292
        ___lldb_unnamed_symbol12192$$Module_Framework + 136
            ___lldb_unnamed_symbol84370$$Module_Framework + 160
                ___lldb_unnamed_symbol84372$$Module_Framework + 52
                    ___lldb_unnamed_symbol12209$$Module_Framework + 336
                        sub_107DAB0 = ___lldb_unnamed_symbol12800$$Module_Framework + 232
                            HAMChunk loadDidCompleteWithError:

(4) MLOnesieChunkLoadTask -> HAMChunk

-[MLOnesieChunkLoadTask initWithRange:chunks:dataBuffer:cache:delegate:queue:latencyLogger:]_block_block + 100
    -[HAMBaseChunkLoadTask didReceiveData:error:] + 656
        -[HAMBaseChunkLoadTask currentChunkDidComplete] + 256
            -[HAMMediaChunk loadDidCompleteWithError:] + 48
                HAMChunk loadDidCompleteWithError:

(5) -> MLServerABRLoader recordInvalidFormatQOEErrorWithFormatID:extraDetails:

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36
    -[MLServerABRDataLoadTask dataLoadTask:didReceiveData:] + 292
        ___lldb_unnamed_symbol12192$$Module_Framework + 136
            ___lldb_unnamed_symbol84370$$Module_Framework + 160
                ___lldb_unnamed_symbol84372$$Module_Framework + 52
                    ___lldb_unnamed_symbol12209$$Module_Framework + 624
                        chekAndCallProcessMediaHeader_FE43F4 = ___lldb_unnamed_symbol12214$$Module_Framework + 276
                            ___lldb_unnamed_symbol12191$$Module_Framework + 108
                                void youtube::media::BaseUMPParser::AccumulateDataAndParseProto<video_streaming::FormatInitializationMetadata>(unsigned int, absl::string_view, video_streaming::UMPPartID, std::__1::function<void (video_streaming::FormatInitializationMetadata)>)::'lambda'(absl::string_view)::operator()(absl::string_view) const + 436
                                    sub_FE61AC = ___lldb_unnamed_symbol12275$$Module_Framework + 160
                                        callDidParseFormatInitializationMetadata_107E5FC = ___lldb_unnamed_symbol12805$$Module_Framework + 44
                                            -[MLServerABRLoader didParseFormatInitializationMetadata:] + 268
                                                MLServerABRLoader recordInvalidFormatQOEErrorWithFormatID:extraDetails:
                                                    参数:
                                                        formatID="140_1629449114196897"
                                                        extraDetails="init_metadata_badid"

相关函数:

[callParseData_32CAE80]
核心代码逻辑：
  return (*(*curServerABRUMPParserOffset0x20Value + 0x30LL))();//
                                                // call: sub_FE4C80 = ___lldb_unnamed_symbol12224:
                                                //   x0 = curServerABRUMPParserOffset0x20Value
                                                //   x1 = curServerABRUMPParserOffset0x40Ptr
                                                //   x2 = remainBufferSizePtr
                                                //   x3 = mediaHeaderBytesPtr

[sub_FE4C80]
核心逻辑：
  return BaseUMPParser_parseData_FE37D4(*(_QWORD *)(a1 + 8), *a2, *a3, *a4);

[BaseUMPParser_parseData_FE37D4]
核心逻辑：
    result = (*(__int64 (**)(void))(*(_QWORD *)result + 0x70LL))();
    // 实际调试 = 出错流程？: checkMediaHeaderUmpBadPartid_107DD4C

[chekAndCallProcessMediaHeader_FE43F4]
核心逻辑：
    toCallProcessMediaHeader_FE2EB0(v10, v9, v8, v7, (__int64)&v21);

[toCallProcessMediaHeader_FE2EB0]
核心逻辑：
    result = (*(__int64 (**)(void))(*(_QWORD *)v9 + 0x30LL))();
    // for MLServerABRDataLoadTask(MLServerABRLoader) is: validateMediaHeader_FE72BC
    // for MLOnesieUMPFetcherTask is: processOnesieMediaHeader_10482D8

[validateMediaHeader_FE72BC]
核心逻辑：
    (*(void (__fastcall **)(__int64, char *))(*(_QWORD *)v2 + 32LL))(v2, &v10); // = parseAndSaveChunk_107D850

[parseAndSaveChunk_107D850]
核心逻辑：
  v7 = (struct objc_object *)objc_msgSend_3E84298(curMLServerABRLoader_, "chunkForMediaHeader:", mediaHeader);

[youtube::media::BaseUMPParser::AccumulateDataAndParseProto<video_streaming::FormatInitializationMetadata>(unsigned int,absl::string_view,video_streaming::UMPPartID,std::__1::function<void ()(video_streaming::FormatInitializationMetadata)>)::{lambda(absl::string_view)]
核心逻辑：
  (*(void (**)(void))(*(_QWORD *)v20 + 0x30LL))(); // sub_FE61AC

[sub_FE61AC]
核心逻辑：
  (*(void (**)(void))(**(_QWORD **)(v3 + 8) + 0x50LL))();// callDidParseFormatInitializationMetadata_107E5FC

================================================================================

ctier 重发请求 死循环的调用逻辑：

-[MLServerABRLoader continueLoading]
    shouldSendRequest==True:
        -[MLServerABRDataLoader createDataLoadTaskForRequest:] + 128
            -[MLServerABRDataLoader dataLoadTaskForHTTPBody:isPrimaryHostProbing:] + 424
                -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
                    -[HAMDataLoadRequest buildURLRequest] + 140
                        NSURLRequest requestWithURL:cachePolicy:timeoutInterval:

        -[MLServerABRDataLoadTask startWithDelegate:delegateQueue:] + 88
            HAMCronetDataLoadTask startWithDelegate:delegateQueue:
                Cronet_UrlRequestCallback_OnResponseStarted_194CCE4 = ___lldb_unnamed_symbol15676$$Module_Framework
                    generateNewHttpResponse_194D6D8 = ___lldb_unnamed_symbol15681$$Module_Framework + 376 = sub_194D6D8
                        NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields: -> 创建新的 ctier 的response

                    -[MLServerABRDataLoadTask dataLoadTask:didReceiveResponse:] + 424
                        -[MLServerABRLoader dataLoadTask:didReceiveResponse:]   -> 当 ctier 报错时
                            NSError HAMErrorWithURLResponse:userInfo:request:
                                    NSError HAMErrorWithCode:userInfo:

                Cronet_UrlRequestCallback_OnSucceeded_194D248 = ___lldb_unnamed_symbol15678$$Module_Framework
                    MLServerABRDataLoadTask dataLoadTask:didCompleteWithError:
                        MLServerABRLoader dataLoadTask:didCompleteWithError:
                            MLServerABRLoader updateLoadRetryPolicyOnLoadCompletionWithError:
                                MLDefaultLoadRetryPolicy didCompleteLoadWithError:
                                    error==NULL: MLDefaultLoadRetryPolicy cancelRetryAndResetBackoff:
                                        retryID++

                                error!=NULL: MLDefaultLoadRetryPolicy scheduleRetryWithBlock:
                                    canRetry==True: callExecuteRetryBlockWithRetryID_FF3070 = -[MLDefaultLoadRetryPolicy scheduleRetryWithBlock:]_block + 44
                                        -[MLDefaultLoadRetryPolicy executeRetryBlockWithRetryID:] + 68
                                            callMLServerABRLoaderContinueLoading_107B5A8
                                                -[MLServerABRLoader continueLoading] + 924
                                                    -[MLServerABRDataLoadTask startWithDelegate:delegateQueue:] + 88
                                                        HAMCronetDataLoadTask startWithDelegate:delegateQueue: -> 进入 ctier 的死循环 重复请求

                                    canRetry==False: callMLServerABRLoaderFailWithError_107B5B8
                                        MLServerABRLoader failWithError:

================================================================================

相关函数详解：

MLServerABRLoader dataLoadTask:didCompleteWithError:
    if ( curServerABRUMPParser )
        parseResponseError_107E6B0(curServerABRUMPParser, inputError_1);

    if ( !inputError_1
        && !curMLServerABRLoader->_didReceiveChunkForCurrentRequest
        && !curMLServerABRLoader->_didReceiveNextRequestPolicyForCurrentRequest )
    {
        defaultBackOffTimeMs = curMLServerABRLoader->_defaultBackOffTimeMs;
        if ( defaultBackOffTimeMs >= 1 )
        {
            ...
        }
    }

    objc_msgSend_3E84298(curMLServerABRLoader, "updateLoadRetryPolicyOnLoadCompletionWithError:", inputError_3);

MLServerABRLoader updateLoadRetryPolicyOnLoadCompletionWithError:
    参数：
        case 1
            arg1={
                Error Domain=com.google.ios.hamplayer
                Code=10000 "(null)"
                UserInfo={
                    HAMRequestNumberLoadTaskKey=1,
                    HAMErrorURLRequest=<NSMutableURLRequest: 0x280ab2470> {
                        URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=L&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=1
                    }
                }
            }

        case 2:
            arg1=domain: "com.google.ios.hamplayer" - code: 6009

        case 3:
            Error Domain=com.google.ios.hamplayer
            Code=6009 "(null)"
            UserInfo={
                HAMErrorHTTPURLResponse=<NSHTTPURLResponse: 0x28095cd60> {
                    URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=L&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2
                    }
                    {
                        Status Code: 302,
                        Headers {
                            Connection = close
                            Content-Length = 0
                            Location = "https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=A&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2"
                            Server = "atomos-tproxy 1.0"
                        }
                    },
                HAMRequestNumberLoadTaskKey=2,
                HAMErrorURLRequest=<NSMutableURLRequest: 0x280ab1f50> {
                    URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=L&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2
                }
            }

    核心代码逻辑：
        objc_msgSend_3E84298((void *)curMLServerABRLoader->_loadRetryPolicy, "didCompleteLoadWithError:", error_);
        if ( error_ )
        {
            if ( (unsigned int)objc_msgSend_3E84298((void *)curMLServerABRLoader->_loadRetryPolicy, "canRetry") )
            {
                blockInvoke = callMLServerABRLoaderContinueLoading_107B5A8;

                objc_msgSend_3E84298((void *)loadRetryPolicy, "scheduleRetryWithBlock:", &StackBlock);
            }
            else
            {
                blockInvoke1 = callMLServerABRLoaderFailWithError_107B5B8;
            }
        }

    调用到：
        MLDefaultLoadRetryPolicy canRetry

        MLDefaultLoadRetryPolicy didCompleteLoadWithError:

        MLDefaultLoadRetryPolicy scheduleRetryWithBlock:

        callMLServerABRLoaderContinueLoading_107B5A8

        callMLServerABRLoaderFailWithError_107B5B8

MLDefaultLoadRetryPolicy didCompleteLoadWithError:
    参数：
        case 1: error=NULL
        case 2: NSError(
                    Error Domain=com.google.ios.hamplayer
                    Code=10000 "(null)"
                    UserInfo={
                        HAMRequestNumberLoadTaskKey=1,
                        HAMErrorURLRequest=<NSMutableURLRequest: 0x2838e9480>{
                            URL: https://rr4---sn-a5msenes.googlevideo.com/videoplayback?expire=1654443385&ei=GXmcYoryCa-RsfIP1Oy_mAs&ip=104.172.170.169&id=o-ANzDZ3h7N5rZAloUCdQGuYMBEb80Uu_e4KPc7xaAyG1K&source=youtube&requiressl=yes&mh=_h&mm=31,29&mn=sn-a5msenes,sn-a5mekn6k&ms=au,rdu&mv=m&mvi=4&pl=17&ctier=L&initcwndbps=1842500&svpuc=1&sabr=1&mt=1654421335&fvip=1&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgLJQmm-EOXj9xFFyjCBHlgn2RiukSzRseDFdGPROqJ8ACIQCdoic9p3flB3FJOu2lqys31IE4I-wBZKNPR-hjkf0HHA%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgULlnjQq0nkVEN6oLDPNPfvxUrcF1uFeiOfQiUhNE9RMCIGbuOCNl2TVJp2VegKsJVujYtW_j53A1zYzznjVe3xp3&cpn=q6v1kI3_nWlzP4Qd&rn=1
                        }
                    }
                )
    核心代码逻辑：
        if ( inputError )
        {
            if ( objc_msgSend_3E84298(inputError, "code") != &zero_2710 && objc_msgSend_3E84298(inputError_, "code") != algn0x20_1779 )
            {
                objc_msgSend_3E84298((void *)curMLDefaultLoadRetryPolicy->_errors, "addObject:", inputError_);
                objc_msgSend_3E84298(curMLDefaultLoadRetryPolicy->_backoffCalculator, "updateInterval");
            }
        }
        else
        {
            objc_msgSend_3E84298((void *)curMLDefaultLoadRetryPolicy->_errors, "removeAllObjects");
            objc_msgSend_3E84298(curMLDefaultLoadRetryPolicy->_backoffCalculator, "resetInterval");
            objc_msgSend_3E84298(curMLDefaultLoadRetryPolicy, "cancelRetryAndResetBackoff:", 0LL);
        }
    调用到：
        MLDefaultLoadRetryPolicy cancelRetryAndResetBackoff:

MLDefaultLoadRetryPolicy cancelRetryAndResetBackoff:
    核心逻辑：
        ++self->_retryID;
        curMLDefaultLoadRetryPolicy->_retryBlock = 0LL;

MLDefaultLoadRetryPolicy scheduleRetryWithBlock:
    核心逻辑：
        curMLDefaultLoadRetryPolicy->_retryBlock = newRetryBlock_2;
        if ( !curRetryBlock )
        {
            retryID = curMLDefaultLoadRetryPolicy->_retryID;
            objc_msgSend_3E84298(curMLDefaultLoadRetryPolicy->_backoffCalculator, "interval");
            dispathTime_backoffInterval = dispatch_time(0LL, (signed __int64)(backoffInterval * 1000000000.0));

            blockInvoke = callExecuteRetryBlockWithRetryID_FF3070;
        }

    调用到：
        callExecuteRetryBlockWithRetryID_FF3070

Cronet_UrlRequestCallback_OnResponseStarted_194CCE4 = ___lldb_unnamed_symbol15676$$Module_Framework + 80 = sub_194CCE4
    代码核心逻辑：
        if ( !curCronetDataLoadTask->taskCancelled_ )
        {
            newNSHTTPURLResponse = generateNewHttpResponse_194D6D8(responseInfo_);

            objc_msgSend_3E84298(
                (void *)curCronetDataLoadTask_->delegate_,
                "dataLoadTask:didReceiveResponse:",
                curCronetDataLoadTask_->parentTask_,
                curCronetDataLoadTask_->response_
            );

            if ( (signed int)getResponseStatusCode_3DFA210(responseInfo_) < 400 )
            {
                curCronetDataLoadTask_->bufferData_ = malloc(curCronetDataLoadTask_->bufferDataSize_);

                tryResetTimeoutTimer_194C704(curCronetDataLoadTask_);

                cronetUrlRequestReadResult = callCronetUrlRequestRead_3DF9370(request_);

                if ( (_DWORD)cronetUrlRequestReadResult ) // read error
                {
                    ...
                }
            }
            else
            {
                newHamError = objc_msgSend_3E84298(
                    &OBJC_CLASS___NSError,
                    "HAMErrorWithURLResponse:userInfo:request:",
                    curCronetDataLoadTask_->response_,
                    curCronetDataLoadTask_->userInfo_,
                    curCronetDataLoadTask_->URLRequest_
                );

                objc_msgSend_3E84298(
                    (void *)curCronetDataLoadTask_->delegate_,
                    "dataLoadTask:didCompleteWithError:",
                    curCronetDataLoadTask_->parentTask_,
                    newHamError_
                );
                objc_msgSend_3E84298(
                    (void *)curCronetDataLoadTask_->observer_,
                    "dataLoadTask:didCompleteWithError:",
                    curCronetDataLoadTask_->parentTask_,
                    newHamError_
                );

                objc_msgSend_3E84298(curCronetDataLoadTask_->timeoutTimer_, "invalidate");
            }
        }

================================================================================

--------------------------------------------------------------------------------

新生成 ctier=L 的 NSMutableURLRequest 请求 的函数调用顺序：

-[HAMPlayerInternal playerLoop] + 1736
    -[HAMBaseTrackRenderer prepareAndReturnError:] + 48
        -[HAMSBARAudioTrackRenderer internalPrepareAndReturnError:] + 40
            -[HAMQueueingRootSampleBufferSource prepareAndReturnError:] + 704
                -[HAMDASHSampleBufferSource prepareAndReturnError:] + 100
                    -[MLServerABRController prepareAndReturnError:] + 40
                        -[MLServerABRLoader continueLoading] + 840
                            -[MLServerABRDataLoader createDataLoadTaskForRequest:] + 128
                                -[MLServerABRDataLoader dataLoadTaskForHTTPBody:isPrimaryHostProbing:] + 424
                                    -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
                                        -[HAMDataLoadRequest buildURLRequest] + 140
                                            NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
                                                某次参数：
                                                    URL="https://rr4---sn-nx57ynsz.googlevideo.com/videoplayback?expire=1655759112&ei=p4ywYoCpO-GMsfIP9c-j-A0&ip=72.174.144.110&id=o-AOtW_cgK5DpGSlTFzlnNQ5jG-qYf6YbO-W_J4o6Z7Bg0&source=youtube&requiressl=yes&mh=mR&mm=31,29&mn=sn-nx57ynsz,sn-nx5s7n7y&ms=au,rdu&mv=m&mvi=4&pl=19&ctier=L&initcwndbps=1712500&svpuc=1&sabr=1&mt=1655737257&fvip=1&keepalive=yes&fexp=24001373,24007246,24208264&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgdJbzVTf5BpT1a0Qd-15luRpD3uxu9oqoIBFYuNPFrw0CIHogAdP_kVZFI1gE2yvIbih1AY5458ViOpGC77ywCY1Y&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgUMelUGd_HH1szTAu1xTcLTCTp0LZCwG81qqdxbtYQoMCIB1IHI2PgnSgrenK-M60dwFaKwacbIvmjERFx0ri9OG9&cpn=G0hmRCCW6nH0wNIr&rn=1"
                                                    cachePolicy=NSURLRequestUseProtocolCachePolicy
                                                    timeoutInterval=60
                                                CFNetwork`___lldb_unnamed_symbol231$$CFNetwork + 64
                                                    NSURLRequest initWithURL:cachePolicy:timeoutInterval:
                                                        某次参数：
                                                            URL="https://rr4---sn-nx57ynsz.googlevideo.com/videoplayback?expire=1655759112&ei=p4ywYoCpO-GMsfIP9c-j-A0&ip=72.174.144.110&id=o-AOtW_cgK5DpGSlTFzlnNQ5jG-qYf6YbO-W_J4o6Z7Bg0&source=youtube&requiressl=yes&mh=mR&mm=31,29&mn=sn-nx57ynsz,sn-nx5s7n7y&ms=au,rdu&mv=m&mvi=4&pl=19&ctier=L&initcwndbps=1712500&svpuc=1&sabr=1&mt=1655737257&fvip=1&keepalive=yes&fexp=24001373,24007246,24208264&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgdJbzVTf5BpT1a0Qd-15luRpD3uxu9oqoIBFYuNPFrw0CIHogAdP_kVZFI1gE2yvIbih1AY5458ViOpGC77ywCY1Y&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRAIgUMelUGd_HH1szTAu1xTcLTCTp0LZCwG81qqdxbtYQoMCIB1IHI2PgnSgrenK-M60dwFaKwacbIvmjERFx0ri9OG9&cpn=G0hmRCCW6nH0wNIr&rn=1"
                                                            cachePolicy=NSURLRequestUseProtocolCachePolicy
                                                            timeoutInterval=60

--------------------------------------------------------------------------------

触发 HAMCronetDataLoadTask startWithDelegate:delegateQueue: 的调用顺序：

[第一次 rn=1 ctiler=L]

-[HAMPlayerInternal playerLoop] + 1736
    -[HAMBaseTrackRenderer prepareAndReturnError:] + 48
        -[HAMSBARAudioTrackRenderer internalPrepareAndReturnError:] + 40
            -[HAMQueueingRootSampleBufferSource prepareAndReturnError:] + 704
                -[HAMDASHSampleBufferSource prepareAndReturnError:] + 100
                    -[MLServerABRController prepareAndReturnError:] + 40
                        _logos_method$_ungrouped$MLServerABRLoader$continueLoading(self=0x000000012e689210, _cmd="continueLoading") at youtubeCronet.xm:289:5
                            -[MLServerABRLoader continueLoading] + 924
                                -[MLServerABRDataLoadTask startWithDelegate:delegateQueue:] + 88
                                    HAMCronetDataLoadTask startWithDelegate:delegateQueue:
                                        某次的参数：
                                            arg1=delegate=<MLServerABRDataLoadTask: 0x284243690>
                                            arg2=delegateQueue=<OS_dispatch_queue_serial: MLHAMPlayer>
                                        此时：
                                            reqUrl
                                                rn=1: https://rr1---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1658155941&ei=RR_VYqa6GJTlNsC6gIgE&ip=162.253.45.206&id=o-AGLA8-7MEt9wIIkvKGany12Vu6HmM4t-R27oa-wU3eyG&source=youtube&requiressl=yes&mh=Mk&mm=31,29&mn=sn-phvo-jpql,sn-vgqsrnsd&ms=au,rdu&mv=m&mvi=1&pl=22&ctier=L&initcwndbps=1168750&svpuc=1&sabr=1&mt=1658133649&fvip=5&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIhAMoq1fU-fdprDjIkRanRHLMJLg-mISEmElCC7_OqigFVAiBpC6IpBGXN_mWIzoPn8nG2Ah4WNEIauk5j3_y4uUJooQ%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIgaeU1mBeqHILR9DlKWm0nihNijdMhZgAFvJjbZKW1FrUCIQDFRyVh1aMUMdMDCNfmmOPgasbwsu5dLSdY3JFfsKFiKw%3D%3D&cpn=2oxmwItyhlTlzWXv&rn=1

[第二次 rn=2 ctiler=L]

-[MLDefaultLoadRetryPolicy scheduleRetryWithBlock:]_block + 44
    -[MLDefaultLoadRetryPolicy executeRetryBlockWithRetryID:] + 68
        -[MLServerABRLoader continueLoading] + 924
            -[MLServerABRDataLoadTask startWithDelegate:delegateQueue:] + 88
                HAMCronetDataLoadTask startWithDelegate:delegateQueue:
                    某次的参数：
                        arg1=delegate=<MLServerABRDataLoadTask: 0x286198f00>
                        arg2=delegateQueue=<OS_dispatch_queue_serial: MLHAMPlayer[0x280218180] = { xref = 34, ref = 5, sref = 2, target = com.apple.root.user-initiated-qos.overcommit[0x11050d080], width = 0x1, state = 0x006000a500001801, enqueued, dirty, max qos 5, draining on 0x1803, in-barrier}>
                    此时：
                        reqUrl
                            rn=2时: https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1658305786&ei=mWjXYuCLOOucir4P3c6AiAQ&ip=162.253.45.206&id=o-AMnr7yIbmMhFTmywfJSN8wAIx4A4Qoq0hGO91N7dCzIp&source=youtube&requiressl=yes&mh=hx&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknek&ms=au,rdu&mv=m&mvi=2&pcm2cms=yes&pl=22&ctier=L&initcwndbps=1031250&svpuc=1&sabr=1&mt=1658283891&fvip=1&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhANNsZzr74YwYCad-wykDLNs7C6jNLkdlTSuiVTHlI2v0AiEA4JnoG-7SCvNPKqt9iFwCbPDyHgfX8NtTULRDqp6HnRM%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgXZKQOPCBuuyxe3Bdk0qXJbgIxsJqr_7LpKHE7xQ1OnQCIQDq4WnBDfATQNkxbpOWAQ_RM4NEThcpb0aqUFqbjUC1vg%3D%3D&cpn=aCkM2ux19mPWYM5x&rn=2

[第三次 rn=2&rn=3 ctiler=A]
    调用顺序同上
    但是URL略有不同
                    此时：
                        reqUrl
                            rn=3时: https://rr2---sn-phvo-jpql.googlevideo.com/videoplayback?expire=1658305786&ei=mWjXYuCLOOucir4P3c6AiAQ&ip=162.253.45.206&id=o-AMnr7yIbmMhFTmywfJSN8wAIx4A4Qoq0hGO91N7dCzIp&source=youtube&requiressl=yes&mh=hx&mm=31,29&mn=sn-phvo-jpql,sn-vgqsknek&ms=au,rdu&mv=m&mvi=2&pcm2cms=yes&pl=22&ctier=A&initcwndbps=1031250&svpuc=1&sabr=1&mt=1658283891&fvip=1&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhANNsZzr74YwYCad-wykDLNs7C6jNLkdlTSuiVTHlI2v0AiEA4JnoG-7SCvNPKqt9iFwCbPDyHgfX8NtTULRDqp6HnRM%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgXZKQOPCBuuyxe3Bdk0qXJbgIxsJqr_7LpKHE7xQ1OnQCIQDq4WnBDfATQNkxbpOWAQ_RM4NEThcpb0aqUFqbjUC1vg%3D%3D&cpn=aCkM2ux19mPWYM5x&rn=2&rn=3

--------------------------------------------------------------------------------

ctier=L 的 请求 NSMutableURLRequest 也返回 NSError 出错 的函数调用顺序

-[HAMPlayerInternal playerLoop] + 1736
    -[HAMBaseTrackRenderer prepareAndReturnError:] + 48
        -[HAMPixelBufferVideoTrackRenderer internalPrepareAndReturnError:] + 40
            -[HAMVideoDecoderSampleBufferSource prepareAndReturnError:] + 80
                -[HAMQueueingRootSampleBufferSource prepareAndReturnError:] + 632
                    -[HAMDASHSampleBufferSource seekToTime:] + 140
                        -[MLServerABRController seekToTime:] + 36
                            -[MLServerABRLoader seekDidOccur] + 148
                                ___lldb_unnamed_symbol15667$$Module_Framework + 112
                                    NSError HAMErrorWithCode:userInfo:
                                        某次的参数：
                                            arg1=10000
                                            arg2={
                                                    HAMErrorURLRequest = "<NSMutableURLRequest: 0x28302c0b0> { URL: https://rr2---sn-nx5s7nel.googlevideo.com/videoplayback?expire=1655754561&ei=4HqwYt29JNSDkwbAt5vQDg&ip=72.174.144.110&id=o-AJjQlPwnnZAb4c4XmDyophxk9bxSybJHNgVtg0xPnY5B&source=youtube&requiressl=yes&mh=Vb&mm=31,29&mn=sn-nx5s7nel,sn-nx57ynsl&ms=au,rdu&mv=m&mvi=2&pl=19&ctier=L&initcwndbps=1721250&svpuc=1&sabr=1&mt=1655732690&fvip=2&keepalive=yes&fexp=24001373,24007246,24208264&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIhAIoI_-R65dCbFSiymVXG3fMpNeJO5LUNC-t_O1IRl6aJAiBy8tnuzG_Gag61Wwu-Pk1DAyQd1MvY4t2MVxvfYVA5mg%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAPgKcNRbTnALWCxhsV7ZpQ48EmZyL8VzBjUOIbM1y6SfAiAMJA2YCB4AUnlHaS9MuE1aWCkpY5JLkHyY5yooEGQU9Q%3D%3D&cpn=uDxkagKFinGD-plw&rn=1 }";
                                                    HAMRequestNumberLoadTaskKey = 1;
                                                }
                                    NSError errorWithDomain:code:userInfo:
                                        某次的参数：
                                            arg1="com.google.ios.hamplayer"
                                            arg2=10000
                                            arg3={
                                                    HAMErrorURLRequest = "<NSMutableURLRequest: 0x28302c0b0> { URL: https://rr2---sn-nx5s7nel.googlevideo.com/videoplayback?expire=1655754561&ei=4HqwYt29JNSDkwbAt5vQDg&ip=72.174.144.110&id=o-AJjQlPwnnZAb4c4XmDyophxk9bxSybJHNgVtg0xPnY5B&source=youtube&requiressl=yes&mh=Vb&mm=31,29&mn=sn-nx5s7nel,sn-nx57ynsl&ms=au,rdu&mv=m&mvi=2&pl=19&ctier=L&initcwndbps=1721250&svpuc=1&sabr=1&mt=1655732690&fvip=2&keepalive=yes&fexp=24001373,24007246,24208264&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIhAIoI_-R65dCbFSiymVXG3fMpNeJO5LUNC-t_O1IRl6aJAiBy8tnuzG_Gag61Wwu-Pk1DAyQd1MvY4t2MVxvfYVA5mg%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAPgKcNRbTnALWCxhsV7ZpQ48EmZyL8VzBjUOIbM1y6SfAiAMJA2YCB4AUnlHaS9MuE1aWCkpY5JLkHyY5yooEGQU9Q%3D%3D&cpn=uDxkagKFinGD-plw&rn=1 }";
                                                    HAMRequestNumberLoadTaskKey = 1;
                                                }

--------------------------------------------------------------------------------

说明：下面是 ctier=A 的 NSURLRequest 的调用顺序

[case 1]

-[MLDefaultLoadRetryPolicy scheduleRetryWithBlock:]
    -[MLDefaultLoadRetryPolicy scheduleRetryWithBlock:]_block + 44
        -[MLDefaultLoadRetryPolicy executeRetryBlockWithRetryID:] + 68
            某次的参数：arg1=3

            MLServerABRLoader continueLoading
                -[MLServerABRLoader continueLoading] + 840
                    -[MLServerABRDataLoader createDataLoadTaskForRequest:] + 128
                        -[MLServerABRDataLoader dataLoadTaskForHTTPBody:isPrimaryHostProbing:] + 424
                            -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
                                [HAMDataLoadRequest buildURLRequest] + 140
                                    NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
                                        某次的参数：
                                            URL="https://rr1---sn-bvvbax4pcxg-najl.googlevideo.com/videoplayback?expire=1654284469&ei=VAyaYvi5G4eHsfIPqoK1kAg&ip=136.36.116.116&id=o-AD4uH0_eMoADlcTGlFs1Uw5dhdYtelrEPN9konw5oPZb&source=youtube&requiressl=yes&mh=_u&mm=31,29&mn=sn-bvvbax4pcxg-najl,sn-o097znsl&ms=au,rdu&mv=m&mvi=1&pl=20&ctier=A&initcwndbps=1786250&svpuc=1&sabr=1&mt=1654262462&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgRHLJbeJI4tvvoD9pV1KThMgoBW8xgE27L2nGFfXaX6YCIQC6SEOoNiuui3-5O_gkauy6nXCQZN1Es1omMAH7ZoPfyQ%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAKMDmxqaOMD0YMFLUgG8otkDKKVPLHSBRuD3yKVVpd-DAiB73wqU9tdTRN5zW-yIL3kXDXwNuQ7L4ua7n00tb6YnFA%3D%3D&cpn=WPioc6dOPwVsC718&rn=2&rn=5"
                                            cachePolicy=NSURLRequestUseProtocolCachePolicy
                                            timeoutInterval=60

                                        某次的返回值：
                                            <NSMutableURLRequest: 0x280ab2460> {
                                                URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=L&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=1
                                            }

                                        CFNetwork`___lldb_unnamed_symbol231$$CFNetwork + 64

                                            NSURLRequest initWithURL:cachePolicy:timeoutInterval:
                                                参数 case 1：
                                                    URL="https://rr1---sn-bvvbax4pcxg-najl.googlevideo.com/videoplayback?expire=1654284469&ei=VAyaYvi5G4eHsfIPqoK1kAg&ip=136.36.116.116&id=o-AD4uH0_eMoADlcTGlFs1Uw5dhdYtelrEPN9konw5oPZb&source=youtube&requiressl=yes&mh=_u&mm=31,29&mn=sn-bvvbax4pcxg-najl,sn-o097znsl&ms=au,rdu&mv=m&mvi=1&pl=20&ctier=A&initcwndbps=1786250&svpuc=1&sabr=1&mt=1654262462&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgRHLJbeJI4tvvoD9pV1KThMgoBW8xgE27L2nGFfXaX6YCIQC6SEOoNiuui3-5O_gkauy6nXCQZN1Es1omMAH7ZoPfyQ%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAKMDmxqaOMD0YMFLUgG8otkDKKVPLHSBRuD3yKVVpd-DAiB73wqU9tdTRN5zW-yIL3kXDXwNuQ7L4ua7n00tb6YnFA%3D%3D&cpn=WPioc6dOPwVsC718&rn=2&rn=5"
                                                    cachePolicy=NSURLRequestUseProtocolCachePolicy
                                                    timeoutInterval=60

                                                参数 case 2：
                                                    URL="https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=A&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2&rn=3"
                                                    cachePolicy=NSURLRequestUseProtocolCachePolicy
                                                    timeoutInterval=60

                                                return <NSMutableURLRequest: 0x28063c790> {
                                                    URL: https://rr1---sn-bvvbax4pcxg-najl.googlevideo.com/videoplayback?expire=1654284469&ei=VAyaYvi5G4eHsfIPqoK1kAg&ip=136.36.116.116&id=o-AD4uH0_eMoADlcTGlFs1Uw5dhdYtelrEPN9konw5oPZb&source=youtube&requiressl=yes&mh=_u&mm=31,29&mn=sn-bvvbax4pcxg-najl,sn-o097znsl&ms=au,rdu&mv=m&mvi=1&pl=20&ctier=A&initcwndbps=1786250&svpuc=1&sabr=1&mt=1654262462&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIgRHLJbeJI4tvvoD9pV1KThMgoBW8xgE27L2nGFfXaX6YCIQC6SEOoNiuui3-5O_gkauy6nXCQZN1Es1omMAH7ZoPfyQ%3D%3D&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAKMDmxqaOMD0YMFLUgG8otkDKKVPLHSBRuD3yKVVpd-DAiB73wqU9tdTRN5zW-yIL3kXDXwNuQ7L4ua7n00tb6YnFA%3D%3D&cpn=WPioc6dOPwVsC718&rn=2&rn=5
                                                }

[case 2]

-[HAMPlayerInternal playerLoop] + 1736
    -[HAMBaseTrackRenderer prepareAndReturnError:] + 48
        -[HAMSBARAudioTrackRenderer internalPrepareAndReturnError:] + 40
            -[HAMQueueingRootSampleBufferSource prepareAndReturnError:] + 704
                -[HAMDASHSampleBufferSource prepareAndReturnError:] + 100
                    -[MLServerABRController prepareAndReturnError:] + 40
                        -[MLServerABRLoader continueLoading] + 840
                            -[MLServerABRDataLoader createDataLoadTaskForRequest:] + 128
                                -[MLServerABRDataLoader dataLoadTaskForHTTPBody:isPrimaryHostProbing:] + 424
                                    -[HAMCronetDataLoader taskWithRequest:userInfo:] + 140
                                        -[HAMDataLoadRequest buildURLRequest] + 140
                                            NSURLRequest requestWithURL:cachePolicy:timeoutInterval:
                                                CFNetwork`___lldb_unnamed_symbol231$$CFNetwork + 64
                                                    NSURLRequest initWithURL:cachePolicy:timeoutInterval:

--------------------------------------------------------------------------------

说明：下面是 ctier=A 的 response = NSHTTPURLResponse 的调用顺序

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36 = sub_194D978
    ___lldb_unnamed_symbol110205$$Module_Framework + 40 = sub_38FCE24
        ___lldb_unnamed_symbol171000$$Module_Framework + 28 = sub_3DF8048
            ___lldb_unnamed_symbol170908$$Module_Framework + 52 = sub_3DF60E8
                Cronet_UrlRequestCallback_OnResponseStarted_194CCE4 = ___lldb_unnamed_symbol15676$$Module_Framework + 80 = sub_194CCE4
                    generateNewHttpResponse_194D6D8 = ___lldb_unnamed_symbol15681$$Module_Framework + 376 = sub_194D6D8
                        NSHTTPURLResponse initWithURL:statusCode:HTTPVersion:headerFields:
                            某次参数:
                                url="https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=A&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2&rn=3",
                                statusCode=200,
                                HTTPVersion=0x0000000000000000,
                                headerFields=4 key/value pairs

                            某次的返回值：
                                <NSHTTPURLResponse: 0x280ee1d00> {
                                    URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=A&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2&rn=3
                                    }
                                    {
                                        Status Code: 200,
                                        Headers {
                                            Connection = "keep-alive"
                                            "Content-Length" = 0
                                            "Content-Type" = "application/vnd.yt-ump"
                                            Server = "atomos-tproxy 1.0"
                                        }
                                    }

--------------------------------------------------------------------------------

触发了 HAMCronetDataLoadTask startWithDelegate:delegateQueue: 当第一次 ctier=A 的url 时的调用顺序：

-[MLDefaultLoadRetryPolicy scheduleRetryWithBlock:]_block + 44
    -[MLDefaultLoadRetryPolicy executeRetryBlockWithRetryID:] + 68
        某次参数：
            arg1=2
        -[MLServerABRLoader continueLoading] + 924
            -[MLServerABRDataLoadTask startWithDelegate:delegateQueue:] + 88
                某次的参数：
                    arg1=<MLServerABRDataLoadTask: 0x281226d00>
                    arg2=<OS_dispatch_queue_serial: MLHAMPlayer[0x282d34f00] = { xref = 33, ref = 6, sref = 2, target = com.apple.root.user-initiated-qos.overcommit[0x10c651080], width = 0x1, state = 0x006000a50001a401, enqueued, dirty, max qos 5, draining on 0x1a403, in-barrier}>

--------------------------------------------------------------------------------

下面是 ctier=A 的 response = NSHTTPURLResponse 在生成了之后，被调用到 statusCode 时的调用顺序

-[MLPlayerItemEventCenter networkRequestDidReceiveResponseWithEvent:] + 204
    -[MLQOEPingController networkRequestDidReceiveResponseWithEvent:] + 272
        NSHTTPURLResponse statusCode
            return 200;

--------------------------------------------------------------------------------

说明：下面是 ctier=A 的response后的，始终retry重发请求的相关的调用逻辑

[case 1]

cancelCronetDataLoadTask_194BFB8
    reportDataLoadTaskError_194DA94 = sub_194DA94 = ___lldb_unnamed_symbol15689$$Module_Framework + 40
        -[MLServerABRDataLoadTask dataLoadTask:didCompleteWithError:] + 368
            -[MLServerABRLoader dataLoadTask:didCompleteWithError:] + 260
                参数
                    case 1：
                        arg1=0x0000000281aaa490
                        arg2=domain: "com.google.ios.hamplayer" - code: 10000
                    case 2：
                        arg1=0x0000000280597a50
                        arg2=domain: "com.google.ios.hamplayer" - code: 6009

                MLServerABRLoader updateLoadRetryPolicyOnLoadCompletionWithError:

[case 2]

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36
    ___lldb_unnamed_symbol110205$$Module_Framework + 40
        ___lldb_unnamed_symbol171023$$Module_Framework + 32
            ___lldb_unnamed_symbol170906$$Module_Framework + 84
                Cronet_UrlRequestCallback_OnRedirectReceived_194C9D8 = ___lldb_unnamed_symbol15675$$Module_Framework + 620
                    -[MLServerABRDataLoadTask dataLoadTask:didCompleteWithError:] + 368
                        -[MLServerABRLoader dataLoadTask:didCompleteWithError:] + 260
                            MLServerABRLoader updateLoadRetryPolicyOnLoadCompletionWithError:

[case 3]

找到 死循环 多次重试的调用关系了：

callHAMTimerFire_199CFB8 = -[HAMTimer initWithQueue:startNanoseconds:intervalNanoseconds:leewayNanoseconds:repeats:block:]_block + 36
    -[HAMTimer fire] + 52
        callMLOnesieConnectionOpenerOnPingTimer_1039FB8 = sub_1039FB8 = -[MLOnesieConnectionOpener scheduleNextRequestUsingStartDelay:]_block + 36
            -[MLOnesieConnectionOpener onPingTimer] + 180
                -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:] + 932
                    tryResetTimeoutTimer_194C704 = sub_194C704 = ___lldb_unnamed_symbol15674$$Module_Framework + 200
                        +[HAMTimer timerWithQueue:startNanoseconds:leewayNanoseconds:block:] + 104
                            -[HAMTimer initWithQueue:startNanoseconds:intervalNanoseconds:leewayNanoseconds:repeats:block:]

===>>>

-[HAMTimer initWithQueue:startNanoseconds:intervalNanoseconds:leewayNanoseconds:repeats:block:]
    -[HAMTimer initWithQueue:startNanoseconds:intervalNanoseconds:leewayNanoseconds:repeats:block:]_block + 36
        -[HAMTimer fire] + 52
            callMLOnesieConnectionOpenerOnPingTimer_1039FB8 = sub_1039FB8 = = -[MLOnesieConnectionOpener scheduleNextRequestUsingStartDelay:]_block + 36
                -[MLOnesieConnectionOpener onPingTimer] + 180
                    -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:] + 648
                        某次参数：
                            arg1=<MLOnesieConnectionOpener: 0x2829dde00>
                            delegateQueue =<OS_dispatch_queue_serial: queue_serial[0x283868800] = { xref = 8, ref = 5, sref = 2, target = com.apple.root.default-qos.overcommit[0x104664f80], width = 0x1, state = 0x006000a500012805, enqueued, dirty, max qos 5, draining on 0x12807, in-barrier}>

                        核心代码:
                            sub_3DF9004(sub_194C27C);

                        Cronet_Executor_ExecuteFunc_194C27C = sub_194C27C = ___lldb_unnamed_symbol15668
                            -[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]_block_block + 36 = sub_194D978
                                ___lldb_unnamed_symbol110205$$Module_Framework + 40 = sub_38FCE24
                                    ___lldb_unnamed_symbol171000$$Module_Framework + 28 = sub_3DF8048
                                        ___lldb_unnamed_symbol170908$$Module_Framework + 52 = sub_3DF60E8
                                            Cronet_UrlRequestCallback_OnResponseStarted_194CCE4 = sub_194CCE4 = ___lldb_unnamed_symbol15676$$Module_Framework + 124
                                                -[MLServerABRDataLoadTask dataLoadTask:didReceiveResponse:] + 424
                                                    -[MLServerABRLoader dataLoadTask:didReceiveResponse:]
                                                        某次的参数：
                                                            arg1=<MLServerABRDataLoadTask: 0x2806a7060>,
                                                            arg2=<NSHTTPURLResponse: 0x280ee1d00> {
                                                                    URL: https://rr1---sn-8xgp1vo-p5ql.googlevideo.com/videoplayback?expire=1654546559&ei=HwyeYrH5DJWN_9EPouqpqA8&ip=70.110.26.104&id=o-ABMZsKNB0GJ_BmboM7YSytnAHB7ASC_Y7GC6jO056wJe&source=youtube&requiressl=yes&mh=ji&mm=31,29&mn=sn-8xgp1vo-p5ql,sn-p5qlsndz&ms=au,rdu&mv=m&mvi=1&pcm2cms=yes&pl=20&ctier=A&initcwndbps=1490000&svpuc=1&sabr=1&mt=1654524545&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRgIhAPnD2xwm1J-b9yvruQe1aozyNm_9xaCQvtdIM7n32vA5AiEA4mVXjIUgf7425J8XlwfLdVhMyDiZHFtRhRE1jHxtWZo%3D&lsparams=mh,mm,mn,ms,mv,mvi,pcm2cms,pl,initcwndbps&lsig=AG3C_xAwRQIgd3ooIz7fpF6JTB11opldSL1WIPtx4L5FaBEqhdEZBLwCIQChh18q1sc8T2XEIwlQBI8O9cF_DI2FPVLjVCNRHhRPCQ%3D%3D&cpn=sjOhS6zpDL-OE-pP&rn=2&rn=3
                                                                }
                                                                {
                                                                    Status Code: 200, Headers {
                                                                        Connection = "keep-alive"
                                                                        "Content-Length" = 0
                                                                        "Content-Type" = "application/vnd.yt-ump"
                                                                        Server = "atomos-tproxy 1.0"
                                                                    }
                                                                }

                                                        NSError HAMErrorWithURLResponse:userInfo:request:
                                                            某次的参数：
                                                                response=<NSHTTPURLResponse: 0x281464760>,
                                                                userInfo={
                                                                    HAMRequestNumberLoadTaskKey = 2;
                                                                },
                                                                request=<NSMutableURLRequest: 0x2810f1090>

                                                            v22 = objc_msgSend((void *)v7, "HAMErrorWithCode:userInfo:", v20=6000, v14=userInfoDict);
                                                                NSError HAMErrorWithCode:userInfo:
                                                                    某次的参数：
                                                                        hamErrCode=6000,
                                                                        userInfo=dict

                                                                    return (id)objc_msgSend((void *)self, "errorWithDomain:code:userInfo:", CFSTR("com.google.ios.hamplayer"), a3, a4);

                                                                    某次的返回值：
                                                                        Error Domain=com.google.ios.hamplayer
                                                                        Code=6000 "(null)"
                                                                        UserInfo={
                                                                            HAMErrorHTTPURLResponse=<NSHTTPURLResponse: 0x281ceda60> {
                                                                                    URL: https://rr5---sn-q4flrnee.googlevideo.com/videoplayback?expire=1654110110&ei=PmOXYpHwG-6Rlu8P0LO9yAQ&ip=72.179.224.229&id=o-ANJ-ePUG7jWZMQ_icM7pjIuiwW8IEgTemHHlekQlItK_&source=youtube&requiressl=yes&mh=aT&mm=31,29&mn=sn-q4flrnee,sn-q4fl6ns7&ms=au,rdu&mv=m&mvi=5&pl=21&ctier=A&initcwndbps=1480000&svpuc=1&sabr=1&mt=1654088228&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgTokhxlKrvIZN4PZHmqi4CCoCk-_Bdgi_WTIIrlx1Y7ICIGr2dSn6txZUrrMdum-VwuQ8TbwSK-HTPVVZB28aPwO-&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIgGW-eIbWvW75lrbGlodLzWTMVtDL7KtlxEW-gROi_6_kCIQDwf7k8v2jZdCDAY9KKlCf_k_T4IsKDoL2nm-49RdhBfQ%3D%3D&cpn=F98L8S2i9bcH06us&rn=2&rn=3
                                                                                }
                                                                                {
                                                                                    Status Code: 200,
                                                                                    Headers {
                                                                                        Connection = "keep-alive"
                                                                                        "Content-Length" = 0
                                                                                        Server = "atomos-tproxy 1.0"
                                                                                    }
                                                                                },
                                                                            HAMRequestNumberLoadTaskKey=3,
                                                                            HAMErrorURLRequest=<NSMutableURLRequest: 0x281886580> {
                                                                                URL: https://rr5---sn-q4flrnee.googlevideo.com/videoplayback?expire=1654110110&ei=PmOXYpHwG-6Rlu8P0LO9yAQ&ip=72.179.224.229&id=o-ANJ-ePUG7jWZMQ_icM7pjIuiwW8IEgTemHHlekQlItK_&source=youtube&requiressl=yes&mh=aT&mm=31,29&mn=sn-q4flrnee,sn-q4fl6ns7&ms=au,rdu&mv=m&mvi=5&pl=21&ctier=A&initcwndbps=1480000&svpuc=1&sabr=1&mt=1654088228&fvip=2&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRAIgTokhxlKrvIZN4PZHmqi4CCoCk-_Bdgi_WTIIrlx1Y7ICIGr2dSn6txZUrrMdum-VwuQ8TbwSK-HTPVVZB28aPwO-&lsparams=mh,mm,mn,ms,mv,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIgGW-eIbWvW75lrbGlodLzWTMVtDL7KtlxEW-gROi_6_kCIQDwf7k8v2jZdCDAY9KKlCf_k_T4IsKDoL2nm-49RdhBfQ%3D%3D&cpn=F98L8S2i9bcH06us&rn=2&rn=3
                                                                            }
                                                                        }

--------------------------------------------------------------------------------

当 去掉广告过滤 时，调用到 MLServerABRLoader onesieDataLoader:didCompleteChunks:withError: 的顺序：

-[MLOnesieChunkLoadTask initWithRange:chunks:dataBuffer:cache:delegate:queue:latencyLogger:]
    sub_10380F8 = -[MLOnesieChunkLoadTask initWithRange:chunks:dataBuffer:cache:delegate:queue:latencyLogger:]_block
        sub_10381F8 = -[MLOnesieChunkLoadTask initWithRange:chunks:dataBuffer:cache:delegate:queue:latencyLogger:]_block_block + 344 =
            -[HAMBaseChunkLoadTask didCompleteWithError:] + 412
                -[MLServerABROnesieDataLoader chunks:didCompleteLoadingWithError:] + 92
                    MLServerABRLoader onesieDataLoader:didCompleteChunks:withError:
                        参数举例：
                            [case 1]:
                                arg1=0x0000000282b42000,
                                arg2=1 element,
                                arg3=domain: "com.google.ios.hamplayer" - code: 10000
                            [case 2]:
                                arg1=<MLServerABROnesieDataLoader: 0x282bd5e80>,
                                arg2=<__NSSingleObjectArrayI 0x2807d1510>(
                                        <HAMMP4InitializationChunk: 0x282bc3b80>
                                    )
                                arg3=NULL

--------------------------------------------------------------------------------

下面是：MLServerABRLoader initWithQueue 的调用顺序

-[GPCPromise resolveChild:]_block + 128
    -[YTVideoResolver registerCompletionBlocksOnPlaybackDataLoader]_block + 64
        -[YTVideoResolver didLoadVideoWithPlaybackData:] + 108
            -[YTVideoResolver changeToState:] + 92
                -[YTLocalPlaybackController videoResolver:didChangeFromState:toState:] + 488
                    -[YTLocalPlaybackController startPlaybackWithVideoResolver:internallyPrebufferedVideoController:] + 2184
                        YTAdsControlFlowPlaybackCoordinator startPrerollAdBreak
                            -[YTAdsControlFlowPlaybackCoordinator startPrerollAdBreak] + 52
                                -[YTAdsControlFlowPlaybackCoordinator doneWithPlayerBytesSlotWithBreakType:] + 80
                                    -[YTLocalPlaybackController adsPlaybackCoordinator:didFinishBreakWithBreakType:] + 68
                                        -[YTSingleVideoSequencer activateContentSequence] + 224
                                            -[YTSingleVideoSequencer activateVideoController:reloadContext:] + 248
                                                -[YTSingleVideoController initializeAndLoadWithViewportSizeProvider:playerVisibility:reloadContext:] + 860
                                                    -[MLHAMQueuePlayer load] + 220
                                                        -[MLHAMPlayerItem load] + 3088

                                                            MLServerABRLoader initWithQueue:dataLoader:playerEventCenter:playerItemEventCenter:streamingData:mediaCommonConfig:hamplayerConfig:onesieVideoData:QOEController:loadRetryPolicy:isLiveSource:livePlayerConfig:windowedLiveConfig:metadata
                                                                说明：某次调试时参数：
                                                                    arg1=<OS_dispatch_queue_serial: MLHAMPlayer>,
                                                                    dataLoader=<HAMCronetDataLoader: 0x281782e20>,
                                                                    playerEventCenter=(null),
                                                                    playerItemEventCenter=<MLPlayerItemEventCenter: 0x2833eb6b0>,
                                                                    streamingData=<MLStreamingData: 0x2801f8940>,
                                                                    mediaCommonConfig=<YTIMediaCommonConfig 0x282a39200>: {
                                                                        dynamic_readahead_config {
                                                                            max_read_ahead_media_time_ms: 8000
                                                                            min_read_ahead_media_time_ms: 15000
                                                                            read_ahead_growth_rate_ms: 1000
                                                                        }
                                                                        media_ustreamer_request_config {
                                                                            video_playback_use_ump: true
                                                                            video_playback_ustreamer_config: "\n\317\003\n\326\002\010\000\020\200\005\030\350\002%\372~\252>-\000\000\200?5=\n\227?h\001r9\n\022mfs2_cmfs_v3_1_043\022\037\n\035\n\014device_model\022\r\n\013\n\tiphone9,1\030\000 \001r\026\n\022mfs2_cmfs_v3_1_043\030\000x\350\002\200\001\001\250\001\001\265\001\366(\334?\240\002\350\002\332\002\\\020\260\352\001\030\250F \240\234\001(\33060\230uH\001P\001X\001h\001p\210\'\200\001\364\003\270\001\001\300\001\001\340\001\003\370\001\001\210\002\001\220\002\001\230\002\014\240\002\001\250\002\001\260\002\001\270\002\001\300\002\001\310\002\001\320\002\002\340\002\001\350\002\002\200\003\002\220\003\001\370\265\221\345\014\001\372\002-\010\014\020\030\0302 2-\000\000pB5\000\000\214B@\001H\001P\nX\ne\000\000\200@h\300pp\001\210\001\001\315\001\000\000\200?\202\003\000\210\003\001\220\003\001\240\003\001\250\003\001\260\003\003\310\003\001\320\003\001\330\003\001\340\003\220N\270\004\001\312\004\035\n\024\010\300>\020\230u\030\350\007%\000\000\000\000(\0000\000@\001\020\340\324\003\030\320\017\360\004\001\370\004\001\030\001 \0012\014\010\211\001\020\257\267\220\271\236\212\367\0022\014\010\210\001\020\314\203\356\267\236\212\367\0022\014\010\207\001\020\343\206\301\271\236\212\367\0022\014\010\206\001\020\366\305\356\267\236\212\367\0022\014\010\205\001\020\306\327\220\271\236\212\367\0022\014\010\240\001\020\236\312\314\270\236\212\367\0022\014\010\213\001\020\217\354\253\267\236\212\367\0022\014\010\214\001\020\266\312\253\267\236\212\367\002:\000\022L\000\362\330\357\3010E\002!\000\230\215\'\203G\270\247?\020\342\310\337E\255\271;\354\266\367\210\342\0247\233~\206\3612l\177\363\200\002 ^\262\221\336\225\324\217B\213H\327r\217\352\327]\335\253E*Y_\210\216\tI\336\027bA\274\177\032\002ei"
                                                                        }
                                                                        server_readahead_config {
                                                                            enable: true
                                                                            next_request_policy {
                                                                                target_audio_readahead_ms: 120000
                                                                                target_video_readahead_ms: 120000
                                                                            }
                                                                        }
                                                                        use_server_driven_abr: true
                                                                        sabr_client_config {
                                                                            default_back_off_time_ms: 0
                                                                            enable_host_fallback: true
                                                                            primary_probing_delay_ms: 5000
                                                                            max_failure_attempts_before_fallback: 2
                                                                        }
                                                                    },
                                                                    hamplayerConfig=<YTIHamplayerConfig 0x110ca4440>: {
                                                                        enable_on_cellular: true
                                                                        qos_class: IOS_QOS_CLASS_USER_INITIATED
                                                                        decode_qos_class: IOS_QOS_CLASS_USER_INITIATED
                                                                        video_track_renderer {
                                                                            hamplayer_pixel_buffer_video_track_renderer_config {
                                                                                min_frame_queue_size: 3
                                                                                target_frame_queue_size: 22
                                                                                max_frame_fall_behind_ms: 500
                                                                                queue_more_frames_on_render: true
                                                                            }
                                                                        }
                                                                        stall_predictor {
                                                                            hamplayer_default_stall_predictor_config {
                                                                                max_buffer_readahead_ms: 8000
                                                                                min_buffer_readahead_ms: 1500
                                                                                bandwidth_tweak_scalar: 0.95
                                                                                bandwidth_tweak_constant: -48000
                                                                            }
                                                                        }
                                                                        live {
                                                                            enable_accurate_seek: false
                                                                            accurate_seek_retry_limit: 3
                                                                            enable_accurate_seek_after_prepared: false
                                                                            enable_ss_dai_emsg_parsing: true
                                                                            enable_ss_dai_update_chunk_start_time: true
                                                                            fix_post_live_head_segment: false
                                                                            finish_live_playback_if_stream_completed: false
                                                                        }
                                                                        async_decode: true
                                                                        network_stats_sampler_config {
                                                                            minimum_sample_size: 8192
                                                                            minimum_sample_duration_ms: 1
                                                                            target_sample_duration_ms: 400
                                                                        }
                                                                        decode_teardown_on_decode_queue: true
                                                                        decode_wait_for_frames_before_teardown: true
                                                                        decode_separate_queues: true
                                                                        decode_no_wait_for_terminate: true
                                                                        resync_policy_config {
                                                                            target_readahead_ms: 2000
                                                                            min_required_time_ms: 500
                                                                            max_elapsed_time_ms: 10000
                                                                            seek_tolerance_ms: 1000
                                                                        }
                                                                        audio_abr_config {
                                                                            downshift_scalar: 3
                                                                            downshift_constant: 0
                                                                            upshift_scalar: 6
                                                                            upshift_constant: 0
                                                                            max_downshift_readahead_ms: 30000
                                                                            min_upshift_readahead_ms: 0
                                                                            upshift_replace_media: false
                                                                            buffer_target_readahead: 8
                                                                            buffer_max_size_bytes: 107374182
                                                                            buffer_trim_behind: 60
                                                                            buffer_trim_ahead: 120
                                                                            max_chunks_per_request: 0
                                                                            sync_readahead: 10
                                                                            stun_duration: 0
                                                                            max_consecutive_errors: 0
                                                                            min_upshift_replace_chunks_readahead_ms: 5000
                                                                            low_memory_warn_buffer_size_bytes: 107374182
                                                                            low_memory_critical_buffer_size_bytes: 107374182
                                                                            low_memory_buffer_size_cool_down_ms: 0
                                                                            disable_hdr_in_low_power_mode: true
                                                                            observe_network_active_controller: false
                                                                        }
                                                                        video_abr_config {
                                                                            downshift_scalar: 1
                                                                            downshift_constant: 48000
                                                                            upshift_scalar: 1
                                                                            upshift_constant: 48000
                                                                            oversend_factor: 1.18
                                                                            max_downshift_readahead_ms: 30000
                                                                            min_upshift_readahead_ms: 0
                                                                            upshift_replace_media: false
                                                                            local_max_bitrate_readahead: 15
                                                                            buffer_target_readahead: 8
                                                                            buffer_max_size_bytes: 751619276
                                                                            buffer_trim_behind: 60
                                                                            buffer_trim_ahead: 120
                                                                            max_chunks_per_request: 0
                                                                            min_readahead_for_average_bitrate: 10000
                                                                            load_extra_formats: false
                                                                            sync_readahead: 10
                                                                            stun_duration: 10
                                                                            use_high_replication_formats_while_stunned: true
                                                                            max_consecutive_errors: 4
                                                                            min_upshift_replace_chunks_readahead_ms: 5000
                                                                            max_media_seconds_per_request: 11
                                                                            low_memory_warn_buffer_size_bytes: 751619276
                                                                            low_memory_critical_buffer_size_bytes: 751619276
                                                                            low_memory_buffer_size_cool_down_ms: 0
                                                                            disable_hdr_in_low_power_mode: true
                                                                            hpq_oversend_factor: 1.72
                                                                            observe_network_active_controller: false
                                                                        }
                                                                        enable_airplay_audio: true
                                                                        chunk_loader_config {
                                                                            enable_fallback_host: true
                                                                            max_failure_attempts_before_fallback: 3
                                                                            primary_probing_delay: 5000
                                                                            treat_no_media_as_cancellation: true
                                                                        }
                                                                        sbar_audio_track_renderer {
                                                                            samples_per_buffer: 10
                                                                            flush_on_return_from_background: true
                                                                            trim_priming: false
                                                                            feed_media_data: true
                                                                            handle_automatic_flush: true
                                                                            renderer_max_retry_count: 2
                                                                            use_all_tracks_for_playability_status: false
                                                                        }
                                                                        use_multiple_periods_player: true
                                                                        load_retry_config {
                                                                            max_non_network_errors: 2
                                                                        }
                                                                        render_view_type: HAMPLAYER_RENDER_VIEW_TYPE_IOSURFACE_MAIN_THREAD
                                                                        server_abr_config {
                                                                            fallback_on_error: true
                                                                            fallback_disable_server_abr_duration_seconds: 5
                                                                            enable_local_streams: false
                                                                            log_partial_chunk_eviction: false
                                                                            max_fallback_attempts: 5
                                                                            seek_through_medialib_when_receiving_partial_chunk: false
                                                                            continue_loading_timer_interval_ms: 1000
                                                                            continue_loading_timer_leeway_ms: 100
                                                                            cover_chunk_discontinuity: true
                                                                            keep_stall_for_live_when_close_to_seekable_end: false
                                                                            allow_multiple_server_seek: true
                                                                            use_reload_context_for_fallback: true
                                                                        }
                                                                        use_new_sample_buffer_source: true
                                                                        stop_track_renderer_before_disabling: true
                                                                        log_debug_details_on_long_wait_threshold_ms: 15000
                                                                        deprecate_stall_predictor: true
                                                                        player_loop_timer_interval_ms: 20
                                                                        player_loop_timer_leeway_ms: 0
                                                                        offline_config {
                                                                            downloader_apply_audio_track_filter: false
                                                                            downloader_apply_abr_filter: false
                                                                        }
                                                                        select_default_track_for_multi_audio: true
                                                                        use_reload_context_request_number: true
                                                                    },
                                                                onesieVideoData=(null),
                                                                QOEController=<MLQOEPingController: 0x115df0ef0>,
                                                                loadRetryPolicy=<MLDefaultLoadRetryPolicy: 0x28385b160>,
                                                                isLiveSource=False,
                                                                livePlayerConfig=(null),
                                                                windowedLiveConfig=(null),
                                                                metadataRelay=<MLHAMManifestlessMetadataCollector: 0x281551f80>,
                                                                delegate=<MLHAMPlayerItem: 0x122203240>,
                                                                latencyLogger=<YTWatchLatencyTickLogger: 0x2801ea200>,
                                                                watchEndpointUstreamerConfig=(null),
                                                                periodID=0,
                                                                firstRequestNumber=1,
                                                                cache=(null)

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:05:54

常见url

常见url

initplayback

initplayback

发起（正常视频或广告视频的）视频数据请求的

https://rr3---sn-vgqsknek.googlevideo.com/initplayback?source=youtube&orc=1&oeis=1&c=IOS&oss=1&oda=1&oad=5500&ovd=5500&oaad=11000&oavd=11000&ocs=700&oputc=1&oses=1&ofpcc=1&osbr=1&osnz=1&msp=1&odeak=1&odepv=1&osfc=1&id=553003fe2eb8727c&initcwndbps=1680000&mt=1655903589&ack=1&cpn=jcLGzlc6c8LsaaDH&rn=1&opr=1&pvi=160,133,134,135,136,137,298,299,264&pai=139,140

redirector：没啥用

https://redirector.googlevideo.com/initplayback?source=youtube&itag=0&pvi=0&pai=0&owc=yes&cmo=rnp%3Drr&id=0000000000002409

videoplayback

videoplayback

ctier=L

https://rr2---sn-a5meknsy.googlevideo.com/videoplayback?expire=1657110332&ei=3CrFYrS3B8qlkwbDk6m4Dg&ip=76.170.156.167&id=o-AN990KkuGRjkOtpS0zvkbcCippQdwVTosh4W04OICinJ&source=youtube&requiressl=yes&hcs=ir,&mh=v4&mm=31,26&mn=sn-a5meknsy,sn-q4flrnez&ms=au,onr&mv=m&mvi=2&pl=17&rmhost=rr3---sn-a5meknsy.googlevideo.com,&ctier=L&initcwndbps=2142500&svpuc=1&sabr=1&mt=1657088457&fvip=5&keepalive=yes&fexp=24001373,24007246&c=IOS&sparams=expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr&sig=AOq0QJ8wRQIhAPXZb_XYMsCV_fhO5opM85fJbwUAdMIXGhBCYe3yDHi6AiBAwpSbmd53tjQZadmgq3rLdyX-Nd5447nkXP6NBPXNHQ%3D%3D&lsparams=hcs,mh,mm,mn,ms,mv,mvi,pl,rmhost,initcwndbps&lsig=AG3C_xAwRQIhAP22VWdWbIIxrvp9iCm3NMY8QQ4TS3UrFwJFxyxZH7C2AiAhnv2jgK4Nj0SwXmhuddVSWSRvX8iGYRtWZJsfBG03XQ%3D%3D&cpn=5ofB6P6ORRZhJUE8&rn=7&probe=1

ctier/L

https://r2---sn-q4flrnez.googlevideo.com/videoplayback/expire/1657108318/ei/_iLFYofvH72QsfIPy56rkA0/ip/76.170.156.167/id/o-AIPVOknUnDee3HugNutm3ybodjkv230I_U-FbZP3qt_k/source/youtube/requiressl/yes/mh/sw/mm/31,26/mn/sn-a5meknzs,sn-q4flrnez/ms/au,onr/mv/m/mvi/5/pl/17/ctier/L/initcwndbps/2056250/svpuc/1/sabr/1/mt/1657086303/fvip/2/keepalive/yes/fexp/24001373,24007246/c/IOS/sparams/expire,ei,ip,id,source,requiressl,ctier,svpuc,sabr/sig/AOq0QJ8wRgIhALUv6hCXG_Dq8gwMkYfOxUAcH6KUBSZBcf6CikscQYp1AiEAkcLG_OxZHTcNs4tzkRl09AwqcVwYXQ374k3kyGOPZ-0=/lsparams/mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AG3C_xAwRAIgH8N-m_KKOvrdVXq7KWBgjV27TWKPn48MQjYw9qWlP1ACIFk-KqOBGsauP4fBIHDVfLC6w78LrlgHmuKzWXwKgVIt/cpn/vTddLlWhp7fI_1Ze/fallback_count/1/?rn=6

ad_break

ad_break

iOS

https://youtubei.googleapis.com/youtubei/v1/player/ad_break?key=AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc

web

https://www.youtube.com/youtubei/v1/player/ad_break?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:10:24

逆向YouTube总结

逆向YouTube总结

iOS逆向YouTube的话：

普通的类的逆向，相对不难

毕竟针对于防破解做的很弱

估计和欧美对于知识产权保护的比较严，有关系

有些底层的类，想要搞懂逻辑，不太容易

比如：

Cronet的相关调用

-[HAMCronetDataLoadTask startWithDelegate:delegateQueue:]

以及涉及到protobuf

普通的类，容易通过GPBMessage找出原始字段定义

但部分关键的类，还是被保护起来了：做成了lite版的protobuf类

比如：

OnesieRequestProto

等等

只能很艰难的，通过反推MessageLite的vtable定义，再加上底层调试，才或许有机会，找出真正字段的定义（暂未来得及完成）

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 11:17:43

子教程

子教程

iOS逆向YouTube

Protobuf相关

iOS逆向YouTube：protobuf逆向

相关代码

crifan/iOSYouTubeAdsFilter: MonkeyDev+Xcode项目，iOS逆向YouTube，尝试实现广告过滤功能

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-06 17:57:11

附录

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:54:52

参考资料

参考资料

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-27 10:51:59