自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 音视频专题--opengl (3)

创建opengles 环境进行不同控件的渲染

2022-06-27 17:27:04 1166 1

原创 音视频专题--音视频同步

前言:本文主要描述音视频同步原理,及常见的音视频同步方案,并以代码示例,展示如何以音频的播放时长 为基准,将视频同步到音频上以实现视音频的同步播放。内容如下:1. 音视频同步简单介绍2. DTS和PTS简介 2.1 I/P/B帧 2.2 时间戳DTS、PTS3. 常用同步策略4. 音视频同步简单示例代码1音视频同步简单介绍 对于一个播放器,一般来说,其基本构成均可划分为以下几部分:数据接收(网络/本地)->解复用->音视频解码->音视频同步->音视频输出。

2022-04-04 15:53:10 296

原创 音视频专题--音频剪辑原理

1 前言:声音就是声波,人耳的听觉范围在20Hz-20kHz。 低频的声音沉闷厚重,高频的声音尖锐刺耳。 高于 20kHz的声音为超 声波。2 声音的采集与存储采样,指把时间域或空间域的连续量转化成离散量的过程 。对声音的采样常用麦克风等设备将声音信号转换成电信号,再用模/数转换器将电信号转换成一串用1和0 表示的二进制数字(数字信号)。我们每秒对声音采样上万次,获得上万个按照时间顺序排列的二进制数字。于是,我们就将连续变化不 断的声音转化成了计算机可储存并识别的二进制数字。2.1 采样

2022-03-27 15:59:20 908

原创 音视频专题--硬件解码

1 前言概念: MediaCodec是android提供用于对音视频进行编解码的类,他通过底层的编解码器来实现音视频的功能。解码芯片: 移动端soc的视频硬解码靠的是soc里面的DSP芯片,不是GPU也不是CPU硬解码:指的是系统将某个视频封装类型的文件分离成H.264视频数据量和aac音频数据量,然后再将H264视频数据流转交给DSP芯片进行处理,DSP将了好的一帧帧画面转交给GPU/CPU然后显示在屏幕上,这就是视频硬解码的过程。2 MediaCodec的使用:硬编码设置:配置Media

2022-03-27 12:11:42 4130

原创 Glide原理剖析,面试就这么答(二)

接上一篇Glide原理剖析,面试就这么答!(一)_BonnySoul的博客-CSDN博客_glide原理面试面试官:Glide圆角处理的流程是怎样的?Q:Glide的圆角需要自己去继承BitmapTransformation,实现transform,updateDiskCacheKey。transform方法需要返回一个处理过的bitmap。其实就是通过画笔去画一个圆角的bitmap.RequestOptions().transform(new MyBitmapTransform.

2021-11-18 20:34:15 2179

原创 android 相关的JVM,GC 知识的扩充2

1.java自动管理堆(heap)和(栈),程序员不能直接的设置堆和栈。2.操作系统的堆和栈: 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。 栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量值等。操作方式与数据结构中的栈相类似。 1. 2.为什么jvm的内存是分布在操作系统的堆中呢??因为操作系统的栈是操作系统管理的,它随时会被回收,所以如果jvm放在栈中,那java的一个null对象就很难确定会被谁

2021-11-07 14:58:23 1463

原创 APT技术中的SPI 机制,与javac对其的运用

SPI:Service Provider Interface是一种服务发现机制。他通过在classPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。//SPI机制//对象初始化ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);Iterator<SPIService> iterator = load.iterator();通过服务加载器

2021-11-07 13:27:19 292

原创 热修复原理

什么是热修复?定义:在我们应用上线后出现bug需要及时修复时,不用再发新的安装包,只需要发布补丁包,在客户无感知下修复掉bug。怎么进行热修复?服务端:补丁包管理用户端:执行热修复开发端:生成补丁包热修复需要解决的问题补丁包是什么?如何生成补丁包?开启混淆后呢?对比改动自动生成补丁包(gradle)?什么时候执行热修复?怎么执行热修复(使用补丁包)?Android版本兼容问题?热补丁方案有很多,其中比较出名..

2021-11-04 10:10:37 1160

原创 你所需要知道的IO知识

IO的基本常识-内核空间内核(linux)的IO栈我们可以吧Linux存储系统的io栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。通用块层,包括块设备io队列和io调度器。它会对文件系统的io请求进行排队,再通过重新排序和请求合并,然后才发送给下一级的设备层。设备层,包括存储设备和相应的驱动程序,负责最终物理设备的io操作。.

2021-11-03 09:24:36 316

原创 你需要掌握的插件化知识

1 什么是插件化?插件化技术最初源于免安装运行 apk 的想法,这个免安装的 apk 就可以理解为插件,而支持插件的 app 我们一般叫宿主2 插件化实现思路1 如何加载插件的类?2 如何加载插件的资源?3 如何调用插件类?Q 1, 回答问题之前我们要先了解什么是双亲委托机制类在加载的过程中首先回去 判断当前类是否已经被加载过,如果没有加载过并且自己的父加载器不为空,将会让自己的父加载器去处理,父加载同样会去按照这个逻辑处理。如果没有找到父加载器,才会自己去加载。这样处理

2021-11-02 19:08:54 1263

原创 android dex文件改造过程

apk文件的加密在我们的应用上架之前必不可少。通常我们是使用第三方加固软件,比如乐固,360加固宝类似的程序替我们完成。但是了解其原理对我们来说还是非常有用处的。这篇来介绍通过dex 文件加密实现apk 加密的方式。1 总体思路2 对核心代码工程进行加密核心工程中androidManifest 添加的application 是引用壳工程中的application.(1) 在打包过程中,对打包好的apk进行解压到指定路径。(2)对解压包中的dex文件进行加密,这里具体的加密算法..

2021-11-01 10:25:54 1130

原创 android 相关的JVM,GC 知识的扩充

1 JVM 是一种规范java文件-》编译器-》字节码-》机器码JAVA虚拟机与JAVA语言并没有直接联系,他只是特定的二进制文件格式.class文件有所关联, CLASS文件中包含JVM虚拟机指令集(bytecodes)和符号表,还有一些其他辅助信息。java 编译器指令流 是基于栈的指令集架构,而另一种指令集架构为基于寄存器的指令集架构2 堆的默认大小默认空间大小:初始大小:物理电脑内存大小 / 64最大内存大小:物理电脑内存大小 / 43 Mino...

2021-09-26 09:44:52 306

原创 性能优化--网络优化

网络优化的维度: 1 请求速度 2 请求的稳定性 3 减少流量 4 网络安全1 请求速度:A DNS解析优化:一次网络请求的操作是从 DNS 解析开始的,然后建立连接并发送数据到服务端,随后读取从服务端返回的数据,最后将连接释放,一次网络请求操作也就结束了。IP 直连方式,跳过 DNS 解析流程B 请求数据打包,通过zip()等将文字信息压缩打包上传C 数据格式优化,使用json,Protobuf 格式...

2021-08-27 10:36:04 301

原创 性能优化--启动优化(网易云音乐启动方案)

前言:关于app的启动方式,一关有三种,分别是冷启动,热启动,温启动。 冷启动:系统内部没有该应用的进程,会完成一整套的进程分配到后续UI渲染等的完整流程,耗时也是最久的。 热启动:系统后台还保留着该应用的进程。如果应用程序的所有activity存在内存中,则应用程序可以避免重复对象初始化、渲染、绘制操作.。 如:app按了home键再返回回应用 温启动:温启动包含了冷启动的一些操作,由于app进程依然在。a...

2021-08-22 21:39:04 878

原创 音视频专题-基础

1 基础扫盲:什么是H264?定义: 对摄像头采集的每一帧视频需要进行编码,由与视频中存在空间和时间的冗余, 需要用算法来去除这些冗余。H264是专门去除这些冗余的算法,我们把这种算法称为H264编码。H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称。应用: 像大多数看到的视频,如rmvb avi mp4 flv 大都是由h264进行编码当然也会有不同的 如 mpeg4 vp9 这样比较冷门的编码。无论是h264 mpeg4...

2021-08-20 12:09:31 151

原创 Kotlin 官方协程解读

前言:在网上看过很多类似关于协程的博客文章,很少看到真正说的清楚讲的实在的,于是自己翻看官方的文档,加上自己的理解,进行整理。协程基础第⼀个协程程序代码运⾏的结果:本质上,协程是轻量级的线程。 它们在某些 CoroutineScope 上下⽂中与 launch 协 程 构 建 器 ⼀起启动。 这⾥ 我们在 GlobalScope 中启动了⼀个新的协程,这意味着新协程的⽣命周期只受整个应⽤程序的⽣命周期限制。 可以将 GlobalScope.launch { …… } 替换为 thread..

2021-08-19 18:55:16 431

原创 Retrofit 原理梳理

Retrofit的核心原理解密2Retrofit的代理模式动态代理实现在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。这个代理对象是存在于内存中的。1、创建一个InvocationHandler对象 InvocationHandler stuHandler = new MyInvocationHandler<Person>(stu);...

2021-08-15 21:33:44 305

原创 你所需要掌握的okhttp知识

1.1 介绍:okhttp 是目前Android 使用最广泛的网络框架。从android4.4开始HttpUrlConnection的底层实现采用的是OkHttp。1.2 调用流程OkHttp请求过程中最少只需要接触OkHttpClient、Request、Call、Response,但是框架内部进行大量的逻辑处理。 所有的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。分发器:内部维护队列与线程池,完成请求调配;拦截器:五大默认拦截器完成整个请求过程。..

2021-08-14 19:30:40 196

原创 Gradle - 组件化之 build优化

1 组件分层:一般划分3-4层:1 app(壳 入口)2 业务组件层 :application/library3 功能组件层:application/library4 基础组件层:library业务组件层与功能组件层区别:业务层只能用在该项目内,而功能组件层是独立的功能模块可以运用于其他项目,比如推流模块,播放模块等。2 以文件夹的形式去管理module,方便查找代码。2 进行每层核心模块/组件的开发封装基础配置类commmon.gradle每个module依...

2021-06-29 17:50:13 272

原创 动态代理原理解析

之前有一篇设计模式的文章说过了代理模式。这一篇是对之前的补充跟深入。1 为什么需要学习动态代理1.动态代理能够增加程序灵活度,如加入 方法执行前后判断2 完美解决解耦问题,动态代理可以将调用层与实现层分离,如Retorfit网络请求3 动态代理不需要接口的实现类,如 适用于 IPC进程通信,将方法调用转成其他逻辑1.动态代理不需要接口的实现类,如 适用于 IPC进程通信,将方法调用转成其他逻辑4 动态代理可以解决 程序执行流程,如今天讲的事件转到activity执行动态代理含义1

2021-06-28 19:01:23 2066

原创 android LayoutInflater源码分析以及换肤框架实现原理(2)

上一节了解完布局加载的源码后,这篇就是带大家去实现换肤框架。主题换肤框架的实现思路?

2021-06-24 09:54:26 266

原创 android LayoutInflater源码分析以及换肤框架实现原理(1)

不记得是从哪个版本开始,我们最熟悉的新增Activity默认的继承类Activity 变成了AppCompatActivity。显示Activity的布局,我们实现起来很简单,只需要在onCreate()方法中setContentView(R.layout.activity_main)。今天就从源码层去看看到底系统为我们做了什么。点开AppCompatActivity内部@Overridepublic void setContentView(@LayoutRes int layoutRes.

2021-06-23 10:46:00 221

原创 Gradle - 本地maven 的使用

我们在项目中使用module,多级依赖打包aar的时候,会出现module中的代码无法打包到aar中,第一种方案我在前面的文章说介绍过使用的是fat-aar 第三方插件,文章链接https://blog.csdn.net/so1993/article/details/109119825?spm=1001.2014.3001.5501第二种方案就是今天所要介绍的使用本地maven的方式。module的依赖一般我们都使用的是直接依赖project如:implementation project..

2021-06-21 12:27:01 770

原创 Android 属性动画从入门到精通

属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可以通过属性动画实现。属性动画入门private void RotateAnimation() { ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f); anim.setDuration(1000); anim.start(); } private void Alpa...

2021-06-17 20:27:35 178 1

原创 Gradle - AGP的深入了解

在我们的项目中经常会遇到一种场景,同一套的代码,但是部署很多套环境,提供给不同的客户使用,这个时候每次打包的时候我们都需要去修改服务器地址,如果稍微不注意就会打错环境的apk,今天的学习就可以的很好的jie'ju...

2021-06-16 09:42:28 1065

原创 Gradle 依赖管理

前言 :依赖管理 在我们android项目中有非常重要的使用,如果对依赖管理没有清晰的认识,在遇到依赖冲突等问题的时候会碰到很多麻烦。

2021-06-15 11:21:31 1977 6

原创 Gradle -自定义task

1 了解tasktask是gardle中最小的任务单元,任务之间可以进行复杂的操作(如动态创建任务,多任务间依赖调用等等)。gradle的执行其实就是由各种任务组合执行,来对项目进行构建的。

2021-06-12 11:48:30 2653 3

原创 ServiceManager与SystemService 作用与关联

ServiceManager与SystemService 是Android 系统中与服务相关的两个进程我们可以看到systemserver 进程是由zygote 进行孵化出来的,而servicemanager 进行的父进程是init 进程systemserver 的实现 是在framework 层看下 源码:run()继续跟踪可以看到Android 系统中所有的服务都是在run()中进行启动。2 启动后的服务该怎么管理与使用呢?这里我们就要引申出servic.

2021-05-18 16:41:42 1411 1

原创 java对象原理与oop-klass 模型

认清java 对象原理,对象结构如下图java 对象结构声明是在 jvm 源码中的oop.hpp类中。oopDesc 是java 对象头。我们从metadata中看到了klass结构,与 metadata.metadata内部包含与锁相关的重要信息,看下图包含 :对象的hashcode 判断是否为同一对象的重要标识,gc分代年龄信息,是否为偏向锁,锁的类型那么 Klass * 是一个Klass 结构的指针(也被称为元数据指针),这个指针指向的是哪呢?我们知道 对象的...

2021-05-17 17:16:25 384

转载 Android 从AIDL来看Binder机制

下面就以图解的方式介绍下Binder机制,相信你看这篇文章,一定有所收获。什么是 Binder?Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一。Android中的四大组件Activity,Service,Broadcast,ContentProvider,不同的App等都运行在不同的进程中,它是这些进程间通讯的桥梁。正如其名“粘合剂”一样,它把系统中各个组件粘合到了一起,是各个组件的桥梁。理解Binder对于理解整个Android系...

2021-04-01 10:27:40 390

原创 关于 aar包与项目第三方框架冲突问题解决

上次不是给客户方提供了aar包嘛,今天客户方开发人员在对接群里问我们,在集成项目时候他们引用的gson,rxjava等框架跟我们aar包里冲突了,我想这个问题还需要在群里问吗,不是很容易解决吗?我当时就甩了几个网上链接给他,让他自己去解决,他说这些都试过了没用效果。wtf,这里我就记录下 遇到这种问题该如何快速解决。首先我们看下报错信息如下:从这个信息可以看到 gson库冲突了我们先打开项目中External Libraries,找到gson库的module名记住 modu...

2020-10-27 10:45:52 1971 1

原创 Android 多依赖module的项目打包成aar

最近客户有一个需求,希望我们把项目打包成sdk提供给他们。刚收到的时候我觉得很简单,这不是很简单嘛。第一步:将app中的build.gradle 的application改为library第二步:修改AndroidManifest中相关配置,该删的删,细节我就不多说了,网上这种文章太多第三步:将项目中所有switch case修改成 if else最后打包 生成aar,以为美滋滋搞定,将aar放在demo中一跑,carsh。从崩溃日志中一看。未找到相关类,其实我心里早有预想,因为我项目.

2020-10-16 17:12:40 1684

转载 你所需要知道的jni知识

一、Java 代码 和JNI代码通信Java代码通过JNI接口 调用 C/C++方法1、首先我们需要在Java代码中声明Natvie方法原型public native void helloJNI(String msg);2、其次我们需要在C/C++代码里声明JNI方法的原型如:extern "C"JNIEXPORT void JNICALLJava_com_kgdwbb_jnistudy_MainActivity_helloJNI(JNIEnv* env, jobj..

2020-08-05 09:25:23 358

原创 Android recycleview中item包含图片,在刷新的时候如何避免图片闪烁

显示的社交应用经常有类似于微信朋友圈,上面有图片视频,下面有点赞等操作。按常规的写法,刷新item的时候图片往往会发生闪烁,体验很不好,所有需要特别处理下。解决方法:1 自定义动画,代码很多基本就是系统源码,只不过将里面刷新的动画那部分代码给去掉了,直接复制即可,有爆红的地方找找导一导包public class DefaultItemAnimator extends SimpleItemAnimator { private static final boolean DEBUG = fa

2020-07-31 11:20:51 670

原创 Android 机顶盒tv端 recycleview无法滚动到最下方的bug解决

在开发机顶盒项目中,使用recycleview的GridLayout的时候发现一个问题,因为我的item是一个图片在上,文字在下的布局,遥控器控制列表在向下滚的时候,到达最后一行,无法显示item的文字。一开始,我觉得可能是我把焦点落在item中的头像上导致的,但是后来我将焦点落在整个item上还是会这样。所以我就想从recycleview的向下滚动的距离处理,滚动距离拉大。附代码如下:private void setScrollListener() { int mScreenHeight =

2020-07-28 17:07:33 757

原创 Android AIDL解惑 什么时候使用,该怎么使用?

1 AIDL 什么时候使用?AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写。作为进程间通信的重要方式之一?什么时候需要用到呢?场景1 现在你的应用需要强制保活,产品经理要求做进程保活,在应用中多开一个进程,用来与主进程进行心跳监听,如果有一个进程挂掉,另外一个进程将它拉起。这种需求常用于定制性设备的主应用。场景2 要求两个应用间可以进行数据传递。

2020-07-06 11:26:53 1096

原创 Glide原理剖析,面试就这么答!(一)

Glide是近年来Android图片加载最常用的框架,同时也是面试时最容易被问到的。今天就通过面试题的方式来对Glide进行原理的剖析。第一问:Glide与其他图片框架相比,有什么优势?很多同学会说 Glide使用是链性写法,使用方便。当然可以这么说,但不能仅仅这么说。我们先看一下with()方法,这个需要传一个context,这个context可以是activity,也可以是fragment。不管传入哪种值得with方法,它的底层都是调用getRetriever()方法,当传入f

2020-06-02 10:51:16 3367

原创 Android app之间相互唤醒的那些事儿

最近有个需求,在一个定制设备上,我们的app需要跟厂商的一个app进行通信,在一方挂了的情况下,可以相互拉起。需求很简单,实现的方案也要很多种。我第一想到是通过aidl 进行通信,监听是否终止连接,具体实现例子如下。1 AIDL 通信因为双方需要互拉,所以两个app 即属于客户端,又可以称为服务端,aidl的文件路径要保证一致,直接整个文件夹复制就可以了。public class LocalService extends Service { SreenAidlInterfac

2020-05-28 13:11:53 4375 1

原创 设计模式(六)代理模式

我们在Android开发种经常会在源码中看到动态代理,今天我们就来聊聊代理模式。代理模式是干嘛的呢? 代理模式可以在不改变原有类逻辑代码的情况下,操控该类对该类,可以对该类的进行功能上修改或增强。...

2020-05-01 21:10:22 165

原创 设计模式(五)装饰者

装饰者模式是对一个已经存在的类进行功能上的增加,但是不去修改原类的逻辑代码,适用于对类的扩展。接下来举一个 武林中的例子。张无忌刚出场的时候啥武功都不会是个小白。public interface KongfuSecretBook { public void getKongfu();}public class Zwj implements KongfuSecretBo...

2020-04-22 11:10:28 98

空空如也

空空如也

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

TA关注的人

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