Skip to content

Latest commit

 

History

History
99 lines (81 loc) · 4.3 KB

youshi.md

File metadata and controls

99 lines (81 loc) · 4.3 KB

优势

熟悉底层原理,了解flutter,了解一般数据结构

1. 内存优化

  1. 图片下采样
  2. 离屏渲染
  3. kvo 页面统计加载时间
  4. LRU算法

2. 启动优化

  1. 二进制插桩
  2. 业务接口合并,重复接口改成内存数据服务,用到的地方还需要读即可。
  3. load函数迁移
  4. 废弃class清理

3. 崩溃处理

  1. APP不立即次崩溃,可以手机崩溃堆栈发送到服务器
CFRunLoopRef runloopRef=CFRunLoopGetCurrent();
	
while (!dismiss) {
	for (NSString * item in (__bridge NSArray *)CFRunLoopCopyAllModes(runloopRef) ) {
		CFRunLoopRunInMode((CFStringRef)item, 0.01, false);
	}
}

4. runtime的实际应用

  1. 利用关联对象存储时间,然后在+load调换hitTest函数,根据点击的时间间隔来判断是否响应该次点击。
  2. jsonModel利用runtimekvc来实现的
  3. KVO其实内部就runtime动态生成了NSKVONotifying_XXX类,重写了获取class的方法。
  4. 做了一个动态库来记录method_exchange的历史记录,需要将该动态库调整到第一个才行。

5. 读写锁 与缓存

  1. momeryCache利用自旋锁/os_unfair_lock,性能更好
  2. diskCache利用mutex_lock互斥锁就能满足需求
  3. 读写常用文件需要家读写锁来防止资源竞争
  4. 读写锁是多读单写,读写互斥
  5. FYML 记录方法交换历史
  6. fishhook原理/冬瓜fishhook原理
  7. os_un_fair_lock互斥锁,NSLock是互斥锁

-w466

首先遍历load_com,找到link_edit基地址/systabdysytab确认2个section的偏移量,,然后遍历一次找到symtabdysytab中的符号,将符号指向需要替代的地址。

首先是image已经读入系统,然后修改image中的符号表和动态符号表中的函数地址,指向需要的函数即可。

修改之前调用还是直接调用系统函数,修改之后调用自己的函数。因为符号表在__DATA段,修改不限制。

可以根据自定义函数的地址和section范围来判断是否被中间人hook了。

  1. 为什么分类的方法可以覆盖类的方法?
 if (mlist) {
    if (mcount == ATTACH_BUFSIZ) {
		// attachCategories 追加分类方法 然后调用attachLists
		//将后边追加的mcount个数据,挪到了数组前边。
        prepareMethodLists(cls, mlists, mcount, NO, fromBundle, __func__);
        rwe->methods.attachLists(mlists, mcount);
        mcount = 0;
    }
    mlists[ATTACH_BUFSIZ - ++mcount] = mlist;
    fromBundle |= entry.hi->isBundle();
}

6. flutter

携程酒店flutter性能优化

  1. 局部刷新
  2. 复杂的UI利用分帧刷新处理,首先用一个Container占位,等下一帧开始渲染时候再进行刷新
  3. 负责图像加入RepaintBoundary,引擎认为足够复杂则会缓存下来
  4. 列表页包含的数据直接url带入详情页,降低服务端压力
  5. 内存泄露 利用devtool查看页面实例对象,和native交互的时候不使用feature,使用
void callNative () {
Future future = FlutterBridge. callNative ("method");
   _streamSubscription?.cancel();
   _streamSubscription = future?.asStream()?.listen((value)
{
       do something;
});
}

void onPageDestroy() {
   _ streamSubscription?.cancel();
}
  1. 页面数据的预加载,提高用户体验

一些观察者模式中的订阅者在页面退出时没有取消订阅

8. py做的自动化数据校验功能,生成各种尺寸Icon脚本