Android Framework原理,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布局文件

  1. Window类时一个抽象类,提供绘制窗口的API

  2. PhoneWindow是继承Window的一个具体的类,该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View

  3. DecorView继承FrameLayout,里面id=content的就是我们传入的布局视图

  4. ContentView必须是一个ViewGroup

  5. ViewGroup 开始递归执行以下逻辑进行绘制

  • measure, 递归测量view的大小。有3种测量模式
  • MeasureSpec.EXACTLY表示确定大小

  • MeasureSpec.AT_MOST表示最大大小

  • MeasureSpec.UNSPECIFIED不确定

  • layout,递归布局view的位置

  • draw,递归绘制view

  • ViewRootImpl中的代码会创建一个Canvas对象,然后调用View的draw()方法来执行具体的绘制

AsyncTask源码分析


Binder机制及底层实现


进程空间分配

  1. 进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间

  2. 进程间,内核空间的数据可共享,所以内核空间 = 可共享空间

  3. 进程内用户与内核进行交互称为系统调用

Binder跨进程通信(IPC)的原理

  1. 先通过进程间的内核空间进行数据交互

  2. 再通过进程内的用户空间&内核空间进行数据交互,从而实现进程间的用户空间的数据交互

  3. 而Binder,就是充当连接两个进程(内核空间)的通道

使用步骤:

注册服务

  • Server进程向Binder驱动发起服务注册请求

  • Binder驱动将注册请求转发给ServiceManager进程

  • ServiceManager进程添加该服务

  • 此时ServiceManager进程拥有该服务信息

获取服务

  • Client向Binder驱动发起获取服务的请求,传递要获取的服务名称(service name)

  • Binder驱动将该请求转发给ServiceManager进程

  • ServiceManager查找到Client需要的Server对应的服务信息

  • 通过Binder驱动将上述服务信息返回给Client进程

  • 此时client进程与server进程已经建立了连接

使用服务

  • Client进程将参数数据发到Server进程
  1. client 进程将需要的传送的数据放到client进程的共享内存;(当前线程被挂起)

  2. Binder驱动从client的共享内存中读取数据,并根据ServiceManager进程里面的Server信息找到对应的Server进程

  3. Binder驱动将数据copy到Server进程的共享内存里,并通知Server进程解包

  • Server进程根据Client进程要求,调用目标方法
  1. 接到Binder驱动通知后,Server进程从线程池中取出线程,进行数据解包和调用目标方法

  2. 将最终方法结果写到自己的共享内存

  • Server进程将目标方法的结果,返回给Client进程
  1. Binder驱动程序将Server进程的共享内存里面的数据(方法执行结果) copy 到client进程的共享内存

  2. 通知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,最后都会回到这里

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一键领取:【Android超硬核面试资料】

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

表示面试问到的频率,代表重要推荐指数

[外链图片转存中…(img-Fdkncngs-1710496646025)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-0Nuz7LoI-1710496646026)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-yeUzHceu-1710496646026)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以点击这里自行获取。

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值