自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

mike_jun的博客

学而不思则罔,思而不学则殆。

  • 博客(309)
  • 资源 (1)
  • 收藏
  • 关注

原创 三天刷完《剑指OFFER编程题》--Java版本实现(第二天)

正在更新中。。。。。。。。。剑指offer --Python版本的实现:剑指offer(1/3)第一大部分剑指offer(2/3)第二大部分剑指offer(3/3)第三大部分27.字符串的排列输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。递归法,问题..

2020-09-11 18:39:43 924

原创 三天刷完《剑指OFFER编程题》--Java版本实现(第三天)

正在更新中。。。。。。。。。剑指offer --Python版本的实现:剑指offer(1/3)第一大部分剑指offer(2/3)第二大部分剑指offer(3/3)第三大部分46.圆圈后最后剩下额数每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以..

2020-09-11 18:39:33 644

原创 三天刷完《剑指OFFER编程题》--Java版本实现(第一天)

剑指offer --Python版本的实现:剑指offer(1/3)第一大部分剑指offer(2/3)第二大部分剑指offer(3/3)第三大部分1.二维数组中的查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2,...

2020-06-28 23:57:23 1913

原创 【安卓12源码】WMS的作用及其启动流程

WMS 在 Android 系统的地位,它作为中间层,连接了上层的 View 框架和下层的 SurfaceFingler。AMS,WMS之间数据是对应的,通过token值可以在AMS,WMS,应用程序之后来唯一确定一组Window,token是关联着一组窗口的,可能有多个WindowState的token值是相同的.

2023-07-11 23:37:06 437

原创 【安卓源码】安卓app应用进程启动原理

fork的主要工作是寻找空闲的进程号pid,然后从父进程拷贝进程信息,例如数据段和代码段,fork()后子进程要执行的代码等。===== startProcessLocked 在fork 一个应用进程之后,保存这个 pid 值:handleProcessStartedLocked =====Zygote利用fork方法生成新进程,对于新进程A复用Zygote进程本身的资源,再加上新进程A相关的资源,构成新的应用进程A。// 执行 runSelectLoop 循环监听客户端的创建进程的消息。

2023-05-22 21:06:49 515 2

原创 【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

因为 应用进程均是 zygote fork 出来的子进程,会复制父进程的内存AppRuntime start("com.android.internal.os.RuntimeInit", args, zygote) 启动一个普通应用或者zygote,都会注册jni所以 gRegJNI 是个结构体数组。NELEM(gRegJNI) 是计算该数组的大小 size这里主要关注 register_android_os_Binder 函数。

2023-05-15 21:54:10 478

原创 【安卓源码】Binder机制4 -- getService 和进程通信

看下 getMediaplayerService 的实现defaultServiceManager() 为:new BpServiceManager(new BpBinder(0))通过 IPCThreadState 去实现,一个线程对应一个 IPCThreadState等待回复 waitForResponsetalkWithDriver 与binder 驱动交互与binder 驱动交互调用 binder_ioctl_write_read 方法。

2023-05-10 21:19:31 549 2

原创 【安卓源码】Binder机制3 -- Binder线程池

Binder本身是C/S架构,就可能存在多个Client会同时访问Server的情况。在这种情况下,如果Server只有一个线程处理响应,就会导致客户端的请求可能需要排队而导致响应过慢的现象发生。解决这个问题的方法就是引入多线程。【多个客户端不同线程去请求,服务端需要使用多线程机制,binder线程池,创建多个线程去回复多个客户端的请求】Binder机制的设计从最底层–驱动层,就考虑到了对于多线程的支持。

2023-04-26 21:16:44 900

原创 【安卓源码】Binder机制2 -- addService 流程

一次完整的 Binder IPC 通信过程通常是这样:首先 Binder 驱动在内核空间创建一个数据接收缓存区;接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

2023-04-25 19:52:06 482 1

原创 【安卓源码】Binder机制1-Servicemanager 进程的启动和defaultServiceManager

对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client进程向Server进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。

2023-04-23 20:33:40 653

原创 【安卓源码】SystemServer系统进程启动原理

1.system_server是在Zygote启动的时候。

2023-04-15 15:43:50 465

原创 C语言-实现顺序二叉树和平衡二叉树AVL

在实现二叉树之前先看下结构体的一些使用方法数组是保存一系列相同的数据。在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄访问其中的各个元素,用结构成员运算符点(.)。即访问成员的一般形式是:结构变量名 . 成员名如 a.name 表示学生 a 的姓名。1)结构体的成员逐个赋值2)整体赋值也可以在初始化的时候赋值3)整体拷贝如上每次使用结构体均需要写struct,可以使用typedef 简化书写。

2023-04-10 21:44:02 520

原创 【安卓源码】SurfaceFlinger 启动及其与应用通信

surfaceflinger 的makefile 文件init进程就可以解析 "surfaceflinger.rc" ,启动 SurfaceFlinger 服务进程,执行 main 方法,启动surfaceflinger 进程:基本操作如下:调用的是 SurfaceFlingerFactory 头文件创建了消息队列 mFactory.createMessageQueueDefaultFactory 头文件创建独占智能指针 MessageQueue代码路径为如下:方法解析。

2023-03-19 22:26:54 701 1

原创 【安卓源码】TextureView 的BufferQueue 生产者消费者机制

图像流的最常见消费者是 SurfaceFlinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。它的作用很简单:将生成图形数据缓冲区的一方(生产方)连接到接受数据以进行显示或进一步处理的一方(消耗方)。硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。创建Surface的过程会涉及到与SurfaceFlinger的互动,SurfaceFlinger是一个系统级的服务,负责创建/管理/合成Surface对应的Layer。

2023-03-13 18:39:02 576

原创 C++ 三种智能指针及其设计实现unique_ptr、 share_ptr 指针

0、差不多春节啦。。。。。好久没有写博客,写一写吧。。。。。。祝大家嗨皮,提前恭喜发财。

2023-01-17 20:27:08 889

原创 C语言str-xxx字符串库函数处理大全【超详细】

C语言str系列库函数在面试中经常容易被面试官喊在纸上写某一个函数的实现,库函数的实现包含在头文件中,有如下方法。

2022-12-17 23:09:54 345

原创 安卓源码:广播机制

在Android系统中,广播(BroadCast)是组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用.BroadcastReceiver也有自己独立的生命周期,但是它又和Activity、Service不同。在发送广播时,可以通过设置属性来将广播定义为前台广播,如果未定义,默认为后台广播。1.广播接受者的生命周期是非常短暂的,在接受到广播的时候创建,onReceive()方法结束后销毁。............

2022-07-21 19:07:06 7846

原创 【FFmpeg学习】FFmpeg常见的结构体

音视频播放的原理主要分为:解协议->解封装->解码->音视频同步->播放。那 FFmpeg 的解码流程结构体也可以由以上流程进行分类:涉及的主要的结构体和函数 在解码的情况下,buffer用于存储ffmpeg读入的数据。例如打开一个视频文件的时候,先把数据从硬盘读入buffer,然后在送给解码器用于解码。其中opaque指向了URLContext。在avformat_open_input()中进行初始化。AVIOContext中有以下几个变量比较重要:AVFormatContext是一个贯穿始终的数据结构

2022-06-10 15:11:13 889 1

原创 MediaPlayer 播放本地视频源码流程【2】-setSurface和prepareAsync

1.setSurface//设置画布进行展示mediaPlayer.setSurface(new Surface(textureView.getSurfaceTexture()));frameworks/base/media/java/android/media/MediaPlayer.java public void setSurface(Surface surface) { if (mScreenOnWhilePlaying && surface !.

2022-05-24 18:20:04 435

原创 【安卓R 源码】native层媒体模块通信AHandler机制源码

本章将分析native层媒体模块通信AHandler机制源码实现,类图关系如下:from:Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】_小白兔LHao的博客-CSDN博客frameworks/av/media/libstagefright/MediaClock.cppvoid MediaClock::processTimers_l() { int64_t nowMediaTimeUs; status_t sta.

2022-05-16 18:33:51 425

原创 MediaPlayer 播放本地视频源码流程【1】-setDataSource

MediaPlayer 播放本地视频源码流程1. MediaPlayer 结合 textureView 播放本地视频xml 文件<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sch

2022-05-10 18:20:38 1975

原创 【安卓R 源码】从 Telecom CallAudioModeStateMachine详解StateMachine状态机源码

状态机是将对象的状态与行为封装在一起;可以解决庞大的分支语句带来程序阅读性差和不便于进行扩展问题,使整个结构变得更加清晰明了,降低程序管理的复杂性提高灵活度。Android系统的StateMachine机制是一个State模式的应用,StateMachine是一个分层处理消息的状态机,并且是能够有分层排列状态。以 Telecom 的CallAudioModeStateMachine 作为分析:1. 状态机的构造函数/packages/services/Telecomm/src/com/and

2022-04-21 18:10:46 2621

原创 【FFmpeg学习】H264 视频码流分析

H264 原始码流和解码流程1. H264编码分层NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。 VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩我们可以看到视频帧序列每一帧图像是由slice构成.

2022-03-31 18:23:25 1930

原创 【FFmpeg学习】H264 视频编码格式详细总结

一、音视频的一些名词解释1. 码率指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高。一般以秒为单位,如:128 kbps,表示每秒通过网络传送的数据量为 128k bit.2. 帧率指视频每秒钟包含多少张画面,一般单位为fps。帧率越高,表示单位时间内图像帧的个数,普通的视频文件一般在25fps - 30fps之间,表示每秒钟25-30张图像,而一般涉及到游戏等帧率会比较高一些

2022-03-17 23:11:07 4369

原创 【FFmpeg学习】YUV采样方式与存储格式

​1. 音视频播放原理音视频播放的原理主要分为:解协议->解封装->解码->音视频同步->播放。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6XASE4OD-1646829498402)(<> “点击并拖拽以移动”)]​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CnXBENa-1646829498410)(<> “点击并拖拽以移动”)]​1.解协议:将流媒体协议的数据解析为相应

2022-03-09 20:40:39 3512

原创 【FFmpeg学习】Visual Studio 2019 使用 ffmpeg 详细方法

目录1. 下载FFmpeg编译好的Windows版本2.VS2019配置ffmpeg3. Windows控制台使用ffmpeg命令1. 下载FFmpeg编译好的Windows版本地址如下:Download FFmpeg点击如下:选择 shared2.VS2019配置ffmpeg比如:你下载上述的编译好的 ffmpeg 版本路径为:C:\ffmpeg\ffmpeg-4.4.1-full_build-shared1)右键项...

2022-03-06 23:20:13 4970 2

原创 【安卓R 源码】获取音频焦点和释放音频焦点

一. 获取焦点流程1. 电话焦点只有系统可以申请,如果是电话焦点,系统会把所有多媒体和游戏的音频流实例全部mute。同理电话焦点释放会解除mute操作2. 系统管理的焦点栈有大小限制限制为100.大于100,抢占焦点失败。3. 电话焦点状态下,其他app的所有抢占焦点的操作都会失败。4. 我们传的OnAudioFocusListener决定了ClientID,相同的ClientID焦点栈中不会重复存储,OnAudioFocusListener最好进行复用,除了特殊的业务场景。电话焦点...

2022-02-18 09:20:28 2598

原创 【安卓R 源码】Ripple 水波纹效果源码

安卓使用ripple实现点击时的涟漪效果 - 简书https://www.jb51.net/article/145309.htmAndroid:RippleDrawable 水波纹/涟漪效果 - 简书Android5.0 水波控件RippleDrawable简析_Jeepend的专栏-CSDN博客在Android5.0中新增了一种水波效果控件,叫RippleDrawable,当控件使用RippleDrawable作为背景(android:background)且在控件可以接受点击动作

2022-01-07 00:10:26 617 1

原创 【安卓R 源码】 View事件分发机制源码流程

1. 屏幕点击事件事件 简介 ACTION_DOWN 手指 初次接触到屏幕 时触发。 ACTION_MOVE 手指 在屏幕上滑动 时触发,会多次触发。 ACTION_UP 手指 离开屏幕 时触发。 ACTION_CANCEL 事件 被上层拦截 时触发。 安卓中输入事件主要分为KeyEvent(键盘)和MotionEvent(触摸屏)两种,其中 KeyEvent是指键盘输入事件,本文主要讲 MotionEvent。正常情况下,无论你手指在屏幕做多少操作

2022-01-06 23:42:48 1705

原创 【安卓 R 源码】从源码角度看Context

1. Context 是什么?Context,中文直译为“上下文”,它描述的是一个应用程序环境的信息,从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。SDK中对其说明如下:Interface to global information about an application environment. This is an abstract class whose implementation is provided

2021-11-22 16:25:35 2089

原创 【安卓 R 源码】Activity 启动流程及其生命周期源码分析

1. Activty 的生命周期activity的生命周期oncreate()->onstart()->onResume()->onPause()->onStop()->onDestory()onCreate():当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。onStart():onCreate()方法完成后,此时activity进入.

2021-11-18 18:27:37 3114

原创 【安卓R 源码】Hnadler 消息处理机制源码分析

1. Handler 的常用使用方法Handler是安卓提供的一种消息机制。通常用于接受子线程发送的数据,并用此数据配合主线程更新UI。比如,点击一个按钮去服务器请求数据。如果直接在主线程(UI线程)做请求操作,界面会出现假死现象, 如果长时间还没有完成的话,会收到Android系统的一个错误提示 "应用程序无响应(ANR)"。为什么呢?因为在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下三种情况下会弹出ANR对.

2021-11-12 18:07:06 312 1

原创 【安卓 R 源码】 bindService 源码分析

使用bindService主要分两种情形:1. Service的调用者client与Service在同一个App中;2. Service的调用者client是App1中的一个Activity,而Service是App2中的Service,client与service分属两个App,这种情形下主要用于实现跨进程的通信。bindService 的生命周期:Service被绑定bindService()的时候调用onCreate()和onBind()方法,onStartCommand()方法不被

2021-11-10 15:51:09 2396

转载 CompletableFuture 的使用方法

https://www.jianshu.com/p/6bac52527ca4CompletableFuture是java8引入的新类,该类实现了 Future 接口和 CompletionStage 接口,封装了future、forkjoin相关类来执行异步,所以你还是可以像以前一样通过阻塞(get)或者轮询的方式获得结果,尽管这种方式不推荐使用。 CompletionStage 接口代表异步计算中的 不同阶段,以及如何 组合 这些计算阶段。 CompletableStage 接口中有 50 多个.

2021-09-01 00:05:40 611

原创 2021年 Spring 精选大厂面试题-【附详细答案】

1.什么是spring?Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企业级开发提供给了丰富.

2021-05-17 23:46:53 999

原创 2021年 ZooKeeper 精选大厂面试题-【附详细答案】

ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。Zookeeper 保证了如下分布式一致性特性:(1)顺序一致性(2)原子性(3)单一视图(4)可靠性(5)实时性(

2021-05-06 23:29:59 2991 1

原创 2021年SpringCloud 精选大厂面试题-【附详细答案】

1. 微服务是什么?微服务与微服务架构微服务的优缺点2. 微服务之间是如何独立通讯的微服务通信机制系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。围绕业务能力组织服务、自动化部署、智能端点、对语言及数据的去集中化控制。将组件定义为可被独立替换和升级的软件单元。 以业务能力为出发点组织服务的策略。 倡导谁开发,谁运营的开发运维一体化方法。 RESTful HTTP协议是微服务架构中最常用的通讯机制...

2021-04-24 21:03:58 1913

原创 Java 多线程、多进程、并发编程面试总结 (2021年)

1.并行和并发有什么区别?并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的“同时进行”。串行:有n个任务,由一个线程按顺序执行。由于任务、方法都在一个线程执行所以不存在线程不安全情况,也就不存在临界区的问题。做一个形象的比喻:并发 = 两个队列和一台咖啡机。并行 = 两个队列和两台咖啡机。串行 = 一个队列和一台咖啡机。2.进程与线程的区别线..

2021-04-18 22:15:21 474

原创 2021 - 精心整理的 JVM 虚拟机 常见面试题-【附详细答案】

目录1. JVM运行时数据区是什么?2. 请说一下JVM的类加载流程3. JVM内存参数调优4.Java中的垃圾回收算法?5. 如何判断一个对象是否存活?6. 有哪几种垃圾回收器,有哪些优缺点?cms和g1的区别?7. 强引用、软应用、弱引用、虚引用的区别?8. 说一下java虚拟机的基本结构9.内存模型以及分区,需要详细到每个区放什么?10.说一下堆栈的区别?11. 什么是双亲委派模型?​12. 怎么判断对象是否可以被回收?13. 详细说一下垃圾收集..

2021-04-15 23:11:27 702

原创 2021年- 精心整理的 SpringBoot 常见面试题-【附详细答案】

目录1.Spring Boot 自动配置原理是什么?2.SpringBoot配置-profile3.SpringBoot中有哪些常用注解4.Spring Boot、Spring MVC 和 Spring 有什么区别?5.springboot的核心功能与使用优点?6.SpringBoot starter 作用在什么地方?7.SpringBoot的 Actuator 是做什么的?8.Spring Boot 的核心配置文件有哪几个?它们的区别是什么?9....

2021-04-13 23:33:29 4096

基于区块链的去中心化交易关键技术研究及应用

基于区块链的去中心化交易关键技术研究及应用

2021-05-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除