Failed to resolve: com.github.kongqw:AndroidSerialPort:1.0.1
Affected 受影响 受感动的 ,Affected Modules: app
一般情况下 是在all projects maven 里面没有导入该 链接 另外是版本号不匹配 。
implementation 'com.github.kongqw:AndroidSerialPort:1.0.0'
安卓基于Linux内核实现的操作系统,有必要了解一下 Linux的内存管理机制 。 android 又不同于linux 它是移动型操作系统 具有自己的特性 。内存管理机制 和进程之间的管理 。
CPU只能访问其寄存器(Register)和内存(Memory), 无法直接访问硬盘(Disk)。 存储在硬盘上的数据必须首先传输到内存中才能被CPU访问。从访问速度来看,对寄存器的访问非常快,通常为1纳秒; 对内存的访问相对较慢,通常为100纳秒(使用缓存加速的情况下);而对硬盘驱动器的访问速度最慢,通常为10毫秒。
堆栈(Stack):存储由该程序的每个函数创建的临时变量
堆(Heap):该区域特别适用于动态内存分配
数据(Data):存储该程序的全局变量和静态变量
代码(Code):存储该程序的指令
每个进程都有一个基址寄存器和限制寄存器:
基址寄存器保存最小的有效存储器地址
限制寄存器指定范围的大小
Virtual memory(虚拟内存)
虚拟内存(VM)是OS为内存管理提供的基本抽象。
所有程序都使用虚拟内存地址
虚拟地址会被转换为物理地址
物理地址表示数据的实际物理位置
物理位置可以是内存或磁盘
分页将物理内存划分为多个大小相等的块,称为帧(Frame)。并将进程的逻辑内存空间也划分为大小相等的块,称为页面(Page)。
任何进程中的任何页面都可以放入任何可用的帧中。
Android使用虚拟内存和分页,不支持交换
安卓单进程概念:
一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。
很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题。为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如大图片的处理、子进程记录运行轨迹等。
进程 process 分为私有进程和全局进程
私有前面有冒号 全局前面没有冒号
安卓之间的线程之间的通信 有一个是主线程(也叫UI线程),其它的都是普通的工作线程。那么线程间通信就会分为两种情况:主线程和工作线程通信;工作线程和工作线程通信。
安卓启动流程 从上电开始App的详细流程:
1.打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
2.BootLoader把操作系统拉起来
3.Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
4.init进程初始化和启动属性服务,之后开启Zygote进程
5.Zygote开始创建JVM并注册JNI方法,开启SystemServer
6.启动Binder线程沲和SystemServiceManager,并启动各种服务
7.AMS启动Launcher
Recovery模式是Android特有的升级系统,通过这个可以进行手机恢复出厂设置,或执行OTA,补丁和固件升级,实质是启动了一个文本模式的Linux。
Zygote会执行一个app_process可执行文件,在这个文件中首先添加了Android运行时环境,在Android运行时中调用了ZygoteInit类,这就从c++代码跳到了java代码。
注册1.soceket,2.预加载资源,3.启动SystemServer进程,经过层层调用,最终会调用到SystemServer.main方法。4进入runSelectLoop循环处理事件。
2021.5.13
RxFFmpeg 是基于 ( FFmpeg 4.0 + X264 + mp3lame + fdk-aac ) 编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架,包含以下功能(视频拼接,转码,压缩,裁剪,片头片尾,分离音视频,变速,添加静态贴纸和 gif 动态贴纸,添加字幕,添加滤镜,添加背景音乐,加速减速视频,倒放音视频,音频裁剪,变声,混音,图片合成视频,视频解码图片等主流特色功能
图片加载框架 glide
// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
加载添加占位图 Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
Glide.with(this).load(url).placeholder(R.drawable.loading).error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)//关闭Glide的硬盘缓存机制
.into(imageView);
//DiskCacheStrategy.NONE: 表示不缓存任何内容。
//DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
//DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
//DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
加载指定格式的图片--指定为静止图片
Glide.with(this)
.load(url)
.asBitmap()//只加载静态图片,如果是git图片则只加载第一帧。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.asGif()//加载动态图片,若现有图片为非gif图片,则直接加载错误占位图。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)