![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android开发
文章平均质量分 51
利明的博客
自古风云出我辈,一如江湖岁月催。
展开
-
Android ACodec状态机模型
Android 的ACodec 用于管理底层各个Component的各种状态采用了设计模式中的状态机模式一共有九种状态,搞明白各种状态之间的转换逻辑,对于我们再去读代码会有比较好的帮助交互逻辑如下:...原创 2020-02-03 01:55:33 · 1123 阅读 · 0 评论 -
AudioFlinger内部的Thread和Track的分类
原创 2019-12-18 17:24:58 · 423 阅读 · 0 评论 -
[Android Video Framework] MediaCodec.cpp详解
MediaCodec是Android Video Framework中一个很重要的类,可以被NuPlayer直接使用也可以被MediaCodec.java通过JNI的方式直接调用,可以赋予app很高的自由性,是多媒体开发中的一个很重要的类1、创建创建MediaCodec有两种方式,一种是 CreateByType, 根据应用或NuPlayer传递下来的MIME来创建;另一种是 Creat...原创 2019-01-31 17:59:18 · 3706 阅读 · 6 评论 -
[Android Video Framework]ACodec加载OMX
OpenMAX确立了一套标准的接口,上层App直接调用这些接口,底层硬件厂商直接实现这些接口,从而实现了上层软件开发与底层芯片开发地彻底分离,加速了跨平台的多媒体组件的开发、整合和编程。Android上的MediaCodec是通过ACodec来加载openmax层,了解OMX加载过程,有助于我们更好的分析问题和解决问题加载过程还需从ACodec::UninitializedState::on...原创 2019-01-31 20:54:29 · 3015 阅读 · 0 评论 -
常见NuPlayer错误log根因
1、 NuPlayerRenderer中 onDrainAudioQueue(): audio sink is not ready遇到情况是由于 AudioOutput::getPosition 返回err导致1.1 可能是由于 sp<MediaPlayerBase::AudioSink> mAudioSink 中的 mTrack 为 null当 NuPlayerDecoder ...原创 2019-01-22 17:17:02 · 1107 阅读 · 0 评论 -
[Android Video FrameWork] OMXNodeIntance中动态控制log的一种方法
从事此行业N年,遇到问题上去先是一通王八拳,能把问题打死,就继续找下一个问题的茬,如果打不死,就再打一套王八拳,直至打死问题为止。王八拳(不成体系的定位方法和手段)对付问题有效果,但是效率低,我的王八拳主要是:加log,编译,替库,运行,看log, 加log,编译,替库,运行,看log……运用这种磨豆腐的磨劲,磨死了好多问题,但 碰到流程套路深的框架和体系,这个效率实在实在是太低了,有...原创 2019-02-03 14:31:56 · 3209 阅读 · 3 评论 -
QCom Decoder与GoogleDecoder输出buffer的分配方式
1、QComDecoder输出buffer的分配方式ACodec通过 allocateOutputMetadataBuffers接口来分别输出buffer,分配一个空的VideoGrallocMetadata 结构体,复制给OMX_BUFFERHEADERTYPE结构体中的pBuffer解码启动时,ACodec从NativeWindow中dequeue出ANativeWindowBuffer...原创 2019-02-15 19:47:36 · 439 阅读 · 0 评论 -
编译Android的x264 lib(附解决No working C compiler found 问题)
尝试编译android版本的x264 lib一 取 x264最新版的源码方法有二:1 直接 git clone 最新版的代码git clone https://code.videolan.org/videolan/x264.git2 上官网下载最新代码压缩包,解压到本地https://www.videolan.org/developers/x264.html二 写编译脚本#!/bi...原创 2019-03-23 17:07:16 · 2353 阅读 · 0 评论 -
产品.mk控制android.bp选择性编译
先前写了一篇文章介绍如何使用go语言去控制 Android.bp 选择性编译, 见https://blog.csdn.net/u012188065/article/details/86226934后来发现, go脚本中只能调用 build/soong/android/config.go 里面规定好的函数如果我们需要增加自己的函数, 就需要打通整个通路, 通路如下:...原创 2019-04-17 11:12:24 · 2997 阅读 · 1 评论 -
Android Activity与Serivce的通信方式之一LocalBinder
Activity与Service的通信方式有三种:其中第一种也是最简单的一种, 即LocalBinder方式特点, Activity和Service位于同一个进程内, 简单,方便,可以实现activity和service之间的函数互相调用.service提供给activity的函数,我放到了接口 IManager中, 这样只需给activity暴露 IManager的接口函数即可, acti...原创 2019-06-22 12:54:19 · 1211 阅读 · 0 评论 -
Android布局控件之RelativeLayout
我们使用LinearLayout和TableLayout可以满足开发应用程序界面基本的要求。但是有时候实现界面的时候不够灵活,我们还可以使用另外一种控件RelativeLayout。RelativeLayout是一种相对布局的控件,这个容器内部的子元素们可以使用彼此之间的相对位置或者和容器间的相对位置来进行定位,类似于网页设计中的CSS。在指定控件的位置时,我们需要指定这个控件与其它控件之间的...原创 2019-07-08 14:59:42 · 961 阅读 · 0 评论 -
一种判断Android app窗口是否全屏的方法
app在手机上运行时,默认打开时是全屏的,所以获取的窗口尺寸为手机的屏幕尺寸如果手机连接到大屏上(如华为手机,锤子手机等),打开的app不一定是全屏的,获取的窗口尺寸就不是全屏尺寸,下面介绍一直方法,可以判断是否全屏WindowManager mWm = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);int mFu...原创 2019-07-14 19:43:53 · 2658 阅读 · 0 评论 -
【Android开发入门】二:更名、换图标、实现主界面
1 修改app 图标和 name默认app图标特别丑, 假如我们要做一个自己的微信,网上搜索微信的icon,注意一定要下载png格式的图标因为png有alpha透明通道,这样微信图标可以很容易的和各个手机的背景主题融为一体,png和jpg的区别可以参考此文章素材可以从这里下载下载不同尺寸的微信图标后,我rename 为 icon.png,并放置于 res 下不同的 mipmap文件中...原创 2019-01-17 19:28:04 · 875 阅读 · 0 评论 -
【Android开发入门】一:学会“Hello World”
随笔1、在Android Studio写第一个APP打开android studio, File-&amp;amp;gt;New-&amp;amp;gt;New Project设置 Application name(应用名), Company domain(公司域名), Project location(工程位置)一直默认next下去即可注意此处千万不要选择 Add No Activity,否则所有的资源布局等...原创 2019-01-17 13:52:20 · 373 阅读 · 0 评论 -
常见问题解决方案
1、 git clone时,Recv failure: 连接被对方重设git clone https://android.googlesource.com/platform/frameworks/av 正克隆到 ‘av’… fatal: unable to access ‘https://android.googlesource.com/platform/frameworks/av/‘:...原创 2018-09-12 10:56:50 · 950 阅读 · 0 评论 -
【Android AudioFrameWork】 device的选择
Android AudioFrameWork中device的选择1 streamType简介2 routing_strategy 简介3 device简介4 device的选择策略4.1 固有device来源于xml:4.2 可增删设备来源于手机插拔上报事件手机上的音频模块是一个很复杂的系统,为了区分和管理,android中引入了streamType, routing_strategy和dev...原创 2018-10-24 15:55:56 · 2564 阅读 · 0 评论 -
Android手机gdb调试
众所周知,linux上gdb是一个功能非常非常强大的工具,纵然使用多年,回头一看,仍然觉得还是掌握了很小很小一部分的代码。android是基于linux的平台,所以google在android上开发了很多类linux的调试工具,如arm-linux-androideabi-gcc-ar, arm-linux-androideabi-gcc, arm-linux-androideabi-g++ 等等...原创 2018-11-06 13:58:04 · 6575 阅读 · 2 评论 -
C++中子类与父类的内存分别情况
1. unbunt上C++子类与父类内存的分别情况1.1 只有一个父类的情况1.1.1 上代码#include <stdio.h>class A {public: A() {}; ~A() {}; int a; int b;};class B : public A {public: ...原创 2018-11-02 14:05:47 · 1992 阅读 · 0 评论 -
audio_policy_configuration.xml 解析
android的audioserver 进程启动时,会创建AudioPolicyManager,洋洋洒洒数千行的其构造函数,第一步就是加载配置相关的xml。#define AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH 128#define AUDIO_POLICY_XML_CONFIG_FILE_NAME &amp;amp;amp;amp;amp;quot;audio_policy_config...原创 2018-11-15 16:31:18 · 9080 阅读 · 3 评论 -
常用android命令备忘录
1. 常用基本命令adb devices 查看当前挂载手机设备的信息adb root root userdebug版本的手机。adb remount 将 '/system' 目录改为可写入的模式,默认情况下 '/system' 部分是只读模式的。 这个命令只适用于已被 root 的设备, 即调用过 adb root之后。 注意,使用其他命令之前,最好先使用adb root和adb ...原创 2018-11-19 18:51:35 · 918 阅读 · 0 评论 -
【Android AudioFrameWork】AudioPolicyManager loadHwModule详解
AudioPolicyManager 构造函数中,第一步是解析audio policy相关的xml文件,第二部就是根据xml中hal的name来加载对应的audio hal,直接上loadHwModule的流程图(以android 8.1.0版本为例).局部函数详解:1、load 函数打开对应.so后,加载 struct audio_module HAL_MODULE_INFO_SYM ...原创 2018-11-27 20:16:45 · 1860 阅读 · 1 评论 -
使用调用栈来调试Android代码
Android代码流程比较复杂,单纯看代码很容易跟丢,如果能在对应位置增加调用栈函数,运行时,我们可以根据调用栈来退出安卓代码的调用流程,可以事半功倍。1、java代码java代码中加调用栈方法很简单,抛一个异常即可。import android.util.Log;Log.i(TAG, Log.getStackTraceString(new Throwable()));注意,有的jav...原创 2018-11-30 20:37:06 · 719 阅读 · 0 评论 -
Android上不可思议的MetaData::findInt32相关crash
Android上经常可以碰到一些不可思议的crash,初看没有什么思路,如果从持锁竞争角度来看,两个线程同时操作同一个变量,便会有不可思议的crash如:/system/lib/libc.so (abort+63) /system/lib/liblog.so (__android_log_assert+154) /system/lib/libstagefright_founda...原创 2018-12-12 20:08:37 · 1042 阅读 · 0 评论 -
go语言控制android.bp选择性编译
为了降低工作量以及考虑到产品的可维护性,大部分手机厂商采用了同一套android代码对应多个产品,编译时根据配置参数选择性编译不同模块的代码。最初android的编译脚本为Android.mk,采用了Makefile的语言为了控制编译,我们可以在不同产品的BoardConfig.mk中定义 MARCO之后在Android.mk中,根据是否使用MARCO来确定编译选项以及编译代码块ifeq ...原创 2019-01-10 13:17:42 · 13757 阅读 · 0 评论 -
【Android小知识】 getprogname()函数的由来
在android开发中,我们会经常用到 getprogname()函数去debug。 这个函数太好用了,以至于我们经常会根据这个函数返回的应用进场名来区分不同的进程。 那么那个函数实现的位置在哪呢?首先,查找声明的地方我们我需要知道这个函数声明的地方,需要预编译代码,后去函数声明的头文件。 预编译我们需要知道预编译选项, 但是android正常编译时不会打印预编译选项,只会打印...原创 2018-05-28 14:42:37 · 2389 阅读 · 0 评论