滴滴出行IOS端瘦身实践

2020-03-01 225浏览

  • 1.滴滴出⾏行行 iOS 端瘦身实践 戴铭/技术专家
  • 2.
  • 3.
  • 4.急䅱䤇憌
  • 5.
  • 6.LSUnusedResourceshttps://github.com/tinymind/LSUnusedResources
  • 7.https://github.com/onevcat/FengNiao
  • 8.⼤大⽐比例例压缩
  • 9.PNG 转 WebP PNG 转换以及压缩⼯工具iSparta -http://isparta.github.io/
  • 10.WebP 项⽬目主⻚页 -https://developers.google.com/speed/webp/ iOS WebP 解析库 -https://github.com/carsonmcdonald/WebP-iOS-example
  • 11.为何使⽤用 Webp Webp 压缩率⾼高,⽀支持有损与⽆无损压缩 WebP 体积⼤大幅减少,⾁肉眼看不不出差异 WebP ⽀支持 Alpha 透明和 24-bit 颜⾊色数,不不像 PNG8 ⾊色彩不不够出现⽑毛边 Gif 转 Animated WebP 有损可减少 64%,⽆无损 19%
  • 12.⼩小于 256 ⾊色适合⽆无损压缩,压缩率⾼高,参数使⽤用 lossless -q 100 ⼤大于 256 ⾊色使⽤用 75% 有损压缩,参数使⽤用 -q 75 远⼤大于 256 ⾊色使⽤用 75% 以下压缩率, 参数 -q 50 -m 6
  • 13.WebP 的缺点 较 PNG 消耗2倍左右 CPU 和 解码时间 全平台⽀支持度不不够。不不过在 iOS 上可以通过对应的 iOS 的 WebP 解析库解决
  • 14.⼤大资源⽂文件 ⽐比如表情包下载后使⽤用
  • 15.收益⼀一般的⽅方法
  • 16.重复资源检测:https://github.com/adrianlopezroche/fdupes ⾳音频压缩瘦身:http://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX 简单图⽚片使⽤用代码替换 将代码⾥里里的静态字符串串抽取出来放到静态⽂文件⾥里里
  • 17.基于编译后的瘦身
  • 18.
  • 19.
  • 20.
  • 21.基于编译过程的 Clang Plugin 瘦身
  • 22.能做的事情 分析调⽤用关系,找出没被调⽤用的代码
  • 23.原理理 编写分析全部源码的插件 编译过程中将插件作为 Clang 参数载⼊入⽣生成中间⽂文 件 编写⼯工具分析所有的⽅方法有哪些是会被调⽤用
  • 24.通过 Clang 遍历语法树 获取嵌套访问关系
  • 25.设计插件数据结构
  • 26.类接⼝口与继承体系 ObjCInterfaceDecl ( 接⼝口声明 ) ObjCCategoryDecl ( 分类声明 ) ObjCPropertyDecl ( 属性声明 ) ObjCMethodDecl ( ⽅方法声明 )
  • 27.协议的接⼝口与继承体系 ObjCProtocolDecl (协议声明) ObjCPropertyDecl (属性声明) ObjCMethodDecl (⽅方法声明)
  • 28.接⼝口⽅方法调⽤用 正常的 - -/+[Classmethod:\*] NSObject 协议的 performSelector ⽅方法簇 ⼿手势/按钮的事件处理理 selector NSNotificationCener 添加通知处理理 Selector UIBarButtonItem 添加事件处理理 Selector Timer NSThread CADisplayLink KVO 机制 IBAction 机制 [XXX new] - 包含+[XXX alloc]和-[XXX init]
  • 29.编写插件
  • 30.编写插件步骤
  • 31.⾃自定义继承clang::PluginASTAction(基于 consumer 的抽象语 法树(Abstract Syntax Tree/AST) 前端 Action 抽象基 类)clang::ASTConsumer( ⽤用于客户读取抽象语法树的 抽象基类 ),clang::RecursiveASTVisitor( 前序或后续地深度优 先搜索整个抽象语法树,并访问每⼀一个节点的基类)等 基类。
  • 32.根据⾃自身需要重载⼀一下⽅方法 实现⾃自定义的分析逻辑PluginASTAction::CreateASTConsumerPluginASTAction::ParseArgsASTConsumer::HandleTranslationUnitRecursiveASTVisitor::VisitDeclRecursiveASTVisitor::VisitStmt
  • 33.插件⽣生成与集成 注册插件:staticFrontendPluginRegistry::AddX("my-plugin-name", “my-plugin-description"); 编译⽣生成插件(dylib) 使⽤用 XcodeHacking 是插件与Xcode集成 示例例:https://github.com/kangwang1988/XcodeZombieCode
  • 34.代码级瘦身
  • 35.AppCode 清理理⽆无⽤用的类
  • 36.AppCode 还能清理理什什么
  • 37.更更多功能
  • 38.AppCode 的问题 JSONModel ⾥里里定义了了未使⽤用的协议会被判定⽆无⽤用协议 如果⼦子类使⽤用了了⽗父类的⽅方法不不会被认为使⽤用 通过点使⽤用属性会被认为没有使⽤用 UITableview registerClass 的问题。⾃自定义Cell 在 tableview registerClass 但会被认为没⽤用 使⽤用 NSClassFromString 的情况查不不出来,⽐比如 layerClass = NSClassFromString(@“SMFloatLayer"); 使⽤用 [[self class] accessToken] 这样的使⽤用类⽅方法的会被认为没有⽤用 运⾏行行时⽐比如 selfperformSelector:@selector(arrivalRefreshTime)检测不不出
  • 39.结构瘦身
  • 40.基于字符查找相似代码
  • 41.SameCoderFinder SameCodeFinder 可以在源代码⽂文件中检测到相同的 function。 可以显示两个 function 之间的 Hamming 距离。 找到需要提取重复使⽤用的相同代码 显示每个源⽂文件之间的 Hamming 距离(⽀支持各种 soucecode 类型) 显示每个源⽂文件 function 之间的 Hamming 距离(现在⽀支持 Java 和 Objective-C) GitHub地址:https://github.com/startry/SameCodeFinder
  • 42.Simhash
  • 43.确定simhash的位数,⽐比如说32位 将simhash的各位初始化为0 提取原始⽂文本中的特征,⼀一般采⽤用各种分词的⽅方式。⽐比如对 于"the cat sat on the mat",采⽤用两两分词的⽅方式得到如下结 果:{"th", "he", "e ", " c", "ca", "at", "t ", " s", "sa", " o", "on", "n ", " t", " m", "ma"} 使⽤用传统的32位hash函数计算各个word的hashcode,⽐比 如:"th".hash = -502157718 ,"he".hash = -369049682 然后对 hash_weight_pairs(5 -5 5 -5 5 5)进⾏行行位的纵向累 加,如果该位是1,则+weight,如果是0,则-weight,最后⽣生成 bits_count个数字,如图所示是[13, 108, -22, -5, -32, 55], 这⾥里里 产⽣生的值和hash函数所⽤用的算法相关 [13,108,-22,-5,-32,55] -> 110001这个就很简单啦,正1负0
  • 44.
  • 45.simhash值的海海明距离计算 ⼆二进制串串A 和 ⼆二进制串串B 的海海明距离 就是 A xor B 后⼆二进制中1的个数 A = 100111; B = 101010; hamming_distance(A, B) = count_1(A xor B) = count_1(001101) = 3;
  • 46.⽐比如 p1:the cat sat on the mat p2:the cat sat on a mat p3:we all scream for ice cream p1.simhash => 851459198 00110010110000000011110001111110 p2.simhash => 847263864 00110010100000000011100001111000 p3.simhash => 984968088 00111010101101010110101110011000 (p1,p2)=4 (p1,p3)=16 (p2,p3)=12
  • 47.两个 Paper 《Detecting Near-Duplicates For Web Crawling》http://wwwconference.org/'>http://wwwconference.org/