Android Framework原理,系列教学

  • 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布局文件

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

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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

作者2013年从java开发,转做Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

参与过不少面试,也当面试官 面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我整理了一份阿里P7级别的最系统的Android开发主流技术,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括阿里,以及字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术。如果你想深入系统学习Android开发,成为一名合格的高级工程师,可以收藏一下这些Android进阶技术选型

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;
自定义view,Android开发的基本功。

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;
未来的方向,高薪必会。

前沿技术;
组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,CodeChina上可见;

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

712336709356)]

前沿技术;
组件化,热升级,热修复,框架设计

[外链图片转存中…(img-MxEafB0v-1712336709357)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,CodeChina上可见;

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Framework是指Android系统中的一个核心部分,它提供了一套API和框架,用于帮助开发人员构建Android应用程序。Android Framework基于Java编程语言,为开发人员提供了许多常用的功能和服务,如图形用户界面(GUI)、数据存储、网络通信、多媒体处理等。 Android Framework原理主要包括以下几个方面: 1.应用组件:Android Framework提供了多种应用组件,如Activity、Service、BroadcastReceiver和Content Provider等。开发人员可以利用这些组件来构建应用程序的不同模块,实现界面显示、后台任务和数据存储等功能。 2.应用资源管理:Android Framework通过提供资源管理器来管理应用程序中的各种资源,如布局文件、图片、字符串和样式。开发人员可以通过资源管理器获取和管理这些资源,从而实现动态的UI显示和多语言支持等功能。 3.权限管理:Android Framework通过权限机制来保护应用程序的安全性。开发人员需要在应用程序的清单文件中声明所需的权限,并在运行时进行权限检查。这样可以防止恶意程序获取用户敏感信息或执行危险操作。 4.消息传递和线程管理:Android Framework使用消息队列和Handler机制来处理多线程和异步任务。开发人员可以通过Handler将任务放入消息队列中,并在需要的时候处理这些任务。这样可以避免在主线程中执行耗时操作,提升应用的响应速度和用户体验。 5.应用生命周期管理:Android Framework负责管理应用程序的生命周期,包括应用程序的启动、运行、后台和关闭等阶段。开发人员可以借助生命周期回调方法来管理应用程序的状态和资源,以及处理用户操作和系统事件。 综上所述,Android FrameworkAndroid系统的核心部分,通过提供API和框架,帮助开发人员构建Android应用程序。它包括应用组件、资源管理、权限管理、消息传递和线程管理,以及应用生命周期管理等功能,使得开发人员能够更加方便地开发出功能丰富、稳定可靠的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值