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状态渲染。
遇到的问题:
- 奥创冗余数据及后端接口慢 -> 购物车本地数据缓存 + (detail/购物车进下单页)的数据预加载 + 购物车预加载的根据abtest下做的精细运营。
- LiveData的使用:购物车提供给MainActiivty的其他Tab由于时机问题导致的刷新问题
- 多国家配置不同组件 -> 问题:一些组件不同国家需要配置不同的样式和逻辑,但是下发的组件名是一致的。那么当时有两种做法:一种是直接在解析是篡改掉网络数据中的组件名,本地正常映射。但是这个评估完认为直接修改了数据,风险更不好控。于是我在注册组件名时根据依靠 同名Parser后注册的Parser优先匹配的机制 实现 的特性,在注册Parser时提供将多国家的parser后置接口,于是当解析完多国家组件parser后即不会再映射通用组件了,即不影响原数据,也实现了多国家不新增后端组件。
RTL adapte
- What: Ltr下不同币种导致的显示顺序错乱;
- How: 服务端配置下发特殊符号
- More:
做过印象比较深的事情 ,有挑战的事情
弱网环境优化:业务和技术的手段,有什么很技术的手段来做吗
当前团队的优劣点
遇到不合理需求你会怎么拒绝
有用过新的东西吗
线上问题怎么解决,因为不能用动态字节码技术
遇到啥有意思的问题吗,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
39java.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;同时降低起设备图片内存池大小;