第一期:2018/11/5-2018/11/11
概要:匿名内部类持有外部实例引用的泄漏case。onFinishInflate一直会调用,但是onAttachedToWindow的调用:addView的时候parent view有window会立即调用,没有window会等parent attach to 一个window的时候调用。而且,View.onAttachedToWindow() is called on the first view traversal, sometime after Activity.onStart()
概要:Dalvik VM(Android 5.0以前)在当前message被消耗又没有新的message入队的时候不会gc掉这个message,AlertDialog的onClickListener会入消息队列,被message持有,message发送的时候是copy了一份,最初的message并没有被发送,所以永远不会被回收,如果listener持有外部activity引用会造成内存泄漏。解决办法:clearOnDetach/send an empty message
概要:square tech leader PY重度使用fragment后的总结。1. Most of our difficult crashes were related to the fragment lifecycle. 2. We only need views to build a responsive UI, a backstack, and screen transitions.
概要:支付宝通过抑制GC提升启动速度的大致思路:取消 softlimit 检测,取消 GC 线程的唤醒,取消 GC 例程函数,OOM 停止 GC 抑制。
概要:使用Android官方live-data组件赋予data感知UI生命周期的能力。常出现在viewmodel中,主要有onActive(),onInactive(),setValue()几个重要方法。
概要:1.混淆。2.防hook。3.防抓包。4.防调试。5.签名校验。6.加固。
第二期:2018/11/12-2018/11/18
概要:fresco中封装的OOMSoftReference<T>中持有3个相同的SoftReference<T>,原因是Dalvik每次GC的时候会把排在偶数位的SoftReference当成WeakReference来处理(如果它的引用不是GC Roots可达),如果GC for alloc之后仍没有足够内存分配 ,所有的SoftReference都会被clear。这意味着只要某对象有一个SoftReference活着,那它所有的SoftReference都活着,所以利用两个连续的SoftReference就能保证不会被GC,为了保险这里使用了三个。确保了只有在抛OOM之前OOMSoftReference在会被回收。
概要:RxJava vs kotlin coroutines
| RxJava | kotlin coroutines |
|---|---|
| Performance overhead 操作符生成大量对象 | 较少对象 |
| Unreadable stacktrace | Unreadable stacktrace |
| The learning complexity & Readability | higher Readability |
kotlin coroutines 写起来很像js的async await,非常接近同步写法了。
-
The Android Lifecycle cheat sheet — part II: Multiple activities
-
R8, the new code shrinker from Google, is available in Android studio 3.3 beta
概要:R8 does all of shrinking, desugaring and dexing in one step. When comparing to the current code shrinking solution, Proguard, R8 shrinks the code faster while improving the output size.
第三期:2018/11/19-2018/11/25
概要:@JvmOverloads在Android开发中诸多的坑。。。
第四期:2018/11/26-2018/12/2
概要:Java字节码调方法的指令有:
-
invokevirtual——对实例方法的标准分派,根据实例类调用方法
-
invokestatic——用于分派静态方法
-
invokeinterface——用于通过接口进行方法调用的分派,比如List
-
invokespecial——invoke构造函数或者私有方法,当前实例父类的方法
-
invokedynamic——当解释器遇到该指令时候会调用BSM,返回一个CallSite类型的对象,包含一个MethodHandle,当包含invokedynamic的类加载时,调用点会处于“unlaced”状态,在BSM返回之后,得到的CallSite和方法句柄会让调用点处于“laced”状态。