empty

  • PackageManagerService

  • WindowManagerService(done?)

  • ActivityManagerService(done?)

  • ServiceManager(done?)

  • Binder
  • ANR

1、review

kernel bright spots

  • Apm监控
  • fresco深入优化
  • 性能优化工作/工具

skills pool

  • recyclerview缓存和优化

  • app、android启动流程

  • 编译流程

  • 编舞者以及屏幕刷新原理(与耗时方法监听之)

  • 插件化(代理和hook两种方式)

  • handler

  • https&http(http version)

  • hashmap

  • Matrix为主,Dokit、blockcanary等APM框架

  • Jmm与GC算法(深入理解java虚拟机-标记清除之类)

  • tcp滑动窗口之类(就找一篇文章like腾讯之前的那篇tcp ip问题彻底弄懂TCP协议:从三次握手说起 (qq.com)

  • leakCanary、retrofit、okhttp、glide、

  • threadLocal、Rv四级缓存

2、TODO

  • kotlin协程
  • 算法(1~2)
  • View测绘,事件分发(事件系列只能被整一个处理)
  • SurfaceView, TextureView及View的区别。SurfaceView怎么控制它处于的层级
  • SMTP了解下

3、Optimize Experience

  • 图片内存优化工作:fresco关于gif缓存问题修复,dokit图片闪烁缓存失效问题的修复、基于dokit框架(ASM)下尺寸过大图片识别实现。(基于业务做的一些图片加载的优化,如cdn链接统一域名,regex(String.replace)耗时200us)

  • 耗时方法,两种常见的监听方式:looper.printer 以及 编舞者回调监听

  • recyclerview优化

4、Other

  • h5图片缓存共用的优化思路
  • 阿里patron和Metrix做的native hook 减少32bit模式下app内存占用

Project Experience

从购物车重构到购物车预加载

ps:我并不想抽象的去将购物车的架构之类的东西,而是更具体的讲遇到的问题及解决方案。不过还是得简单讲一下设计

购物车代码十分屎山,难以维护。在23年时做了一次历经一个月的重构,边开车边换轮子。使用多数业务在用的协议架构奥创重构:先说收益:奥创加购以组件为单位,职责清晰,易于复用维护,端侧组件使用MVVM架构进一步解耦逻辑:

举个例子,请求在model层(共用的Repository,维护于Engine层),每个组件通过注册组件的ViewHolder获得独立的View,注册组件的Parser获得独立的ViewModel解析数据及进行业务逻辑处理。view与vm之间使用liveData进行数据更新后的通知view状态渲染。

遇到的问题:

  1. 奥创冗余数据及后端接口慢 -> 购物车本地数据缓存 + (detail/购物车进下单页)的数据预加载 + 购物车预加载的根据abtest下做的精细运营。
  2. LiveData的使用:购物车提供给MainActiivty的其他Tab由于时机问题导致的刷新问题
  3. 多国家配置不同组件 -> 问题:一些组件不同国家需要配置不同的样式和逻辑,但是下发的组件名是一致的。那么当时有两种做法:一种是直接在解析是篡改掉网络数据中的组件名,本地正常映射。但是这个评估完认为直接修改了数据,风险更不好控。于是我在注册组件名时根据依靠 同名Parser后注册的Parser优先匹配的机制 实现 的特性,在注册Parser时提供将多国家的parser后置接口,于是当解析完多国家组件parser后即不会再映射通用组件了,即不影响原数据,也实现了多国家不新增后端组件。

RTL adapte

  1. What: Ltr下不同币种导致的显示顺序错乱;
  2. How: 服务端配置下发特殊符号
  3. More:
  1. 做过印象比较深的事情 ,有挑战的事情

  2. 弱网环境优化:业务和技术的手段,有什么很技术的手段来做吗

  3. 当前团队的优劣点

  4. 遇到不合理需求你会怎么拒绝

  5. 有用过新的东西吗

  6. 线上问题怎么解决,因为不能用动态字节码技术

  7. 遇到啥有意思的问题吗,crash。window

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    java.lang.IllegalArgumentException: View=android.widget.PopupWindow$PopupDecorView{2a10009 V.E...... R.....I. 0,0-0,0} not attached to window manager
    at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:544)
    at android.view.WindowManagerGlobal.updateViewLayout(WindowManagerGlobal.java:433)
    at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:162)
    at android.widget.PopupWindow.update(PopupWindow.java:2226)
    at android.widget.PopupWindow.update(PopupWindow.java:2347)
    at android.widget.PopupWindow.alignToAnchor(PopupWindow.java:2517)
    at android.widget.PopupWindow.-$$Nest$malignToAnchor(Unknown Source:0)
    at android.widget.PopupWindow$1.onViewAttachedToWindow(PopupWindow.java:243)
    at android.view.View.dispatchAttachedToWindow(View.java:21423)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3502)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3509)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3011)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2518)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9389)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1451)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1459)
    at android.view.Choreographer.doCallbacks(Choreographer.java:1089)
    at android.view.Choreographer.doFrame(Choreographer.java:1003)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1431)
    at android.os.Handler.handleCallback(Handler.java:942)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:210)
    at android.os.Looper.loop(Looper.java:299)
    at android.app.ActivityThread.main(ActivityThread.java:8261)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)

OOM的治理:crash率在一次架构组的升级后由万4涨到万6,其中新增了很多的OOM。1:修复了EventCenter的内存泄露;2:搜推服务造成的泄露;

内存兜底措施:2g设备直接改为RGB565,其他才开ARGB8888;同时降低起设备图片内存池大小;

Author

white crow

Posted on

2021-07-30

Updated on

2024-05-11

Licensed under