Android基础知识
文章平均质量分 86
一场雪ycx
you only live once.
展开
-
【Android】系统源码下载及编译
指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境,例如 aosp_arm64-eng 中的 aosp(Android Open Source Project) 代表 Android 开源项目,arm 表示系统是运行在 arm 架构的处理器上的,arm64 则是指 64 位 arm 架构处理器。:编译目标的格式是 BUILD-BUILDTYPE ,如 aosp_arm64-eng 这个目标,它的 BUILD 是 aosp_arm64,BUILDTYPE 是 eng。原创 2023-02-14 16:53:28 · 3802 阅读 · 0 评论 -
【Android】Window 机制
Window,即窗口,在 Android 中,它是一个抽象的东西,我们在日常开发中,直接接触到的东西是 View,而 View 是附着在 Window 之上的。所以我们也可以说 Window 是 View 的直接管理者。在了解 window 机制之前,我们需要对 Android 系统中的显示部分涉及到的东西有一个大致的了解。原创 2022-11-02 18:05:49 · 2067 阅读 · 0 评论 -
【Android】之屏幕适配
Android 系统能发展到今天,离不开其开源性,但是随着越来越多的设备接入 Android 系统,并对 Android 系统进行各种各样的定制,导致长期以来出现了各种碎片化严重的问题。例如,Android 屏幕尺寸多种多样,如 5 寸、5.9 寸、6 寸、6.1 寸 等等,当然,屏幕分辨率也是多种多样,这很容易导致同一元素在不同手机上显示的效果不同的问题,因此,Android 应用开发中的屏幕适配工作也越来越重要。本篇文章就介绍一下 Android 中屏幕适配相关的知识。原创 2022-09-24 19:23:01 · 5971 阅读 · 1 评论 -
【Android】编译系统之 make 和 Soong
make 是一个自动化构建工具,make 通过读取一种叫做Makefile的文件,将源代码自动构建成可执行程序和库文件。而 Makefile 文件中定义了目标程序的依赖关系和生成目标程序的相关规则。在早期, make 被包含在Unix系统中,随着GNU/Linux从Unix衍生出来并发扬光大,GNU/Linux保留并扩展了原始的make,加入了许多内置函数和自动变量等等,形成了GNU make。.........原创 2022-08-30 14:34:54 · 3287 阅读 · 0 评论 -
【Android】系统启动流程(zygote 进程启动流程)
先上图,我们先大致了解一下 Android 设备点击电源键开机到创建出进程的流程,以及流程中涉及到的一些基本名词,里面细化的子流程和。原创 2022-08-26 15:51:45 · 1858 阅读 · 0 评论 -
【Android】如何分析 ANR 日志
应用层导致的ANR(耗时操作)系统层导致的ANR方法一当系统出现 ANR 时,设备会自动将 ANR 日志输出到 目录下,如下所示:对于这些文件,我们直接双击在 Android Studio 上打开即可。方法二执行命令:可以导出设备所有 bug 日志,执行命令后,在指定文件夹内得到一个 zip 文件,将文件解压后打开,文件目录如下所示:其中,设备的 anr 日志会保存在该路径下:,如图:另外,该文件 内也有有 anr 日志的打印,我们可以通过以下关键词搜索该文件的一些异常信息,如:一个 ANR 日志,会包原创 2022-06-17 16:22:15 · 14255 阅读 · 4 评论 -
【Android】ANR 原理解析(Service)
ANR,Application Not responding,也就是应用程序未响应。Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间不能得到响应或者响应时间过长,都会造成ANR。所有与 ANR 相关的消息,都会经过系统进程 来调度,然后派发到应用进程完成对消息的实际处理, 一旦应用程序处理消息超时,系统就会收集一些系统状态,譬如 CPU/IO 使用情况、进程函数调用栈,并且报告用户有进程出现 ANR 了,同时会弹出 ANR 的对话框。ANR机制可以分为两部分:整个 ANR 机制原创 2022-06-15 17:07:18 · 2226 阅读 · 0 评论 -
【Android】之 App Startup 的使用及浅析
App Startup 是一个可以用于加速 App 启动速度的一个库。平时开发中,大部分的第三方都需要在 Application 中进行初始化,但是库会借助 ContentProvider 来初始化,以便使自己的库的侵入性更低,使用更加简便。但是,一旦项目引入了使用 ContentProvider 进行初始化的库越来越多,那么应用的启动速度将会越来越慢,因为每个 ContentProvider 的初始化都是比较耗时的操作。而 App Startup,它可以将所有用于初始化的 ContentProvider原创 2022-06-13 15:36:25 · 2839 阅读 · 0 评论 -
【Android】IPC 之 AIDL、Messenger 、Binder 浅析
- 使用 Binder 类实现绑定服务和**同进程**组件之间的通信 - 使用 Messenger 实现绑定服务和**不同进程**组件之间的通信 - 使用 AIDL 实现绑定服务和**不同进程**组件之间的通信原创 2022-06-08 19:58:49 · 632 阅读 · 0 评论 -
【Android】之 Flow 的使用和浅析
Google 推荐在 MVVM 架构中使用 Kotlin Flow,可见其发展前景是相当好的。Kotlin Flow 可以用于替换 Rxjava,也可以用于替换 LiveData,功能十分强大,它是 Kotlin 协程库提供的一部分功能,因此,如果我们项目中已经引用了 Kotlin 协程,则不需要额外引入 Flow 相关的依赖。在协程中,挂起函数最多仅能返回一个值,而数据流 Flow 可按顺序发出多个值,例如,我们可以通过数据流从数据库中实时接收更新。数据流使用挂起函数通过异步方式生成和使用值,也就是说,数原创 2022-06-01 13:57:27 · 10522 阅读 · 3 评论 -
【Android】之 JetPack Room 的使用
是一个基于 SQLite 的强大数据库框架,是谷歌官方提供的给开发者使用的,Room 也是 JetPack 的一部分。Room 强大在哪里呢?- 使用编译时注解对 sql 语句进行检查- 与 sql 语句的使用更加贴近,能够降低学习成本- 支持 `RxJava`、`LiveData` 、`协程`等联合使用- 官方推荐,不需要额外引入第三方库...原创 2022-05-27 17:43:55 · 541 阅读 · 0 评论 -
【Android】四大组件之 ContentProvider
前言ContentProvider 是 Android 的四大组件之一,有时候我们需要操作其他应用程序的一些数据,就会用到 ContentProvider。ContentProvider 用于管理 Android 以结构化方式存放的数据,以相对安全的方式封装数据并提供简易的处理机制和统一的访问接口供其他程序调用。Android 为常见的一些数据提供了默认的 ContentProvider(包括音频、视频、图片和通讯录等)。要实现与其他的 ContentProvider 通信首先要查找到对应的 Co原创 2022-05-19 18:39:50 · 2927 阅读 · 0 评论 -
【Android】Fragment 使用及浅析
Android Fragment 浅析Fragment 是在 Android 3.0 (API level 11) 开始引入的。每个 Fragment 拥有自己的布局以及生命周期。Fragment不能独立存在,必须依赖于Activity。一个Activity里可以有多个Fragment,并且一个Fragment可以被多个Activity重用。Fragment 的基本使用首先需要创建一个 Fragment,代码如下:private const val ARG_PARAM1 = "param1"pr原创 2022-04-14 18:06:26 · 4662 阅读 · 1 评论 -
【RxJava】使用
虽说Rxjava显然已经有些过时了,但是有些公司还在使用,为了能适应更多的业务代码,并提高自己的开发效率,所以这里仅做个Rxjava使用的总结,不涉及Rxjava内部的实现原理。RxJava的核心就是异步数据流和响应式编程。我们平时开发过程中的网络请求、数据库读写、文件读写、定时任务等各种耗时操作,都可以使用RxJava来完成。在平时的开发中,我们可以把所有的事件(数据)我们都可以看成是一条河流,它可以被观察,被过滤等操作,也可以将多条河流汇合成一条新河流。原创 2022-01-22 16:35:34 · 1120 阅读 · 1 评论 -
【view的绘制流程】绘制
五、绘制在第二节,绘制入口那里得知,View视图绘制流程中的【绘制】是由ViewRootImpl中的performDraw方法开始的。我们看看这个方法的源码:ViewRootImpl类:private void performDraw() { ............. try { //调用了draw方法 boolean canUseAsync = draw(fullRedrawNeeded); if (usingAsyncReport &am原创 2021-11-05 18:27:25 · 128 阅读 · 0 评论 -
【View的绘制流程】测量
三、测量在上一篇文章介绍view的绘制入口的时候,我们已经知道。测量的开始是在performTraversals中的performMeasure方法中执行的。在performTraversals方法中,可以看到,在执行performMeasure测量前,要通过getRootMeasureSpec方法获得顶层视图DecorView的MeasureSpec(测量规格)。MeasureSpec 是啥呢,MeasureSpec 封装了从父View 传递给到子View的布局需求(子view的MeasureSpe原创 2021-11-05 18:25:08 · 293 阅读 · 0 评论 -
【view的绘制流程】布局
四、布局上上篇文章中的第二节,绘制入口那里得知,View视图绘制流程中的【布局】是由ViewRootImpl中的performLayout方法开始的。我们看看这个方法的源码:ViewRootImpl类:private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight) { ..................原创 2021-11-05 18:26:48 · 237 阅读 · 0 评论 -
【屏幕刷新】Android 屏幕刷新机制
显示系统基础知识在一个典型的显示系统中,一般包括CPU、GPU、Display三个部分,CPU负责计算帧数据,把计算好的数据交给GPU,GPU会对图形数据进行渲染,渲染好后放到buffer(图像缓冲区)里存起来,Display(屏幕或显示器)负责把buffer里的数据呈现到屏幕上。双缓存屏幕刷新频率是固定的,比如每16.6ms从buffer取数据显示完一帧,理想情况下帧率和刷新频率保持一致,即每绘制完成一帧,显示器显示一帧。但是CPU/GPU写数据是不可控的,所以会出现buffer里有些数据原创 2022-02-07 09:42:29 · 1114 阅读 · 0 评论 -
RecyclerView与Glide的缓存机制
RecyclerView的item加载流程:1、界面需要填充布局,将需求交给**回收池**2、如果回收池没有对应的缓存布局,那么界面就会去找适配器,适配器执行**onCreateViewHolder**方法返回一个ViewHolder对象,然后拿到一个view,把它填充到界面上。(对于第一屏来说,每个item都要执行onCreatteViewHolder)3、第一屏完成填充后,上滑屏幕,屏幕底部就会出现空缺,这时就会触发加载机制4、仍然会从回收池中找,然后找到了对应的view,适配器就执行o原创 2020-08-20 17:31:45 · 2041 阅读 · 0 评论 -
【Android】多渠道打包与签名机制
我们在发布APP时,往往需要生成多个渠道包,以上传到不同的应用市场。原创 2022-01-23 22:41:38 · 3083 阅读 · 0 评论 -
组件化开发步骤
说起组件化,就不得不提一下模块化和插件化。它们的概念十分相似,咋一看还真分不清它们的区别是什么,很多人都会将它们搞混。严格意义来说,组件化、插件化其实也算是模块化的观念。原创 2020-08-07 09:30:11 · 1156 阅读 · 0 评论 -
【开机流程】Android系统的启动流程
Android系统的启动流程(开机流程)上图,先大致了解一下Android点击电源键开机到创建出system_server进程的流程,里面细化的子流程和system_server之后发生的事情我们后面再讲:Boot Rom:当电源键按下时,引导芯片就会启动,引导芯片代码会从预定义的地方开始执行(代码存在Rom),加载引导程序BootLoader到RAM。换句话说,就是启动的时候,会把引导程序代码由ROM中移动到RAM中,再去执行引导程序BootLoader。ROM可以简单理解为硬盘,断电后内部的数原创 2021-11-15 10:30:54 · 2686 阅读 · 0 评论 -
【Android】system_server 创建和启动流程
SystemServer进程的创建和启动流程在将SystemServer的启动流程之前,先回顾一下上一篇章的内容:上篇文章中,我们介绍了从init进程到zygote进程再到SystemServer进程开始创建的流程,大致是这样的:1、执行app_main.cpp文件的main方法(init进程中)2、main方法中初始化AndroidRuntime3、执行runtime.start()启动Android运行时环境,其中,start()方法内部通过startVM方法创建了虚拟机,通过startReg原创 2021-11-21 20:09:29 · 4376 阅读 · 1 评论 -
【Android】四大组件之 Broadcast
Android四大组件之Broadcast动态广播1、创建一个广播接收者2、创建InetntFilter,并设置action3、注册广播接收者。registerReceiver(receiver. intentFilter)静态广播通过静态注册广播,我们不需要启动这个应用,也能接受到广播。因为这种方式注册广播会一直都处于监听状态,所以它不会将注册释放,因此,使用静态注册广播的方式相对于动态注册比较耗费资源。例如,我们在应用中静态注册广播接收器,并监听开机广播,事实上,我们并不需要打开应用,也能原创 2021-11-14 17:41:19 · 1496 阅读 · 0 评论 -
【Android】APK的打包流程
APK打包流程apk其实就是一个压缩包,里面有lib,META-INF,classes.dex,res,resources.arsc等文件,我们对一个apk文件进行解压,可以发现里面其实有许多文件:每个文件对应的描述如下:res文件夹:包含了工程中res目录下除values以外的所有内容,一般包括各种layout文件,drawable。其中,layout文件内容是以二进制xml的方式进行保存的,而所有的drawable图像资源都是未经压缩过的原始文件。classes.dex文件:Android系原创 2021-10-13 17:20:38 · 1894 阅读 · 0 评论 -
【Binder】Android 跨进程通信原理解析
在Android开发的过程中,用到跨进程通信的地方非常非常多,我们所使用的Activity、Service等组件都需要和AMS进行跨进程通信,而这种跨进程的通信都是由Binder完成的。甚至一个看似简单的startActivity操作,就有可能发生 **6** 次的跨进程通信。...原创 2021-12-31 10:31:32 · 3011 阅读 · 0 评论 -
一文搞懂Activity的生命周期
什么是事件的分发所谓点击事件的事件分发,其实就是对MotionEvent(点击事件)的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。当一个MotionEvent产生后,事件最先传递给当前Activity,由Activity的dispatchTouchEvent来进行事件的分原创 2020-08-21 14:26:57 · 155 阅读 · 0 评论 -
【Android】四大组件之 Service
Service(服务)是一种可以在后台执行长时间运行操作而不提供界面的应用组件,服务可以由其他应用组件启动。在当前应用启动一个服务后,即使用户切换到其他应用,服务仍可以在后台继续运行。此外,其他组件可以通过绑定(bindService)与 Service 建立绑定关系,并与之进行交互,甚至是执行进程间通信(IPC)。服务可以在后台处理网络事务,播放音乐,执行文件 io 或与内容提供程序进行交互。后台服务:后台服务一般用于执行用户不会直接注意到的操作。例如,如果应用在后台使用某个服务来压缩其存储空间,则此服务原创 2021-11-12 17:05:59 · 2236 阅读 · 0 评论 -
【OkHttp】拦截器解析
OkHttp拦截器在之前的文章【OkHttp源码分析】中我已经对OkHttp的整体流程以及它的分发器分发流程进行详细分析,感兴趣的大佬可以观摩观摩,并给小弟提点意见~今天的重点是把OkHttp的拦截器部分的内容单独拎出来讲讲,因为它是OkHttp的核心部分!读过OkHttp源码的大佬应该都知道,无论是使用OkHttp进行同步请求还是异步请求,它们都会通过一个方法getResponseWithInterceptorChain()来获取Response。而这个方法就是通过责任链执行拦截器的入口,所以我们下原创 2021-12-30 11:45:01 · 1035 阅读 · 0 评论 -
【OkHttp】源码分析
okhttp基本使用://分发器:内部维护队列与线程池,完成请求的调配//拦截器:完成整个请求过程OkHttpClient client = new OkHttpClient();Request request = new Request.Builder() .url(MY_URL) .build();//call是一个接口。call接口的实现类在okhttp中是RealCall,call只能使用一次,只要call执行了enqueue或execute方法,就会抛原创 2021-10-24 23:00:51 · 440 阅读 · 0 评论 -
【LeakCanary】源码分析
LeakCanary原理分析LeakCanary的Github地址如下:https://square.github.io/leakcanary/前言LeakCanary是一个检测项目内存泄漏的第三方库。目前已经升级到V2.7版本了,对于2.0以上的版本,LeakCanary的使用可以说是相当的简单。LeakCanary对代码的侵入性极低,我们看它的使用就明白了。想要使用LeakCanary,我们只需要在build.gradle文件中添加入依赖即可:debugImplementation 'com.原创 2021-12-22 17:01:40 · 1593 阅读 · 0 评论 -
【Android】Handler 深度解析
Handler机制详解前言Handler可以说贯穿了整个Android系统,在Android中扮演着相当重要的角色。我们开发中接触到的四大组件如Activity、Service、BroadcastReceive、ContentProvider,他们的生命周期的管理都是由handler机制进行的,甚至毫不夸张的说,Android几乎所有的操作 ,都与Handler有关。因此Handler对于Android来说,非常非常重要。所以本篇文章将带大家深入研究Handler的机制。而我们在开发的过程中,用得比原创 2020-08-24 17:58:58 · 3021 阅读 · 0 评论 -
【View的绘制流程】绘制入口
View的绘制流程一、前言下面这个概念,相信大家都耳熟能详了:view 的绘制流程主要分为三个阶段:measure、layout、drawmeasure:根据父view传递的MeasureSpec计算子View大小layout:根据measure子view所得到的布局大小和布局参数,将子view放在合适的位置上。draw:把view对象绘制到屏幕上。但是,你知道DecorView是怎样添加到PhoneWindow的吗?DecorView又是从那里开始执行绘制的?本篇幅就带大家从源码的角度原创 2021-11-05 18:23:17 · 498 阅读 · 0 评论 -
【Android】LiveData 源码分析
LiveData源码分析前言LiveData其实已经不是一个新鲜的东西了,我是在使用MVVM框架的时候开始接触到LiveData的,LiveData用起来确实很方便。LiveData是一个具有感知组件生命周期的类,如Activity、Fragment、Service,只要和LiveData进行了绑定,LiveData就能感知到它们的生命周期。LiveData的基本使用我们就不讲了,因为它的使用非常简单,不懂的话网上一搜一大把。那么,LiveData有什么好处呢?1、监听与其绑定的界面的生命周期,原创 2021-12-15 16:02:16 · 2607 阅读 · 0 评论 -
【Android】事件分发和处理机制
Android 事件处理机制和分发机制我们首先要了解一下,Android中的事件用MotionEvent对象来表示,那么它的哪些类型呢?事件类型触发时机ACTION_DOWN手指初接触到屏幕时触发ACTION_MOVE手指在屏幕上滑动时触发,会多次触发ACTION_UP手指离开屏幕时触发ACTION_CANCEL事件被上层拦截时触发事件分发,其实只针对ViewGroup,举个例子,比如一个ViewGroup,它拿到了事件后,它首先会分发给它的子Vie原创 2021-11-28 23:06:52 · 1979 阅读 · 0 评论