
Android源码分析
文章平均质量分 92
龙腾腾
凡是过往,皆为序章。
展开
-
Android .dex、.odex、Dalvik、ART、AOT、OAT
文章来源:https://www.jianshu.com/p/e52b7e460748https://zhuanlan.zhihu.com/p/53723652目的理清 .dex、.odex、ART、AOT、OAT 等近似名称的概念和意义。APK 生成最终 apk 内的代码文件为 .dex 文件。APK 安装运行基础概念**AOT:**编译方式,运行前编译。AOT是指"Ahead Of Time",与"Just In Time"不同,从字面来看是说提前编译。JIT是运行时编译,是动态编译,原创 2022-01-19 14:23:20 · 1854 阅读 · 0 评论 -
Activity的启动流程二--基于API29分析
文章来源:https://www.jianshu.com/p/160a53701ab6我个人把Activity的启动流程依次分为三个阶段:App进程中 ——(通过Binder)—→ 系统进程中 ——(通过Binder)—→ 回到App进程中1. App进程中App进程第一轮做的事儿不多,主要就是把传进来的Intent扔给AMS。1.1 Activity在Activity中调用了startActivity方法后,不管调用的是哪个重载,最后都会进入到startActivityForResult(In转载 2021-12-04 20:41:21 · 312 阅读 · 0 评论 -
Android VSYNC (Choreographer)与UI刷新原理分析
原文链接:https://www.jianshu.com/p/10db590ed9a6从UI控件内容更改到被重新绘制到屏幕上,这中间到底经历了什么?另外,连续两次setTextView到底会触发几次UI重绘呢?为什么Android APP的帧率最高是60FPS呢,这就是本文要讨论的内容。以电影为例,动画至少要达到24FPS,才能保证画面的流畅性,低于这个值,肉眼会感觉到卡顿。在手机上,这个值被调整到60FPS,增加丝滑度,这也是为什么有个(1000/60)16ms的指标,一般而言目前的Android系统转载 2020-09-19 22:11:44 · 538 阅读 · 0 评论 -
Android主流三方库的源码分析
https://www.cnblogs.com/andy-songwei/p/10955062.htmlhttps://www.jianshu.com/p/c5df0ac39e01https://www.jianshu.com/p/3366e4bec7cehttps://blog.csdn.net/qq_26787115/article/details/50466655原创 2020-08-23 15:11:32 · 315 阅读 · 0 评论 -
Android自定义View5--getWidth()和getMeasuredWidth()区别, view.post(Runnable)引发内存泄漏的原因和解决
getMeasuredHeight()返回的是原始测量高度,与屏幕无关getHeight()返回的是在屏幕上显示的高度实际上在当屏幕可以包裹内容的时候,他们的值是相等的,只有当view超出屏幕后,才能看出他们的区别。当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的高度。在自定义控件时,调用子View的getHeight()得到的结果为0,调用getMeasuredHeight()为子View的真实大小。view.post(new Runnable原创 2020-08-20 18:35:35 · 733 阅读 · 0 评论 -
Android--HashMap原理
threshold 阈值,没有阀值的说法(各行各业都没有阀值,只有阈值)。当 HashMap 存储的数据量超过 threshold 时,就会触发扩容。关于扩容:面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“关于Hashtable和ConcurrentHashMap:面试中的HashMap、ConcurrentHashMap和Hashtable,你知道多少?关于红黑树:什么是红黑树?一、HashMap数据结构Hash表融合了二者的优点,如下:二、源码分析p原创 2020-08-14 15:41:51 · 1627 阅读 · 0 评论 -
Android自定义View4--ViewPager的wrap_content无效的原因和解决方案
一、ViewPager的wrap_content无效的原因看ViewPager的源码: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // For simple implementation, our internal size is always 0. // We depend on the container to specify the原创 2020-08-12 19:41:45 · 736 阅读 · 1 评论 -
插件化讲解到实战3--Hook的源码分析和启动插件的Activity
插件化讲解到实战1–类加载的解析和双亲委派机制插件化讲解到实战2–调用插件中的类Hook中文意思就是钩子,作用就是改变代码的正常执行流程。在某段SDK源码逻辑执行的过程中,通过代码手段拦截执行该逻辑,加入自己的代码逻辑。通过动态代理和反射实现Hook。查找Hook点的原则:1、尽量静态变量或者单例对象2、尽量Hook public 的对象和方法一方面这两种情况修改的少,另一方面反射的如果不是静态的方法,那么就要拿到方法对应的类的对象。一、代码实现启动插件的Activity启动插件的Activ原创 2020-08-07 15:28:17 · 337 阅读 · 2 评论 -
插件化讲解到实战2--调用插件中的类
插件化讲解到实战1–类加载的解析和双亲委派机制思路通过反射直接调用插件的类肯定是调用不到的。通过上一篇知道,每一个dex文件对应一个Element,因为所有的dex文件都在dexElement数组中,那么合并宿主和插件的Elements就可以调用插件的dex,其实就是将插件的dex放到宿主的dexElement数组中,需要通过反射实现。反射思路:1、获取宿主的dexElements2、获取插件的dexElements3、合并宿主的dexElements和插件的dexElements4、将合并的原创 2020-08-06 18:56:21 · 335 阅读 · 0 评论 -
Android自定义View2--触摸事件传递机制
https://www.cnblogs.com/onlywujun/p/3519037.html转载 2020-08-06 10:40:34 · 337 阅读 · 0 评论 -
android--Handler 二十问
四个主要的类handle、message、looper、messagequeue和threadhttps://www.jianshu.com/p/43e21be8d849Looper的工作流程:ActivityThread.main();//初始化入口 1. Looper.prepareMainLooper(); //初始化 Looper.prepare(false); //设置不可关闭 Looper.sThreadLocal.set(new L原创 2020-08-04 14:06:41 · 1130 阅读 · 1 评论 -
插件化讲解到实战1--类加载的解析和双亲委派机制
一、类的生命周期及类加载的解析类加载阶段,虚拟机主要完成三件事:1、通过一个类的全限定名来获取定义此类的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。3、在Java堆中生成一个代表这个类的Class对象,作为方法区域数据的访问入口。拓:上面第三步时候的类的class对象,反射时候会用到,反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法和属性。通过如下代码打印,private void printClassLoader原创 2020-08-02 22:53:52 · 313 阅读 · 0 评论 -
DexClassLoader和PathClassLoader网上好多错的说法,我们聊一下
一、错误说法看到网上说如下错误说法:一般说起 PathClassLoader 和 DexClassLoader ,大家都会说,前者只能加载内存中已经安装的apk中的dex,而后者可以加载sd卡中的apk/jar。大家心中的回答一定是 PathClassLoader 是用来加载已经安装的 apk 的,DexClassLoader 是用来加载存储空间的 dex / apk 文件的。为什么这样说呢,因为之前我也一直这样理解的,而且网上大部分文章中也都是这样讲解的。以前我看书,看文章也会先给自己一种暗示,认原创 2020-08-02 16:01:42 · 1271 阅读 · 1 评论