Activity相关
- Android 基础知识
- Activity 的几种启动模式及应用场景
- taskAffinity 属性详解
- onSaveInstanceState()和onRestoreInstanceState()使用详解
测试下来发现:onSaveInstanceState()在onStop之后调用,onRestoreInstanceState在onStart()之后调用。可以在ActivityThread类的callActivityOnStop()
方法和handleStartActivity()
方法中看出来。
- 从点击桌面应用图标到MainActivity的onResume过程分析
Fragment相关
Fragment生命周期和Activity生命周期
与其他 Fragment 通信
Fragment中调用startActivityForResult的那些坑
关于Fragment重叠问题分析和解决
Fragment 重叠(重影)问题
Service相关
Android一般的进程优先级划分:
1.前台进程 (Foreground process)
2.可见进程 (Visible process)
3.服务进程 (Service process)
4.后台进程 (Background process)
5.空进程 (Empty process)
安卓系统,根据oom_adj
, 占用内存大小,进程活跃程度,来综合决定回收哪个进程。oom_adj 存储在proc/PID/oom_adj
文件中,其中PID是进程的id,直接 adb shell进入手机根目录查看这个文件即可。
比如我现在进程是在最前面和我交互的,是前台进程,进程id是18303,这样查看。
1|HWNOH:/ $ cat /proc/18303/oom_adj
0
HWNOH:/ $
然后我退到后台,再次查看。
1|HWNOH:/ $ cat /proc/18303/oom_adj
11
HWNOH:/ $
Service的运行线程,Service启动方式以及如何停止直接看 ServiceDemo
android进程保活实践
Android进程保活的一般套路
IntentService源码分析
Android布局优化之ViewStub、include、merge
- ViewStub--使用介绍
- Android最佳性能实践(四)——布局优化技巧
BroadcastReceiver 相关
- Android 基础知识
- BroadcastReceiverDemo
AsyncTask相关
- 菜鸟看源码之AsyncTask
- Android AsyncTask完全解析,带你从源码的角度彻底理解
Android 事件分发机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android事件分发机制
Android View 绘制流程
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
- Android invalidate是如何导致View重绘的
Android Window、Activity、DecorView以及ViewRoot
- 简析Window、Activity、DecorView以及ViewRoot之间的错综关系
- Android图形系统(四)-Activity、Window、View关系总结
Android的核心Binder多进程AIDL
- Android Binder学习笔记(一)
- Android Binder学习笔记(二)
- 写给 Android 应用工程师的 Binder 原理剖析
AMS,WMS,PMS
- (连载)Android 8.0 : 如何下载和阅读Android源码
git clone https://android.googlesource.com/platform/frameworks/base
替换成
git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base
- Android 镜像使用帮助
- Android解析ActivityManagerService(一)AMS启动流程和AMS家族
- ActivityManagerService是什么?有什么作用?
- Android解析WindowManagerService(一)WMS的诞生
Android ANR
- Android性能优化(七)之你真的理解ANR吗?
- 彻底理解安卓应用无响应机制
Android 内存相关
- Android 内存泄漏分析
Android 屏幕适配
- 屏幕兼容性概览
Android 缓存机制
- 彻底解析Android缓存机制——LruCache
Android 性能优化
- Android App优化之内存优化(序)
- Android性能优化(三)之内存管理
- Android 性能优化(四)之内存优化实战
- 最全的Android内存优化技巧
Android MVC、MVP、MVVM
- 如何构建Android MVVM 应用框架
- humanheima/archi
Android Gradle 知识
- 配置编译版本
- Gradle 之一安卓构建流程
- Android Studio 'Run' 按钮后面的秘密
RxJava
- RxJava 线程模型分析
- RxJava2源码学习之二
OkHttp
- OkHttp源码学习之一
- OkHttp 源码剖析系列(六)——连接复用机制及连接的建立
OkHttp是一个高效HTTP客户端,原因如下:
- HTTP/2支持请求同一个host的多个请求共享一个socket连接。
- 连接池降低请求延迟(HTTP/2不可用的情况)。
- 透明的GZIP压缩下载体积。
- 响应缓存,避免完全重复的request发起网络请求,可以直接从缓存里面获取响应。
当OkHttp遇到网络问题的时候,它会静默的从常见的连接问题中恢复。如果你的服务有多个IP地址,当第一次连接失败的时候,OkHttp会尝试其他的地址。对于IPv4+IPv6以及服务放在多个数据中心的情况,这是很重要的。OkHttp支持先进的TLS(传输层安全协议)特性。
使用OkHttp很简单。它的request/response API都是使用构建模式创建,并且是不可变的。OkHttp支持同步和异步请求。
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
漫画:什么是 HTTPS 协议?
三次握手四次挥手
- TCP建立连接为什么是三次握手,为什么不是两次或四次?
为什么要四次挥手呢?
- 主动结束端发送消息给被动结束端,说明主动结束端已经没有数据发送了。
- 被动结束端收到消息后,被动结束端的数据可能还没有发送完毕,所以他先发送一个消息告诉主动结束端:"我知道了"。
- 被动结束端数据发送完毕后,通知主动结束端:“我数据发送完了,可以关闭连接了。”。
- 主动结束端发送一个消息给被动结束端,如果在两倍超时间内没有收到响应,就断开连接。
Retrofit
- Retrofit源码学习之一
Android 热更新与插件化
- Android 插件化和热修复知识梳理
- 深入理解Android插件化技术
- 热修复——深入浅出原理与实现
- Android 热修复 - 各框架原理学习及对比
Android组件化
WMRouter:美团外卖Android开源路由框架
Android 组件化最佳实践
从零开始搭建Android组件化框架
Android模块开发之SPI 通过
ServiceLoader
来加载所有的接口的实现类也可以了解一下。
卡顿相关
卡顿原因是什么,如何检测卡顿,怎么判断是页面响应卡顿还是逻辑处理造成的卡顿?
卡顿原理是什么:60帧每秒是目前最合适的图像显示速度,也是绝大部分Android设备设置的调试频率,如果在16ms内顺利完成界面刷新操作可以展示出流畅的画面,而由于任何原因导致接收到VSYNC信号的时候无法完成本次刷新操作,就会产生掉帧的现象,刷新帧率自然也就跟着下降(假定刷新帧率由正常的60fps降到30fps,用户就会明显感知到卡顿)
造成卡顿的常见原因:
- 过度绘制
- 去除不必要的背景
- 布局文件扁平化
- merge、ViewStub标签的使用
- UI线程中有耗时操作,I/O读写、数据库访问等;
- 减少ui线程中的耗时操作
- 频繁的GC
- 避免内存抖动,瞬间创建大量的临时对象。不要在for循环中去new对象或在onDraw方法中创建对象等。
- 避免内存泄漏。
如何检测卡顿?
- StickMode
- TraceView(已被弃用,考虑使用 Android Studio自带的CPU Profiler)
- AndroidPerformanceMonitor
- ANR-WatchDog
- Choreographer
推荐使用 AndroidPerformanceMonitor和Android Studio自带的CPU Profiler
怎么判断是页面响应卡顿还是逻辑处理造成的卡顿?
关于运算阻塞导致的卡顿的分析可以使用TraceView(已被弃用,考虑使用 Android Studio自带的CPU Profiler)android studio:profiler调试闪退解决方法
备注:我的理解页面响应卡顿就是指布局过于复杂、过度绘制造成的卡顿。可以打开发开者选项里的OverDraw(调试GPU过度绘制)和GPU呈现模式来查看
- AndroidPerformanceMonitor(BlockCanary)源码分析参考这篇文章 Android中UI性能分析原理。源码可以参考:https://github.com/humanheima/AndroidPerformanceMonitor
- Android性能优化(六)之卡顿那些事
- Android APP 卡顿问题分析及解决方案
- Android UI性能优化 检测应用中的UI卡顿
Handler 机制原理,IdleHandler 什么时候调用。
- Android IdleHandler 原理浅析
- 【送书】面试题之 IdleHandler 相关原理浅析
LeakCanary 原理,为什么检测内存泄漏需要两次?
我的理解为什么要检测两次? 其实就是为了准确性呗。宁可错杀一百,不愿放过一个。
- 如果在activity destroy以后并且在5秒钟之后系统没有进行gc,那么activity对象是没有被回收的,此时我们检测发现activity对象没有被回收,然后我们再手动调用一次gc,gc过后,我们再检测一次activity对象是否被回收,如果被回收了,那么结束,如果activity对象还是没有被回收说明很可能出现了内存泄漏无法被回收,所以我们就并dump出当前的内存文件供之后进行分析。
- LeakCanary原理解析
- LeakCanary使用及原理
属性动画、补间动画、帧动画的区别和使用场景;
Android 动画框架详解,第 1 部分 这篇文章讲了补间动画实现原理
Android应用开发之所有动画使用详解
Android中属性动画和补间动画的区别
APK 瘦身是怎么做?
- Android性能优化之APK瘦身详解(瘦身73%)
冷启动优化
Android性能优化(一)之启动加速35%
https://zhuanlan.zhihu.com/p/86283192
RecyclerView相关
源码过于复杂,暂时不去了解
如何判断一个 APP 在前台还是后台?
- Android--判断App处于前台还是后台的方案
代码可以参考
https://github.com/humanheima/ActivityDemo
如何做应用保活?全家桶原理?
- android进程保活实践
- Android进程保活的一般套路
- 关于 Android 进程保活,你所需要知道的一切
Retrofit 在 OkHttp 上做了哪些封装?
- Okhttp 与 Retrofit的简单介绍及两者间的联系
- Java动态代理
invalidate和requestLayout的区别
- requestLayout和invalidate 区别
Parcelable & Parcel
Parcel是一个可以通过IBinder来发送的消息 (data and object references) 容器。Parcel不是一个通用的序列化机制。Parcelable & Parcel和被设计成一个高性能的IPC传输。因此,Parcel数据不适合持久存储(存储在文件中)。
Parcelable的原理
如何将 Parcelable 保存到本地文件里
ButterKnife
- ButterKnife源码解析
加载超级大的图片
- Android 高清加载巨图方案 拒绝压缩图片
- subsampling-scale-image-view
SurfaceView 和 TextureView 的区别。
- 视频画面帧的展示控件 SurfaceView 及 TextureView 对比
Android 打包流程
Android中的Dalvik和ART区别分析
- Android 8.0 中的 ART 功能改进
- Android中的Dalvik和ART区别分析
进程管理
V1 V2 V3 签名
- Android 端 V1/V2/V3 签名的原理
- 新一代开源Android渠道包生成工具Walle
- Android美团多渠道打包Walle集成
Walle渠道包生成工具基于V2签名:
对新的应用签名方案生成的APK包中的ID-value进行扩展,提供自定义ID-value(渠道信息),并保存在APK中
而APK在安装过程中进行的签名校验,是忽略我们添加的这个ID-value的,这样就能正常安装了
在App运行阶段,可以通过ZIP的EOCD(End of central directory)、Central directory等结构中的信息(会涉及ZIP格式的相关知识,这里不做展开描述)找到我们自己添加的ID-value,从而实现获取渠道信息的功能
新一代渠道包生成工具完全是基于ZIP文件格式和APK Signing Block存储格式而构建,基于文件的二进制流进行处理,有着良好的处理速度和兼容性,能够满足不同的语言编写的要求,目前笔者采用的是Java+Groovy开发, 该工具主要有四部分组成: 1. 用于写入ID-value信息的Java类库 2. Gradle构建插件用来和Android的打包流程进行结合 3. 用于读取ID-value信息的Java类库 4. 用于供com.android.application使用的读取渠道信息的AAR
这样,每打一个渠道包只需复制一个APK,然后在APK中添加一个ID-value即可,这种打包方式速度非常快,对一个30M大小的APK包只需要100多毫秒(包含文件复制时间)就能生成一个渠道包,而在运行时获取渠道信息只需要大约几毫秒的时间。
下面的代码获取渠道信息:
WalleChannelReader的 getChannel 方法。
@Nullable
public static String getChannel(@NonNull final Context context) {
return getChannel(context, null);
}
@Nullable
public static String getChannel(@NonNull final Context context, @NonNull final String defaultChannel) {
final ChannelInfo channelInfo = getChannelInfo(context);
if (channelInfo == null) {
return defaultChannel;
}
return channelInfo.getChannel();
}
硬件加速相关
在Target API level >=14
硬件加速默认开启。在 Android 里,硬件加速专指把View中绘制的计算工作交给 GPU来处理。启用硬件加速需要更多资源,因此应用会占用更多内存。简单来说,开启硬件加速主要在绘制和执行动画的过程中可以提升性能。
- Android 开发之硬件加速
- Hardware acceleration
- 硬件加速
WindowManagerService
WindowManagerService的作用:
- 窗口管理(WindowManager)
- 输入系统的中转站(InputManagerService)
- 窗口动画(WindowAnimator)
- Surface管理(SurfaceFlinger)
- 第八章 WindowManagerService.md