-
Android中采用的是Linux中的管道通信
-
关于管道,简单来说,管道就是一个文件
-
在管道的两端,分别是两个打开文件文件描述符,这两个打开文件描述符都是对应同一个文件,其中一个是用来读的,别一个是用来写的
-
消息队列创建时,会调用JNI函数,初始化NativeMessageQueue对象。NativeMessageQueue则会初始化Looper对象
-
Looper的作用就是,当Java层的消息队列中没有消息时,就使Android应用程序主线程进入等待状态,而当Java层的消息队列中来了新的消息后,就唤醒Android应用程序的主线程来处理这个消息
整个消息机制流程
Handler通过sendMessage()发送Message到MessageQueue队列
Looper通过loop(),不断提取出达到触发条件的Message,并将Message交给target来处理
经过dispatchMessage()后,交回给Handler的handleMessage()来进行相应地处理
将Message加入MessageQueue时,处往管道写入字符,可以会唤醒loop线程;如果MessageQueue中没有Message,并处于Idle状态,则会执行IdelHandler接口中的方法,往往用于做一些清理性地工作
ContentProvider原理
Android绘制原理
Activity的window组成,Activity内部有个Window成员,它的实例为PhoneWindow,PhoneWindow有个内部类是DecorView,这个DecorView就是存放布局文件的,里面有TitleActionBar和我们setContentView传入进去的layout布局文件
-
Window类时一个抽象类,提供绘制窗口的API
-
PhoneWindow是继承Window的一个具体的类,该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View
-
DecorView继承FrameLayout,里面id=content的就是我们传入的布局视图
-
ContentView必须是一个ViewGroup
-
ViewGroup 开始递归执行以下逻辑进行绘制
- measure, 递归测量view的大小。有3种测量模式
-
MeasureSpec.EXACTLY表示确定大小
-
MeasureSpec.AT_MOST表示最大大小
-
MeasureSpec.UNSPECIFIED不确定
-
layout,递归布局view的位置
-
draw,递归绘制view
- ViewRootImpl中的代码会创建一个Canvas对象,然后调用View的draw()方法来执行具体的绘制
AsyncTask源码分析
Binder机制及底层实现
进程空间分配
-
进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
-
进程间,内核空间的数据可共享,所以内核空间 = 可共享空间
-
进程内用户与内核进行交互称为系统调用
Binder跨进程通信(IPC)的原理
-
先通过进程间的内核空间进行数据交互
-
再通过进程内的用户空间&内核空间进行数据交互,从而实现进程间的用户空间的数据交互
-
而Binder,就是充当连接两个进程(内核空间)的通道
使用步骤:
注册服务
-
Server进程向Binder驱动发起服务注册请求
-
Binder驱动将注册请求转发给ServiceManager进程
-
ServiceManager进程添加该服务
-
此时ServiceManager进程拥有该服务信息
获取服务
-
Client向Binder驱动发起获取服务的请求,传递要获取的服务名称(service name)
-
Binder驱动将该请求转发给ServiceManager进程
-
ServiceManager查找到Client需要的Server对应的服务信息
-
通过Binder驱动将上述服务信息返回给Client进程
-
此时client进程与server进程已经建立了连接
使用服务
- Client进程将参数数据发到Server进程
-
client 进程将需要的传送的数据放到client进程的共享内存;(当前线程被挂起)
-
Binder驱动从client的共享内存中读取数据,并根据ServiceManager进程里面的Server信息找到对应的Server进程
-
Binder驱动将数据copy到Server进程的共享内存里,并通知Server进程解包
- Server进程根据Client进程要求,调用目标方法
-
接到Binder驱动通知后,Server进程从线程池中取出线程,进行数据解包和调用目标方法
-
将最终方法结果写到自己的共享内存
- Server进程将目标方法的结果,返回给Client进程
-
Binder驱动程序将Server进程的共享内存里面的数据(方法执行结果) copy 到client进程的共享内存
-
通知client进程获得返回结果(此时client进程之前被挂起的线程被重新唤醒)
Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互
Client进程、Server进程 & Service Manager进程属于进程空间的用户空间,不可进行进程间交互
Binder驱动 属于 进程空间的 内核空间,可进行进程间 & 进程内交互
Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)
ActivityThread工作原理
Window 、WMS的工作原理
ThreadLocal原理,实现及如何保证Local属性
每个Thread维护一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身,value是真正需要存储的Object
Android线程有没有上限
android本身就是linux系统 所以查看命令和linux一样
Android内存限制
dalvik.vm.heapstartsize 表示 初始内存大小是8m
dalvik.vm.heapgrowthlimit 表示标准内存大小是96m 一般应用都是这么大
dalvik.vm.heapsize 表示 在manifest配置文件中application标签下配置 android:largeHeap="true"时的内存大小
Android apk大小限制
apk安装包大小理论上没有限制。但是各个应用商店为了有大小限制google play 要求小于50M , 扩展包可以扩展到2g
压测: 800M的apk是没问题的只是安装的时间比较长。1.6G的apk包则把手机弄死机
线程池有没有上限
ThreadPoolExecutor构造函数的maximumPoolSize决定
AndroidToast原理分析
Art和Dalvik对比
ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。
BlockCanaryEx原理
即整个应用的主线程,只有这一个looper,不管有多少handler,最后都会回到这里
public static void loop() {
…
for (;😉 {
…
// This must be in a local variable, in case a UI event sets the logger
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
…
}
}
设置Printer对象,判断是否超过预期时间,notifyLog
Android GC探究
虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)
对于Activity 的 onCreate 等生命周期的函数为什么不会因为 Looper.loop()里的死循环卡死而永无机会执行
View 的绘制到底是怎样完成的,它又为什么不会因为 Looper.loop()里的死循环卡死而永无机会刷新
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/c8f4cd3309fad2d7e685f207866eb059.jpeg)
最后
由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/c8f4cd3309fad2d7e685f207866eb059.jpeg)
最后
由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!