自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

星空物语

今天的自己比昨天更优秀。记录工作中的点滴积累,总结成长的步伐里程。

  • 博客(161)
  • 收藏
  • 关注

原创 android openGL ES详解

Android之所以这样设计,是因为开发者在开发程序的时候不必关心特定的CPU或者机器架构,也不必关心底层的内存管理。在java层完成顶点的定义后,但是,在OpenGL可以存取它们之前,我们仍然需要完成另外一步。主要的问题是这些代码运行的环境与OpenGL运行的环境使用了不同的语言,我们需要理解如下两个主要的概念。第二种技术是改变内存分配的方式,Java 有一个特殊的类集合,它们可以分配本地内存块,并且把 Java 的数据复制到本地内存。本地内存可以被本地环境存取,而不受垃圾回收器的管控。

2024-04-23 17:59:21 540 3

原创 Android OOM问题定位、内存优化

如GCRoot中变量有对堆中对象的引用,gc则不回收堆中的该对象,如堆中对象无来自GCRoot的引用,则回收该对象。通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。即,对象本身被GC回收后,导致其他对象同时也被GC回收,这些被回收的所有对象占用内存总和。1、对象A,B,C内存占用情况如下,A的shallow size是10M,Retain size是30M。

2024-04-09 03:56:25 422 1

原创 Stringbuffer 和 Stringbuilder 的区别是什么?

请注意,尽管StringBuffer和StringBuilder都提供了可变字符串的功能,但它们的线程安全性和性能特性使得它们在不同的使用场景中有不同的适用性。此外,从 Java 5 开始,还有一个名为 StringJoiner 的类,它提供了一种更高效的方式来拼接字符串,特别是在拼接大量字符串时。StringBuffer 和 StringBuilder 是 Java 中用于处理字符串的两种常用类,它们都允许我们修改字符串,即进行字符串的拼接、插入和删除等操作。// 输出: Hello, World!

2024-03-06 18:43:06 376

原创 Activity、Intent、Servise 之间有什么关系?

例如,当从一个Activity跳转到另一个Activity,或从一个Activity启动一个Service时,都需要使用Intent来表明跳转或启动的意图,并传递相关参数。总结来说,Activity、Intent和Service之间的关系主要体现在:Activity通过Intent启动或与其他Activity、Service交互,而Service则是通过Intent在后台执行特定的任务。Intent在Activity和Service之间起到了桥梁的作用,负责传递启动或交互的意图及相关数据。

2024-03-06 13:05:14 390

原创 Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?

当主线程在处理一个事件或消息时,如果它花费了太多的时间(即超过了预定的时间片),操作系统会中断它并将 CPU 资源分配给其他线程。在 Android 中,主线程(通常被称为 UI 线程或事件分发线程)通过 Looper.loop() 方法进入一个无限循环,这个循环负责处理各种事件,如按钮点击、触摸事件、绘制请求等。只有当新的事件或消息到来时,它才会被唤醒并继续处理。综上所述,尽管 Looper.loop() 是一个死循环,但由于事件分发、消息处理、线程调度和非阻塞操作等机制,主线程并不会因此卡死。

2024-03-06 12:58:30 454

原创 Android 中为什么要使用 Binder 机制?

跨进程服务:在 Android 系统中,许多核心服务(如 ActivityManagerService、PackageManagerService 等)都是以跨进程服务的形式运行的。与传统的 Socket 通信相比,Binder 机制具有更低的延迟和更高的效率。安全性:Binder 机制在数据传输过程中提供了严格的安全控制,确保只有具有相应权限的进程才能访问数据。总之,Binder 机制在 Android 系统中发挥着至关重要的作用,为进程间通信提供了高效、安全、易用的解决方案。

2024-03-06 09:04:12 463

原创 Android 中导致 OOM 出现的原因有哪些?

为了避免 OOM 异常的发生,开发者在编程时需要注意优化图片加载、及时关闭数据库 Cursor、正确释放资源,并避免内存泄漏等问题。操作数据库时 Cursor 未关闭:如果在使用 Cursor 查询数据库后忘记关闭,可能会导致内存泄漏,进而引发 OOM 异常。内存泄漏:内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,导致可用内存空间逐渐减少,最终引发 OOM 异常。加载大图片或数量过多的图片:因为图片会占用大量的内存,如果不进行适当的优化或处理,很容易导致 OOM 异常。

2024-03-06 05:54:48 440

原创 线程池处理任务流程

在整个过程中,线程池会优先使用核心线程来执行任务,其次是阻塞队列,最后是非核心线程。如果所有资源都已经用尽,任务会根据拒绝策略进行处理。总的来说,线程池通过合理地管理和调度线程资源,提高了任务的执行效率,并减少了资源的浪费。线程池的主要处理流程涉及任务提交后的执行过程。对象,通过这个对象可以获得任务的结果,并且可以取消任务。方法用于执行任务,但不返回任何结果,而。方法不仅执行任务,还返回一个。

2024-03-05 17:50:18 414

原创 newSingleThreadExecutor和newFixedThreadPool(1)的区别

维护仅有一个线程的线程池有如下两种方式,正常使用的情况下,二者差异不大;复杂使用环境下,二者存在细微的差异。用newSingleThreadExecutor方式创建的线程池在任何时刻至多只有一个线程,因此可以理解为用异步的方式执行顺序任务;后者初始化的时候也只有一个线程,使用过程中可能会出现最大线程数超过1的情况,这时要求线性执行的任务会并行执行,业务逻辑可能会出现问题,与实际场景有关。

2024-03-05 17:17:26 385

原创 android 相机预览数据两个 GL_TEXTURE_EXTERNAL_OESS和GL_TEXTURE_2D类型的数据应用场景,以及同时渲染的原因和关系

需要注意的是,使用GL_TEXTURE_2D类型的纹理来渲染相机预览数据可能会对性能产生一定的影响,因为这种类型的纹理需要进行额外的格式转换或拷贝操作。需要注意的是,由于GL_TEXTURE_EXTERNAL_OES类型的纹理是特定于Android的,因此在其他操作系统上可能无法使用。综上所述,同时使用GL_TEXTURE_EXTERNAL_OES和GL_TEXTURE_2D类型的纹理数据是为了满足不同的使用场景、兼容性和扩展性的需求。

2024-01-25 19:53:44 837 1

原创 Android eglSwapBuffers和onrender的先后顺序

的调用顺序是重要的。在Android的OpenGL ES渲染过程中,是在每一帧结束时被调用。是在每一帧开始时被调用,而。

2024-01-24 14:32:08 675

原创 Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机,EGL还是需要了解下的。可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经将EGL环境都给配置好了,你一直在使用,只是不知道他的存在罢了。很多人可能在使用OpenGl ES渲染数据的时候都带着一个疑问,渲染的数据到底到哪里去了?没看到画布,Android中的自定义view不都是有画布的吗?EGL就是底层OpenGL绘制图形的画布。

2024-01-21 23:30:48 1391 2

原创 Android log日志分析

Logcat 命令行工具,官网:Logcat 命令行工具 | Android 开发者 | Android Developers

2024-01-19 09:59:23 450

原创 Android生命周期感知组件Lifecycle

Lifecycle生命周期感知组件,是为了监听具有生命周期的组件的生命周期的变化。当组件(Activity/Fragment)生命周期发生变化时,观察者中事件对应方法会被回调。在观察者回调方法中可以做与组件(Activity/Fragment)生命周期变化对应的资源或者业务逻辑的处理(如,activity走了ondestroy后,观察者回调到事件ON_DESTROY后,在对应方法下做释放资源等操作)。——具有生命周期的组件需实现的接口(即,拥有生命周期的组件如Activity/Fragment)

2023-12-28 14:42:44 1245

原创 Android Studio中log日志无法打印问题

1、重启Android Studio(通过Invalidate caches模式重启)2、卸载设备上的app,重新安装app。

2023-11-09 17:24:36 1654 1

原创 Kotlin小节(二)

如果修改变量声明,把当前的val改为var,那么改变的不过是可以给变量重新赋值一个新列表,而列表自身依然是只读的。(2) 类级别的属性赋值( var name = "www".also { println("name:"+it) })。(4) 次构造函数里的属性赋值和函数调用(var career = "developer"、println函数)。实现接口的抽象类,不必实现接口的所有属性和函数。(3) init初始化块里的属性赋值和函数调用(var age = 88、println函数)。

2023-09-26 05:37:51 1051

原创 ADB命令

输入命令:adb shell dumpsys window w |findstr \/ |findstr name=1、查看当前打开应用的包名。

2023-08-12 14:44:08 490

转载 Android - 父 View 可见性对其 子view 的影响

View 有 3 种可见性设置 - 可见、不可见和消失。任何时候 View 是不可见的,它都不会绘制它或其 subview。如果它已经消失,它也不会为它们保留任何布局空间。,它有多个 subview (不管它们是什么),则将父 View 的可见性设置为与所有 subview 的可见性相同独立?将父级设置为可见(父级可见,子级仍然消失,因为之前已明确设置了子级)是不是所有的 child 都还在画,只是没看到?,您会发现它仍然设置为之前的状态,即使它没有被绘制。将子级设置为 GONE(父级可见,子级已消失)

2023-08-04 10:56:34 420

原创 Kotlin小节(一)

functionAsParamTest4(888,"teacher",{name:String, age:Int ->//三个参数的情况,匿名函数排在参数列表最后,可以省区圆括号。functionAsParamTest4(888,"teacher"){name:String, age:Int ->//三个参数的情况,匿名函数排在参数列表最后,可以省区圆括号。这种简略写法只支持lambda参数排在最后的情况,所以,定义函数时,建议把函数类型的参数放在最后,以方便调用者使用。使用时需要::加上函数名即可。

2023-07-26 10:16:21 436

原创 Android studio如何运行Java main方法

2、找到该项目的.idle目录下的gradle.xml文件,并打开该文件 GradleProjectSettings中加入子项:<option name="delegatedBuild" value="false"/>设置完成后关闭gradle.xml文件,返回RunMain.java窗口后,点击main()后,即可正常运行main()1、在Android studio 项目里,新建Java类文件RunMain.java。3、结果,Run下输出“hello world!

2023-07-16 09:51:54 1831

原创 Android Camera2 CameraCharacteristics API 详解

如果应用程序在未持有 android.Manifest.permission.CAMERA 权限的情况下调用 CameraManager.getCameraCharacteristics,则此列表中的所有键将不可用,并且调用 get 将为这些键返回 null。捕获会话初始化完成后,会话参数密钥列表可以继续作为发布或更新进一步请求时的参考。返回 getKeys 返回的列表的子集,其中包含需要相机客户端获取 android.Manifest.permission.CAMERA 权限的所有密钥。

2023-07-13 15:42:09 952

原创 Android Camera2 Image

如果图像是通过 ImageWriter.dequeueInputImage() 从 ImageWriter 获取的,则调用此方法后,应用程序填充的任何图像数据都将丢失,并且图像将返回给 ImageWriter 以供重用。(不支持的用例包括通过 MediaCodec 获取的 Image 实例,以及 Android P 之前的版本上的 ImageWriter)。例如,当使用 ImageReader 类从各种媒体源读取图像时,一旦达到最大未完成图像计数,不关闭旧的 Image 对象将阻止新图像的可用性。

2023-07-11 16:57:28 1361 1

原创 Android Camera2-预览、拍照、录像流程

重复模式(Repeating):指的是不断重复执行指定的 Capture 操作,当有其他模式的 Capture 提交时会暂停该模式,转而执行其他被模式的 Capture,当其他模式的 Capture 执行完毕后又会自动恢复继续执行该模式的 Capture,例如显示预览画面就是不断 Capture 获取每一帧画面。在 Camera2 上,你可以在规定的曝光时长范围内配置拍照的曝光时间,从而实现拍摄长曝光图片,你甚至可以延长每一帧预览画面的曝光时间让整个预览画面在暗环境下也能保证一定的亮度。

2023-07-10 17:50:27 6383

转载 Android 13媒体文件访问权限适配

而Android 13(Api Level 33)则将READ_EXTERNAL_STORAGE进一步细分成为了读取图片的READ_MEDIA_IMAGE、读取视频的READ_MEDIA_VIDEO和读取音频的READ_MEDIA_AUDIO,本文主要介绍在媒体文件权限方面如何适配Android 13。

2023-07-10 10:27:18 7628

原创 Android Camera2 —CaptureResult API 详解

对于相同类型的请求(从相机设备捕获或重新处理),对于每个新结果或失败,该值从 0 开始单调递增,范围是 CameraDevice 的生命周期。在不同类型的请求之间,帧号可能不是单调递增的。例如,较新的reprocess 处理结果的帧号可能小于从相机设备capturing 新图像的较旧结果的帧号,但较新的reprocess 处理结果的帧号绝不会小于reprocess 处理较旧结果的帧号。还可以在捕获结果上查询为捕获请求列出的所有属性,以确定用于捕获的最终值。多次查询同一键的值将返回与前一次查询的值相等的值。

2023-07-06 16:00:52 640

原创 Android Camera2 —CameraManager API详解

在 API 级别 30 之前,当应用程序尝试打开多个不同 ID 的 {@link CameraDevice} 并且该设备不支持打开此类组合时,{@link #openCamera} 将失败并抛出 {@link CameraAccessException} 或一个 或多个已打开的 {@link CameraDevice} 将断开连接并接收 {@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected} 回调。

2023-07-04 17:28:25 3340

原创 Android Camera2 —CameraDevice API详解

实现FULL或LEVEL3级别支持的设备,比旧的摄像头API提供了大大提高的功能。初始化至少需要一个用于重复的有效输出surface或一个用于在扩展配置参数的输出参数中注册的高质量单个请求的有效输出。在此调用之后,除了最终的 CameraDevice.StateCallback.onClosed 调用之外,不会发生来自设备或活动会话的进一步回调,并且任何剩余的已提交捕获请求都将被丢弃,就像已调用 CameraCaptureSession.abortCaptures 一样,除非没有成功或者失败的回调被调用。

2023-07-03 19:20:08 1567

原创 Android VOLUME_EXTERNAL 和VOLUME_EXTERNAL_PRIMARY区别

返回构成 VOLUME_EXTERNAL 的所有特定卷名称的列表(即,包括手机内部存储和SD卡存储的名称列表)。这包括当前连接的每个共享存储设备的唯一卷名称,通常包括 MediaStore#VOLUME_EXTERNAL_PRIMARY。每个特定的卷名称都可以传递给 MediaStore.Images.Media#getContentUri(String) 等 API,以与该存储设备上的媒体进行交互。VOLUME_EXTERNAL_PRIMARY只包括手机内部存储。

2023-07-03 18:33:49 700

原创 Android build.gradle文件

一、 在项目多渠道开发时,除了对不同的渠道除了做统计外,还可以对不同的渠道加载不同的代码及资源,具体的部署可以参考 Android studio gradle中分渠道加载res、libraries及Class ;在模块化拆分后,若恰好在模块内部的代码及资源也要根据不同的渠道发布不同的aar包到nexus仓库,该怎么配置呢?二、思路:一般单独拆分出的library基本都是将代码及资源打包成aar...

2023-06-21 17:51:29 2041

原创 android系统屏幕旋转角度,应用界面横竖屏,设备旋转角度,三者的区别以及使用。

android系统屏幕旋转角度,应用界面横竖屏,设备旋转角度,三者的区别以及使用

2023-02-21 12:19:15 1273 1

原创 视频编码之I帧、P帧、B帧

1、视频传输原理 视频是利⽤⼈眼视觉暂留的原理,通过播放⼀系列的图⽚,使⼈眼产⽣运动的感觉。单纯传输视频画⾯,视频量⾮常⼤,对现有的⽹络和存储来说是不可接受的。为了能够使视频便于传输和存储,⼈们发现视频有⼤量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就⼤⼤减少了视频数据的⽂件,因此有了H.264视频压缩标准。 在H.264压缩标准中I帧、P帧、B帧⽤于表⽰传输的视频画⾯。 2、I帧、P帧、B帧介绍 I帧⼜称帧内编码帧,是⼀种⾃带全部信息的...

2022-05-11 17:40:08 1675

原创 手机已经安装高版本app,现在再安装低版本apk,遇到无法安装的问题

解决办法,如下:

2021-11-24 16:18:14 3141

原创 ssh_dispatch_run_fatal: Connection to 10.119.126.248 port 29418: incorrect signature fatal: Could no

从gerrit上拷贝代码,通过git clone命令拷贝,报错如下:$ git clone ssh://[email protected]:29418/apps/ZuiCamera2Cloning into 'ZuiCamera2'...ssh_dispatch_run_fatal: Connection to 10.119.126.248 port 29418: incorrect signaturefatal: Could not read from remote reposit

2021-04-25 17:02:10 3286

原创 Ubuntu 为.sh文件创建桌面图标

步骤:1、打开/usr/share/applications目录,在此目录下创建android-studio.desktop文件2、打开android-studio.desktop文件,写入如下内容:[Desktop Entry]Name = Android StudioComment= android studioExec=/home/用户名/workspace/AndroidStudio/android-studio/bin/studio.shIcon=/home/用户名/works

2020-08-07 14:39:33 1407

原创 2020年Android面试题整理

1、Android开发使用过的设计模式书写单例模式代码。2、Service两种启动模式的区别生命周期区别;与Activity生命周期的关系。3、静态方法加锁和非静态方法加锁,访问区别。4、volatile作用5、Activity四种启动模式,出栈进栈机制。6、AIDL通信为什么需要把对象数据序列化?从一个进程传输对象到另一个进程,对象是否还为同一个对象?不是同一个对象,因为进程不共享内存,因此对象存储地址不共享,对象存储地址变了,所以对象不是一个对象。7、Servie中实现A.

2020-07-17 09:32:13 1101

原创 http和https的区别

“HTTP属于超文本传输协议,用来在Internet上传送超文本,而HTTPS为安全超文本传输协议,在HTTPS基础上拥有更强的安全性,简单来说HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。”

2020-06-28 09:07:00 161

原创 ndk-build编译出错:Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14

cmd命令行报错信息,如下:PS D:\whx\AndroidStudioProject\VolumeII\Sample8_4\src\main\jni> ndk-buildAndroid NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14.Android NDK: WARNING: APP_PLATFORM android-14 is higher than android:minSdkV

2020-05-31 09:44:21 5860 2

原创 Android studio ndk编译配置

步骤:1、首先,在电脑->属性->系统变量中,配置NDK 目录D:\development\tools\android-ndk-r16b2、配置build.gradle文件,如下:apply plugin: 'com.android.application'android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "

2020-05-30 18:01:27 1062

原创 使用ndk-build命令,编译#include 语句出错,fatal error:“string” file not found

在cmd窗口,使用ndk-build命令编译项目,出错log信息:D:/AndroidStudioProject/VolumeII/Sample8_3/src/main/jni/myEncapsulation/FileUtil.h:6:10: fatal error: 'string' file not found.解决办法:在项目Application.mk文件中添加语句:APP_STL := stlport_static重新编译,即可。...

2020-05-30 17:33:50 5438

原创 解决Android Studio 编译项目,“编码UTF-8的不可映射字”出错问题

解决问题的步骤:步骤1、首先,在项目build.gradle文件中添加如下代码:buildscript { tasks.withType(JavaCompile) {//解决编码错误: 编码UTF-8的不可映射字 options.encoding = "UTF-8" }}步骤2、如果导入AS后,文件代码注释出现乱码问题。将AS右下角 “file encoding”编码格式,先改为“GB2312”,弹出对话框,选择“reload”,此时注释乱码消失。接着再改为“U.

2020-05-20 07:44:16 5487

空空如也

空空如也

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

TA关注的人

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