![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 86
__Yvan
我就是我独一无二
展开
-
【Android Framework系列】第17章 Android Q沙箱模式(Scoped Storage)
App TargetSDK > 28 即 Android10(Q)及以上项目,Google限制了存储沙箱模式,在Android10(Q)以上的设备建议使用私有目录data/data,无法再直接访问外部SD卡存储目录,如需要使用外部SD卡存储目录则需要通过SAF、MediaStore接口访问,并且只能访问特定的外部SD卡存储目录,如Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones原创 2023-09-23 16:29:01 · 1735 阅读 · 0 评论 -
【Android Framework系列】第16章 存储访问框架 (SAF)
本章节大概了解SAF框架,我们下一章将对Android Q的沙箱模式(Scoped Storage)进行介绍。原创 2023-09-23 11:06:42 · 2878 阅读 · 0 评论 -
【Android Framework系列】第15章 Fragment+ViewPager与Viewpager2相关原理
ViewPager只能横向滚动,对应不同的Adapter效果不一样。范围外fragments会保存在内存中(detach),但是fragment对应的View会被销毁,fragments对应的SavedState会保存,内存较大但页面切换更友好,适用于Fragment数量少的情况使用,范围外fragments不会保存在内存中(remove),View也会被销毁。只保存范围内fragments对应的SavedState。这个SavedState在Fragment的生命周期回调中供外部传参数。原创 2023-09-21 11:02:13 · 924 阅读 · 0 评论 -
【Android Framework系列】第14章 Fragment核心原理(AndroidX版本)
Fragment是一个历史悠久的组件,从API 11引入至今,已经成为Android开发中最常用的组件之一。Fragment表示应用界面中可重复使用的一部分。Fragment定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。Fragment不能独立存在,而是必须由Activity或另一个Fragment托管。Fragment的视图层次结构会成为宿主的视图层次结构的一部分,或附加到宿主的视图层次结构。本章节主要探索Fragment的生命周期状态及事务管理。原创 2023-09-04 17:35:55 · 1106 阅读 · 0 评论 -
【Android Framework系列】第13章 SVG矢量图形自定义组件(绘制中国地图)
本章节我们来了解下什么是矢量图形,怎么通过实现图形的绘制,通过实现不规则的自定义控件,项目实现一个中国地图,实现每个省都能够点击,项目地址在文末请自取。与其他图像格式相比,使用的优势在于:一般是由 UI设计师来做,我们也需要大概了解一下:编辑SVG地址在线编辑SVGSVG语法教程地图数据矩形2.5 Path支持的指令:3 项目实战上面我们大概了解了是什么,有什么优势。接下来我们用实现一个中国地图的展示及点击选中省份的小项目来练练手。项目结构如上图所示:直接上代码R.layout.acti原创 2023-08-31 21:05:09 · 1329 阅读 · 2 评论 -
【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析
RecyclerView是一款非常强大的widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的组成结构乍一看有些复杂,但是深入理解以后您会发现它其实非常简单明了。原创 2023-08-27 18:11:31 · 1272 阅读 · 2 评论 -
【Android Framework系列】第11章 LayoutInflater源码分析
的作用是把XML转化成对应的View对象,需要用或者获取加载时先判断是否是merge标签merge标签走递归方法rinflate,否则走作用是根据xml标签的名字去加载对应的View,使用的是反射的方法是设计出来灵活构造View的接口,可以用来实现换肤或者替换View的功能,同时也是用来做兼容和版本替换的接口。原创 2023-08-16 21:30:57 · 305 阅读 · 0 评论 -
【Android Framework系列】第10章 PMS之Hook实现广播的调用
到这里我们就完成了整个动态下发apk的调用及被调用,这里我们再稍微总结一下:主要通过HookPMS实现将动态下发的apk进行解析,将信息存储在PMS内,然后对PMS中装有信息的receivers集合拿到,程序(Client)发送广播给动态下发apk内定义好的广播(Server),该广播(Server)对程序(Client)作出回应,然后在程序(Client)接收回应(类似TCP的三次握手逻辑)。从而实现本章节对PMS进行Hook的目的。文章只做核心HookPMS代码思路的分析,这里是项目地址!原创 2023-08-14 21:25:28 · 526 阅读 · 2 评论 -
【Android Framework系列】第9章 AMS之Hook实现登录页跳转
本章节通过反射和动态代理对不同Android版本下AMS进行Hook,实现登录页面的跳转。原创 2023-08-01 16:39:22 · 1634 阅读 · 1 评论 -
【Android Framework系列】第8章 事件分发你真了解吗?
最后总结一下,事件分发就是事件从linux层通过驱动采集数据,底层使用epoll和inotify传递出来,FrameWork层通过InputReaderThread读取,通过InputDispatcherThread分发到WMS,WMS将事件传递到Activity,上层的Activity、ViewGroup、View之间事件的分发和消费。dev/inputlinux有提供相关的文件监控api,其中使用了inotify(能监控文件变化产生FD)和epoll(可以监控FD,以此配合完成文件的监控与监听)原创 2023-07-25 16:26:40 · 839 阅读 · 1 评论 -
【Android Framework系列】第7章 WMS原理
简称WMS,是系统的核心服务,主要分为四大部分,分别是窗口管理窗口动画输入系统中转站和Surface管理。1.窗口管理:WMS是窗口的管理者,负责窗口的启动,添加和删除,另外窗口的大小也是由WMS管理的,管理窗口的核心成员有DisplayContent,WindowToken和WindowState。窗口的显示顺序、尺寸、位置, 最终都会反馈SurfaceFlinger。原创 2023-07-17 17:31:37 · 1822 阅读 · 0 评论 -
【Android Framework系列】第6章 AMS原理之Launcher启动流程
我们在上一章节【Android Framework系列】5章 AMS启动流程中简单的分析了,这一章节我们来了解一下,通过是怎么完成下面我们通过一起来看看本文基于Android10(Q)的源码做分析由【Android Framework系列】5章 AMS启动流程我们可以知道:我们就从方法开始继续分析:/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java这里为对象,而方法直接调用的是对象的该原创 2023-07-13 22:20:59 · 1107 阅读 · 2 评论 -
【Android Framework系列】第5章 AMS启动流程
系统启动后Zygote进程第一个fork出SystemServer进程创建了系统的对象,运行环境。AMS在引导服务启动方法中,通过构造函数进行了一些对象创建和初始化(除activity外3大组件的管理和调度对象创建;内存电池权限性能cpu等的监控等相关对象创建),start()启动服务(移除进程组启动cpu线程注册权限电池等服务)。AMS创建后进行了一系列相关的初始化和设置。:将framework-res.apk的信息加入到SystemServer进程的LoadedApk中,并创建了。原创 2023-07-11 14:47:57 · 1100 阅读 · 0 评论 -
【Android Framework系列】第4章 PMS原理
PMS是包管理系统服务,用来管理所有的包信息,包括应用安装卸载更新以及解析AndroidManifest.xml。手机开机后,它会遍历设备上/data/app/和目录下的所有apk文件,通过解析所有安装应用的,将xml中的数据(应用信息权限四大组件等)信息都缓存到内存中,后续提供给AMS所需要的数据,它是具有保存应用数据的缓存。手机开机,内核进程启动init进程init进程启动SeriviceManager进程和启动Zygote进程Zygote进程启动进程启动AMSPMS。原创 2023-07-01 11:46:53 · 1781 阅读 · 1 评论 -
【Android Framework系列】第3章 Zygote进程相关
Zygote是Android中最重要的一个进程,Zygote进程和Init进程、SystemServer进程是Android最重要的三大进程。Zygote是Android系统创建新进程的核心进程,负责启动Dalvik虚拟机,加载一些必要的系统资源和系统类,启动system_server进程,随后进入等待处理app应用请求。原创 2023-06-28 15:58:16 · 1064 阅读 · 0 评论 -
【Android Framework系列】第2章 Binder机制大全
Binder是Android中主要的跨进程通信方式,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案。只需要拷贝一次,基于C/S架构,易用性高,系统为每个APP分配UID同时支持实名和匿名更安全原创 2023-06-23 23:54:48 · 3695 阅读 · 1 评论 -
【Android Framework系列】第1章 Handler消息传递机制
Android的Handler消息机制。原创 2023-06-05 01:08:22 · 2549 阅读 · 1 评论 -
【Android车载系列】第12章 车载渲染-SurfaceFlinger单独绘制到界面
车载的同学们知道是怎么实现的吗?等待Android设备开机再打开倒车影像App?车子挂到R档倒车如果等待这个流程实在太久,是否还有其它办法可以让车子挂R档直接展示倒车影像呢?大家思考一下。我们从Android渲染的基础上思考,Android图像渲染到屏幕上通过完成,如果我们不通过App的Surface来完成对SurfaceFlinger的调用,是否可以直接通过某些方式拿到SurfaceFlinger把图像绘制在屏幕上?原创 2023-05-06 22:10:09 · 1638 阅读 · 2 评论 -
【Android车载系列】第11章 系统服务-SystemServer自定义服务
system/sepolicy/prebuilts/api/32.0/private/ 与 system/sepolicy/private/目录下,分别修改以下三个文件#配置自定义服务selinux角色用户:角色:类型:安全级别#配置自定义服务类型的权限#允许所有app使用自定义服务一般只是用来调试自己的服务功能是否正常} } // 使用 YvanManager yvanManager =(YvanManager) getSystemService("yvan");原创 2023-05-03 15:04:05 · 899 阅读 · 0 评论 -
【Android车载系列】第9章 车载通信-Socket实现IPC通信机制(实现仿FDBus效果)
用于车载多台Android设备间的跨设备通信,实现方案为通过Socket实现IPC通讯,通过动态代理实现类方法的调用,从而实现设备间的通信。原创 2023-04-24 10:58:59 · 2896 阅读 · 1 评论 -
向服务端上传数据如何确保数据完整性、安全性
向服务端上传数据如何确保数据完整性、安全性,MD5/AES/RSA加密方式原创 2022-10-16 11:54:45 · 683 阅读 · 0 评论 -
【Java基础系列】第14章 Java图形编程
Java图形编程基础原创 2022-09-04 16:56:37 · 395 阅读 · 0 评论 -
OkHttp3源码思路分析
1.源码思路本文主要分析OkHttp3中的主干逻辑,不做详尽的解说。OkHttp3有以下几个核心类OkHttpClitent、Request、Response、RealCall、Interceptor、RealInterceptorChain。通过OkHttpClient.Builder类构建OkHttpClitent对象,OkHttpClitent对象中使用RealCall类和传入的Request对象进行同步或异步请求,请求发出前通过一系列拦截器Interceptor处理(重点),最...原创 2021-12-27 10:17:54 · 1592 阅读 · 0 评论 -
Retrofit2.3.0源码分析
此文章只对 Retrofit构建流程 和 网络请求流程 的主干思路分析。1.Retrofit创建Retrofit源码我们需要从Retrofit的使用开始,Retrofit明显使用了Builder模式进行初始化创建,根据Retrofit对象创建主要有六个步骤分析,分别为Builder()、baseUrl(String baseUrl)、client()、addConverterFactory()、addCallAdapterFactory()、build()。Retrofit mRetrofit原创 2021-12-08 11:59:01 · 1633 阅读 · 0 评论 -
Android启动模式SingleInstance
1.简介Android四大启动模式分别为Standard,SingleTop,SingleTask,SingleInstance,其中前面三种平时使用的比较多此处不多做解析,重点分析下SingleInstance这种启动模式。SingleInstance为栈内单实例模式,顾名思义就是使用该模式下的Activity创建时候,如果该对象没有被创建则会独立开辟栈来存储该Activity的实例,如果被创建了就直接使用,生命周期的回调跟SingleTask类似,主要不同的是SingleInstance栈内只有一个原创 2021-12-03 17:13:51 · 5072 阅读 · 0 评论 -
【Java基础系列】第12章 多线程
12.1 多线程的基本概念12.1.1线程与进程进程:执行中的程序线程:线程是轻量级的进程,不能单独运行,只能放在一个进程中才能执行12.1.2 java的线程模型1.使线程暂停①调用sleep( )方法②调用wait( )方法③等待输入/输出完成2.使线程进入就绪状态①线程调用notify( )方法②线程调用notifyAll( )方法 //通知全部线程就绪...原创 2021-07-27 11:49:03 · 185 阅读 · 0 评论 -
【Java基础系列】第11章 输入/输出(2)
11.2 Java的IO流11.2.1 IO流的分类IO流的三种分类方式:1.按流的方向分为:输入流和输出流2.按流的数据单位不同分为:字节流和字符流3.按流的功能不同分为:节点流和处理流Ps:节点流表示的是直接操作节点(例如文件,键盘)的流,例如FileInputStream.处理流(过滤流)表示的是对节点流进行了操作(加工)的流,例如InputStreamReaderIO流的四大抽象类字符流:Reader(读)...原创 2021-07-27 11:35:59 · 106 阅读 · 0 评论 -
【Java基础系列】第11章 输入/输出(1)
11.1 File类File类概念:File类用来进行文件的相关操作,它描述的是文件本身的属性。 File代表的是文件或目录。 File类创建的File对象是可以用来获取磁盘文件的相关信息。例如:权限、时间、 日期、目录路径或目录层次结构。 File类被封装在java.io包中。11.1.1 File 类的构造方法例:① File file1 = newFile( "F:\\112期\\code\\File类\\FileCut.java");② File file2 ...原创 2021-07-27 11:25:40 · 330 阅读 · 0 评论 -
【Java基础系列】第10章 异常
10.1 异常类型10.2 异常处理异常处理的2种处理方式:捕获异常、抛出异常格式:① 在可能发生异常的方法后加上throws异常类型比如:Public void yundong() throws Exception{ }② 在调用该方法时,再采用捕获异常方式try catch处理或继续throw抛出异常。10.3 抛出异常10.3.1 throwsthrows 是用来声明一个方法可能抛出的所有异常信息;...原创 2021-07-25 19:30:29 · 64 阅读 · 0 评论 -
【Java基础系列】第9章 泛型
9.1 深入泛型泛型类型具体化的时候必须是基本类型中的包装类,例如:Integer、Double。int不行9.1.1 泛型接口(1)泛型接口概念:就是在定义接口的时候,在接口名后面加上<泛型类型,泛型类型...>interfacegenericityInterface<K>{ publicKfunction();}(2)定义一个类实现该泛型接口:在实现泛型接口的时候,接口中的泛型也要传入具体的类型。如String,而在接口中用到泛型K的都需要在...原创 2021-07-25 19:28:57 · 324 阅读 · 0 评论 -
【Java基础系列】第8章 Java集合框架
8.1 集合框架的概念8.1.1集合框架概况(1)集合框架是java.util包中提供的一系列工具,它为程序处理对象组提供了标准的方式,诞生自1.2版本。1.2版本之前,处理对象的方法如下:数组 缺点:长度固定、数组中只能存放一种类型的数据优点:速度快Vector、stack、properties 缺点:缺乏统一的操作方式,不易扩展1.2版本之后,诞生了集合框架优点: ①性能提高②操作统一 Collection、List、Set③提高...原创 2021-07-25 19:11:18 · 177 阅读 · 0 评论 -
【Java基础系列】第7章 Java基础类库
7.1 运行Java程序参数Main方法中args[ ] 数组通过运行的时候传入指定的值例如:运行Test类,在后面加上字符串:java Test abc2 354那么字符串数组args[0] =abc2; args[1] =354;Ps:该处参数包含空格的话,需要用””括起来,否则JVM会把空格当成参数分隔符。7...原创 2021-07-25 18:51:18 · 152 阅读 · 0 评论 -
【Java基础系列】第六章 面向对象(下)
6.1 包装类6.1.1 基本类型对应的包装类 基本数据类型 对应的包装类 byte Byte short Short int Integer float Float double Double char Character原创 2021-07-18 15:59:08 · 305 阅读 · 0 评论 -
【Java基础系列】第5章 面向对象(上)
5.1 类和对象5.1.1 类和对象定义类:是对某种事物的抽象描述(泛指自然界某一类事物)实例(对象):是指真实存在的(通过new创建,具体某个事物)5.1.2 类的组成成员变量行为方法构造器 ----->初始化初始化块 ----->类初始化时,要做的事情内部类5.1.3 类的定义格式[修饰符] [类名] {0-N 成员变量0-N 行为方法0-N 构造器0-N 初始化块0-N 内部类}5.1.4 类修饰符①权限修饰符(2原创 2021-07-18 15:52:57 · 207 阅读 · 0 评论 -
【Java基础系列】第4章 数组
4.1普通数组4.1.1数组表达方式: 数据类型[ ]如:byte[]、short[]、int[]、long[]、float[]、double[]、char[]、String[]4.1.2创建一维数组格式1:(修饰符) 数据类型[] 数组名=new 数据类型[数组长度]; //修饰符可有可无格式2:(修饰符) 数据类型[] 数组名; //修饰符可有可无数组名=new 数据类型[数组长度];4.1.3给数组赋...原创 2021-07-18 15:41:09 · 199 阅读 · 0 评论 -
【Java基础系列】第3章 流程控制
3.1 分支结构3.1.1 if else 语句 if( 逻辑表达式1 ){ 代码1 }//逻辑表达式1成立执行代码1,不成立不执行; 直接跳到下面的代码 if( 逻辑表达式2 ){ 代码2 }else{ 代码3 }//逻辑表达式2成立执行代码2,不成立执行代码3 if( 逻辑表达式3 ){ 代码4 }else if( 逻辑表达式4){ 代码5}else{代码6 }...原创 2021-07-18 15:39:50 · 82 阅读 · 0 评论 -
【Java基础系列】第2章 数据类型和运算符(3)
2.7 运算符2.7.1 算术运算符(1) + - * / %(求余) ++(自加) --(自减) + 加 比如:3+5=8 //还可做为连接符- 减 比如:3-5=-2 * 乘 比如:3*5=15/ 除 比如:3/5=0% 除之后取余数 比如:3%5=3++ 自加 比如:a=3 a++后 a=4 -- 自减 比如:a=3 a--后 a=2如: 5/2=2 (5和2都是整数时为2,取整数部分,因为两int运算,结果为i...原创 2021-07-18 15:33:00 · 248 阅读 · 0 评论 -
【Java基础系列】第2章 数据类型和运算符(2)
2.3 基本类型(四类八种)2.3.1 整数类型① byte 字节型 1 byte=1字节=8bit [-27,27-1]② short 短整型 1 short=2字节=16bit [-215,215-1] ③int 整型(默认类型) 1 int= 4字节=32bit [-231,231-1] ④ long 长整型 1 long=8字节=64bit ...原创 2021-07-18 15:30:17 · 229 阅读 · 3 评论 -
【Java基础系列】第2章 数据类型和运算符(1)
2.1 注释2.1.1单行注释和多行注释 单行注释:在程序中注释一行代码。 用法:将双斜线(//)放在需要注释的内容之前。例如://需要注释的内容 多行注释:一次性地将程序中的多行代码注释掉。 用法:使用”/*”和“*/”将程序中需要注释的内容包含起来。例如: /* 需要注释的内容需要注释的内容 */2.1...原创 2021-07-18 15:18:05 · 78 阅读 · 0 评论 -
【Java基础系列】第1章 初识Java
1.1环境搭建1.1.1下载安装JDK 官方网站下载JDK (www.sun.com 或者 www.oracle.com) 选择Downloads---JavaSE-----选择接受------下载符合电脑操作相同的版本 安装JDK 下一步------------关闭公用JRE,选择安装目录--------------下一步1.1.2Java环境变量配置(1)我的电脑----属性----高级配置------环境变量①系统变量名:JAVA_HOME变量值:JDK安装目录原创 2021-07-18 15:02:25 · 91 阅读 · 0 评论