自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

做有意思的事情

进击的小白

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

转载 java-I/O File类(4)-DataInputStream和DataOutputStream/PipedInputStream和PipedOutputStream

DataInputStream和DataOutputStream过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。构造函数DataOutputStream(OutputStream out)Constructs a new DataOutputStream on the OutputStream out.示例:class StreamTest { public static void main(String[] args) throws Exception

2021-09-22 18:53:03 243

转载 java-I/O File类(1)-createNewFile()-mkdir()-跨平台的绝对路径-delete()-list()-deleteOnExit()

File类创建一个文件一个File类的对象,表示了磁盘上的文件或目录。结果:创建一个名字为1.txt的文件class FileTest { public static void main(String[] args) throws IOException{ File f = new File("1.txt"); //创建一个文件 f.createNewFile(); }}创建一个目录结果:创建一个名字为1.txt的目录clas

2021-09-22 18:02:18 180

转载 java-I/O File类(5)-Reader和Writer、OutputStreamWriter 、BufferedWriter、字节流和字符流的区别

回顾字节流输入输出Reader和WriterReader和Writer这两个抽象类主要用来读写字符流。InputStreamReader是字节流通向字符流的桥梁BufferedReader提供一个ReadLine()方法OutputStreamWriter是字符流到字节流的桥梁BufferedWriter也提供了一个很有用的方法,请看示例:public static void main(String[] args) throws Exception{ //对文件的写入和对

2021-09-22 17:03:06 452

转载 Android音频浅析及各种音频场景下的audio data path

转自:Android智能手机上的音频浅析Android智能手机中各种音频场景下的audio data path1. 硬件下图是Android智能手机中目前主流的跟音频相关的硬件框图。上图中AP是应用处理器(application processor),现在用的最多的是ARM的处理器,在上面主要运行的是操作系统(OS,例如android)和应用程序。CP是通信处理器(communication processor),也叫基带处理器(baseband processor,BP)或者modem,上面

2021-08-20 14:54:22 1920

原创 18. Android MultiMedia框架完全解析 - Android NuPlayer播放框架

前言通俗点说,NuPlayer是AOSP中提供的多媒体播放框架,能够支持本地文件、HTTP(HLS)、RTSP等协议的播放,通常支持H.264、H.265/HEVC、AAC编码格式,支持MP4、MPEG-TS封装。在实现上NuPlayer基于StagefrightPlayer的基础类构建,利用了更底层的ALooper/AHandler机制来异步地处理请求,ALooper列队消息请求,AHandler中去处理,所以有更少的Mutex/Lock在NuPlayer中。NuPlayer中利用了Acodec。

2021-07-21 15:15:41 574

转载 13. Android MultiMedia框架完全解析 - MediaCodec解析

前言MeidaCodec API: https://developer.android.com/reference/android/media/MediaCodecMediaCodec是一个Codec,通过硬件加速解码和编码。它为芯片厂商和应用开发者搭建了一个统一接口。MediaCodec几乎是所有安卓播放器硬解的标配,要深入分析一个播放器的源码,如NuPlayer, ijkplayer,有必要了解其基础的使用方法。先来看看MediaCodec在NuPlayer中的位置:同样,我们想要深入了解Me

2021-07-20 22:48:14 1328

原创 17. Android MultiMedia框架完全解析 - MediaClock分析与音视频同步

前言这里的代码分析流程就是《15. Android MultiMedia框架完全解析 - Render流程分析》中的代码流程,上次主要关注的是buffer的交互流程,这次主要分析的是音视频同步,即AVsync。1. 音视频同步概念与方法音视频同步是一个播放器要处理的基本问题,音视频同步的好坏直接影响到播放效果。解码后的音频片段和视频片段,都分别带有 pts 时间戳信息。回放时需要做的,就是尽量保证 apts(音频时间戳)和 vpts(视频时间戳),之间的差值是最小的。为了达到这个目的,就需要在 au

2021-07-20 14:33:57 961

转载 16. Android MultiMedia框架完全解析 - ACodec详细解析

前言之前的文章中,已经多次分析过ACodec,但是我仍然认为有必要单独拿出来一节分析其中的一些机制与流程,下面先来看看ACodec在整个NuPlayer架构中的位置:1. ACodec消息机制ACodec有一个BaseState和派生出来的其他State,如 UninitializedState,LoadedToIdleState, ExecutingState等。当有消息过来时,如果派生类有重写的方法,则会调到重写的方法,如果没有,则会调到BaseState的方法。ACodec继承自AHiera

2021-07-20 10:27:48 1027

转载 14. Android MultiMedia框架完全解析 - NuPlayerDecoder与MediaCodec的交互

前言上一篇文章中详细分析了MediaCodec,以及由它向下的内容,但是在MediaCodec外面包裹的是一层NuPlayerDecoder,这里就看看它们两者之间是如何沟通的。从理论上来讲,既然NuPlayerDecoder包裹在MediaCodec外层,所以它相对于MediaCodec也可以理解为App,它调用MediaCodec的API来完成一些任务。下面就详细看看这个流程1. 解码顺序的启动过程实际的解码是从setRenderer开始,在NuPlayer::onStart()函数中,mVi

2021-07-20 10:14:58 539 1

转载 12. Android MultiMedia框架完全解析 - 从NuPlayer到MediaCodec到ACodec到OMX的整体流程与状态转换

前言之前的文章中,讲了那么多细节的东西,已经对概况没有一个大致的了解,所以这里缕一下整体的流程,同时也分析MediaCodec,ACodec与OMX Plugin之间的状态切换关系。1. 初始化过程(从NuPlayer开始):1.1 NuPlayer::start()NuPlayer::start()时产生一个kWhatStart,在消息处理函数中如果是暂停后的开始就调用NuPlayer::onResume()【只需mSource->resume()和mRenderer->resu

2021-07-19 18:31:09 1319 2

转载 11. Android MultiMedia框架完全解析 - start流程分析

还是从mediaplayer.cpp开始分析,看start函数的实现:status_t MediaPlayer::start(){ mPlayer->setLooping(mLoop); mPlayer->setVolume(mLeftVolume, mRightVolume); mPlayer->setAuxEffectSendLevel(mSendLevel); mCurrentState = MEDIA_PLAYER_STARTED; ret =

2021-07-16 19:02:20 497

转载 10. Android MultiMedia框架完全解析 - MediaExtractor::Create函数的解析

先来看看MediaExtractor所处的位置:1. 创建流程在GenericSource.cpp的NuPlayer::GenericSource::initFromDataSource()函数中调用了:extractor = MediaExtractor::Create(mDataSource, mimeType.isEmpty() ? NULL : mimeType.string());NuPlayer会为每个播放的文件,创建一个MediaExtractor

2021-07-16 15:50:39 418

转载 9. Android MultiMedia框架完全解析 - MediaExtractor和MediaMuxer介绍

Android中Native层抽象出来MediaMuxer类和MediaExtractor类,MediaMuxer类主要用于将音频和视频数据进行混合生成多媒体文件(如:mp4文件),而MediaExtractor则刚好相反,主要用于多媒体文件的音视频数据的分离,即解封装(又叫解复用)。而在文件播放中,首先需要做的就是解封装, 所以在播放过程中,NuPlayer使用了这个MediaExtractor类,先来看看MediaExtractor在NuPlayer框架中所处的位置:1. 使用下面给出一个And

2021-07-16 15:13:14 444

转载 8. Android MultiMedia框架完全解析 - prepareAsync的过程分析

还是从mediaplayer.cpp文件开始分析:status_t MediaPlayer::prepareAsync(){ ALOGV("prepareAsync"); Mutex::Autolock _l(mLock); return prepareAsync_l();}基本没做什么,设置了一个自动锁,然后就直接跳到MediaPlayer::prepareAsync_l中去执行了:status_t MediaPlayer::prepareAsync_l(){

2021-07-16 14:53:28 386

转载 6. Android MultiMedia框架完全解析 - NuPlayerDriver与NuPlayer的通信

前言先解决NuPlayer与NuPlayerDriver的通信过程,在之前的文章中,都说了NuPlayerDriver是NuPlayer的一个Wrapper,上层的指令发送给NuPlayerDriver后,NuPlayer作为NuPlayerDriver的一个成员变量,NuPlayerDriver想调用NuPlayer的话,就相当简单。当NuPlayer完成一个指令后,如何通知NuPlayerDriver呢?下面我们就以setVideoSurfaceTexture为例来讲解一下(虽然这个函数的历程还没有追

2021-07-16 14:15:36 502

转载 5. Android MultiMedia框架完全解析 - 再谈Playback框架及一些学习方法的讨论

前言经过前面的分析,我们大概知道了一些概念,但是这个StageFright在整个playback的位置是什么样的:Android Media这一块的知识杂乱,而且有深度,有广度。深度的话,从app->JNI->C+±>底层的OMX驱动,广度的话,每个播放器在播放的时候,会执行seek操作,快进,快退,暂停等等操作,同时,需要涉及读取源文件(从网络读取,从文件读取),解码(软解,硬解),Render等到一系列的操作,光听我这么说,就感觉很乱。如果一味的追求深度,从app开始追代码的执

2021-07-16 13:47:51 722

转载 2. Android MultiMedia框架完全解析 - MediaPlayer的C/S架构

在Android中大量使用到了C/S架构来实现应用层和底层服务交互,而Binder机制无处不在。同样MediaPlayer也使用了这种机制,MediaPlayer在运行的时候,同样可以分为Client/Server两个部分,他们分别在不同的进程中运行,不同进程间的通信使用Binder机制,架构图如下:1)如果从功能角度看,最上层是java层MediaPlayer的API, 然后通过JNI层到C++层之间的IPC通信,最下边就是palyer的具体实现了(StageFrightPlayer,NuPlaye

2021-07-16 09:53:31 772

转载 1. Android MultiMedia框架解析

前言在之前文章中说到mediaplayer最终会利用工场模式通过打分选择Nuplayer。这里插讲一下厂商定制Player的过程,可以参考NuPlayer的创建过程,通过这个过程,也能够对MediaPlayerFactory类有个比较深入的理解。定制首先来看这个class MediaPlayerFactory,它定义在MediaPlayerFactory.h文件中,里面包含一个IFactory类和其他的功能函数,如注册工厂类函数:registerFactory等等操作。而这个IFactory类,就是

2021-07-16 09:50:42 529

原创 ViewModel使用以及源码分析(二)-SavedState

前言在ViewModel使用以及源码分析(一)中,我们留了一个小尾巴SavedStateHandle没有讲解,这部分设计的内容比较多,本篇开始讲解。主要就是涉及到保存的一些知识。1. 概念1.1 SavedState 概念SavedState 是为了弥补 ViewModel 无法直接感知 onSaveInstanceState 被触发的时机的缺陷而产生的。在页面即将被销毁的时候,每个使用 SavedState 的 ViewModel 都会创建一个 Bundle 来存储自己的这份数据,最后这些

2021-07-09 15:13:37 708

原创 Activity 中的 onSaveInstanceState方法的调用时机

Activity为我们提供了两个回调方法onSaveInstanceState和onRestoreInstanceState 用于当Activity在不是用户主动意识关闭的情况下来进行页面数据的保存和恢复。那么那些情况下onSaveInstanceState会被调用呢?这个就是写个Demo就会一目了然了。分别有以下几种情况:当用户按下Home键 app处于后台,此时会调用onSaveInstanceState 方法当用户按下电源键时,会调用onSaveInstanceState 方法当Activi

2021-07-08 22:16:30 1048

原创 ViewModel使用以及源码分析(一)

前言在MVVM的模式中,ViewModel的作用在于维护数据与发送消息。架构组件ViewModel实际上提供的功能是:控制ViewModel的生命周期,使之与Activity与Fragment的生命周期绑定。虽然与Activity的生命周期绑定,但可以做到不随着屏幕的旋转而销毁。提供便利的获取ViewModel的方法,使得ViewModel可以更便利的在不同的View类中被访问。使用场景一个Activity中有两个View,这两个View需要共享同一个ViewModel,此时 用这个架构组件

2021-07-08 17:15:44 350

原创 Lifecycle之SafeIterableMap

前言在 Lifecycle 使用与源码分析文章中,我们分析LifecycleRegistry类时,说到新增的Observer都会被添加到mObserverMap里面。而这个mObserverMap就是FastSafeIterableMap,FastSafeIterableMap继承了SafeIterableMap。本篇我们就会讲解一下SafeIterableMap类。1. FastSafeIterableMap首先先说一下FastSafeIterableMap类。FastSafeIterableMa

2021-07-06 20:11:31 562

原创 Lifecycle 使用与源码分析

一、Lifecycle 介绍Lifecycle是一个生命周期感知组件,一般用来响应Activity、Fragment等组件的生命周期变化,并将变化通知到已注册的观察者。有助于更好地组织代码,让代码逻辑符合生命周期规范,减少内存泄漏,增强稳定性。这些组件可帮助您生成更易于组织且通常更轻量级的代码,这些代码更易于维护。二、使用方法先来看一下如何使用,这样再去分析源码就能有的放矢1.添加依赖:在app或者module目录下的build.gradle中,添加依赖:这里介绍Androidx 项目引入li

2021-07-05 15:25:03 533

原创 Android 9.0 PM机制系列(六)APK解析

前言在本系列的前面文章中,我介绍了PackageInstaller的初始化和安装APK过程、PMS处理APK的安装和PMS的创建过程,这些文章中经常会涉及到一个类,那就是PackageParser,它用来在APK的安装过程中解析APK,那么APK是如何被解析的呢?这篇文章会给你答案。1.引入PackageParserAndroid世界中有很多包,比如应用程序的APK,Android运行环境的JAR包(比如framework.jar)和组成Android系统的各种动态库so等等,由于包的种类和数量繁多,

2021-06-28 23:06:01 933 3

原创 Android 9.0 PM机制系列(五)PMS启动流程

前言PMS的创建过程分为两个部分进行讲解,分别是SyetemServer处理部分和PMS构造方法。其中SyetemServer处理部分和AMS和WMS的创建过程基本类似。1. SyetemServer处理部分PMS是在SyetemServer进程中被创建的,SyetemServer进程用来创建系统服务。从SyetemServer的入口方法main方法开始讲起,如下所示。frameworks/base/services/java/com/android/server/SystemServer.jav

2021-06-28 16:06:51 1286

原创 Android对apk进行系统签名

首先Android.xml加入这句android:sharedUserId="android.uid.system"然后需要找到系统组的人拿到签名证书文件:platform.pk8 和 platform.x509.pem,对该apk进行系统签名:java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signed.apk其中:signapk.jar 是签名工具。Demo.apk 是未签名的apksigned.apk 是指定的

2021-06-28 09:00:20 1007 1

原创 DNS 优化之IP直连

移动互联网中,DNS解析的失败率是联网失败占比很大的一种。有时候改用https传输后,多次遇到运营商DNS劫持导致客户端在进行握手认证的时候失败,进而无法正常使用。为了优化这个问题,我们使用了IP 直连。即,从服务端拉取一个配置文件,里面包含了域名到IP的映射。客户端每次联网时根据域名在配置文件里面找到对应IP,直接使用IP进行请求。注意配置文件拉取。使用Get请求,尽量使用请求简单的URL,减少出错概率。并且这个时候不能使用IP直连,避免IP改变时拉取失败。Host头设置。对于一个IP主机挂载多

2021-06-25 10:57:52 1666

原创 Android 系统源码——下载到编译

前言一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常编译调试了。但是一直没有记录过程,导致每次需要下载的时候都要重新查找一下过程,这里进行一下总结。1. 下载准备Android源码到模拟器运行,主要有的四个步骤:下载源码搭建编译环境准备编译我使用的环境是Ubuntu16.04 、openJDK8、Android 9.0.0硬件要求:如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 maste

2021-06-23 10:42:56 761

原创 Android 4.4 PM机制系列(四) APK安装需要空间分析

前言在 Android 9.0 PM机制系列(四) APK安装需要空间分析以及 Android 6.0 PM机制系列(四) APK安装需要空间分析两篇文章中,我们重点分析了Android9.0以及Android6.0所需要的最小APK安装存储空间大小。本篇我们要分析Android4.4安装APK所需要空间大小。1. 开始安装分析源码,一直跟到PMS里面,发现和Android9.0,6.0一样,安装核心代码开始处就在handleStartCopy方法,代码如下:/frameworks/base/ser

2021-06-22 17:23:47 1002

原创 Android 6.0 PM机制系列(四) APK安装需要空间分析

前言在Android 9.0 PM机制系列(四) APK安装需要空间分析文章中,我们重点分析了Android9.0需要的最小APK安装存储空间大小。结论就是:只要系统空间小于Math.min(getTotalSpace的5%,500M)+ PackageHelper.calculateInstalledSize(pkg, abiOverride),系统就会报空间不足。正当以为所有的系统都大抵如此,但是没想到在Android6.0上面,当空间存储只有30M的时候,依旧可以安装10M的应用。这到底是怎么回事

2021-06-21 22:48:39 535

原创 Android 9.0 PM机制系列(四) APK安装需要空间分析

前言在PM机制系列前三篇,我们着重分析了安装的整个流程,没有具体到很多细节问题。这一篇文章我们就会具体到很多细节问题。本篇主要就是围绕一个问题展开:安装APK到底需要多少空间不会报错INSTALL_FAILED_INSUFFICIENT_STORAGE?可以提高我们的安装成功率。1. 分析结果时序图DCS: DefaultContainerServiceSMS: StorageManagerServiceSM: StorageManager调用关系图如下所示,后面会进行具体分析

2021-06-21 16:15:24 981

原创 Android 9.0 PM机制系列(三)PMS处理APK的安装

前言在上一篇文章 Android9.0 PM机制系列(二)PackageInstaller安装APK中,我们学习了PackageInstaller是如何安装APK的,最后会将APK的信息交由PMS处理。那么PMS是如何处理的呢?这篇文章会给你答案。1.PackageHandler处理安装消息接着上一篇文章的代码逻辑来查看PMS的installStage方法。frameworks/base/services/core/java/com/android/server/pm/PackageManagerS

2021-06-20 23:34:15 950 2

原创 Android9.0 PM机制系列(二)PackageInstaller安装APK

前言在本系列上一篇文章Android9.0 PM机制系列(一)PackageInstaller初始化解析中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInstaller是如何安装APK的。本系列文章的源码基于Android9.0。1.PackageInstaller中的处理紧接着上一篇的内容,在PackageInstallerActivity调用startInstallConfirm方法初始化安装确认界面后,这个安装确认界面就会呈现给用户,用户如果想要

2021-06-20 22:17:56 2007

原创 Android9.0 PM机制系列(一)PackageInstaller初始化解析

前言包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一。包指的是Apk、jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一个机制来进行包的加载、解析、管理等操作,这就是包管理机制。包管理机制由许多类一起组成,其中核心为PackageManagerService(PMS),它负责对包进行管理,如果直接讲PMS会比较难以理解,因此我们需要一个切入点,这个切入点就是常见的APK的安装。讲到APK的安装之前,先了解下PackageMa

2021-06-20 21:01:24 1483 1

原创 Android Studio无法执行Java类的main方法问题及解决方法

在项目.idea/gradle.xml:新增一行代码<?xml version="1.0" encoding="UTF-8"?> <GradleProjectSettings> <option name="delegatedBuild" value="false" /> 添加这行代码 </GradleProjectSettings>

2021-06-01 22:14:55 161

转载 FLAG_ACTIVITY_NEW_TASK与FLAG_ACTIVITY_CLEAR_TOP的理解纠正

1.单独的FLAG_ACTIVITY_NEW_TASK并不等价于启动模式 singleTask,它仅表示寻找activity所需的任务栈压入,(即TaskAffinity指定的任务栈,TaskAffinity默认为应用包名)2.FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_CLEAR_TOP也不等价于启动模式singleTask3.在FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_CLEAR_TOP的情况下,AndroidManifest.xml中设

2021-05-19 14:17:46 1024

转载 Android10.0Auidio之MediaPlayer(六)- 选择player的评分机制

前言我们知道MediaPlayer播放的时候,最终会调到native层的MediaPlayerService中,在MediaPlayerService中会创建NuPlayer和TestPlayer,那么这俩Player是如何选择的呢?就涉及到了选择player的得分机制。正文先看下MediaPlayerService创建player的过程,首先MediaPlayerService在启动的时候MediaPlayerService::MediaPlayerService(){ ALOGV("M

2021-03-28 23:17:25 224

转载 Android10.0Auidio之MediaPlayer(五)

前言前边分析了MediaPlayer从java通过jni到native层的过程,其实mediaplayer的真正的逻辑存在是在mediaPlayerService中处理的,那么今天我们就从源码看下mediaplayerService的初始化过程正文MediaPlayerService通过mediaserver.rc启动,我们先看下man函数,源码位置/frameworks/av/media/mediaserver/int main(int argc __unused, char **argv __u

2021-03-28 23:01:01 246

转载 Android10.0Auidio之MediaPlayer(四)

前言之前说了MediaPlayer如何从java层到jni,以及jin如何callback回调到java,今天继续看看native层的mediaplayer又做了什么。正文先说下路径位于frameworks/av/media/libmedia/mediaplayer.cpp,我们先从mediaplayer的构造跟析构函数说起MediaPlayer::MediaPlayer(){ ALOGV("constructor"); mListener = NULL; mCookie

2021-03-28 22:33:05 217

转载 Android10.0Auidio之MediaPlayer (三)

之前说过了MediaPlayer java层的到jni的故事,我们知道了jni是如何跟java层mediaplayer联系上的,包括mediaplayer的初始化,callback的调用等,今天在来简单聊下setDataSource。正文MediaPlayer的setDataSource方法主要如下setDataSource(FileDescriptor)setDataSource(String)setDataSource(Context, Uri)setDataSource(FileDescr

2021-03-26 12:12:22 207

qt4 音乐播放器

qt4 音乐播放器 基于phonon库 有后台功能

2013-05-09

空空如也

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

TA关注的人

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