自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (2)
  • 收藏
  • 关注

原创 常见cmd命令

runas /user:域名\用户名 "taskkill /IM notepad.exe /F"如果需要以不同的用户身份运行命令,可以使用。命令以其他用户身份执行。

2024-08-28 15:24:52 169 1

转载 彻底搞懂KMP算法原理

KMP算法是什么?引用自百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。也就是说,KMP算法是用来解决字符串匹配问题的,从一个主字符串text。

2024-01-18 16:25:59 119

原创 硬盘基本知识(磁头、磁道、扇区、柱面)

盘片(platter)磁头(head)磁道(track)扇区(sector)柱面(cylinder)

2024-01-05 16:10:36 704

原创 Native层如何使用sqlite数据库

二、将sqlite源码中的sqlite3.c和sqlite3.h加入工程,并添加到CMakeLists.txt,就可以使用sqlite数据库了。三、调用sqlite的接口进行数据库的创建、数据的添加和查询。四、如果执行成功,则会打印"id=100,name=hyh"。下载sqlite源码。

2023-12-13 16:20:41 720

原创 Binder的底层通信(Java层)

假如服务端的add比较耗时(5秒),我们可以采用回调的方式,将计算结果上报。4、如果打印"result = 3",则说明客户端调用服务端的方法成功。4、如果打印"result = 3",则说明服务端调用客户端的方法成功。1、客户端添加一个继承Binder的类,用于接收服务端的回调。2、客户端在绑定服务端的回调方法中直接调用服务端的方法。1、客户端绑定服务端Service。

2023-12-05 09:21:21 467

原创 Service的双向跨进程通信

3、在MainActivity中添加ICallback的实现,并将callback对象传递给服务端Service。2、在ITestService.aidl文件中添加新的接口register。5、如果客服端与服务端通信成功,则会打印"Hello Service!4、客户端绑定服务端Service,并与服务端进行通信。4、服务端Service的register的实现如下。1、新建AIDL文件,用与服务端与客户端的通信。1、创建AIDL文件,用于生成跨进程通信代码。2、创建服务端Service,添加如下代码。

2023-12-01 17:17:09 571

原创 Android中添加C或C++代码

3、配置CMakeLists.txt文件路径和CMake的版本,使CMake工具能够编译该文件。在app中的build.gradle加入以下代码。2、创建CMake构建脚本CMakeLists.txt文件,将其放在cpp目录中。6、运行该程序,如果成功,则会打印"Hello Native!5、加载C或C++代码生成的so库,并调用其中的方法。1、创建cpp目录,用于存放C和C++代码。4、创建test.cpp用于测试。

2023-11-30 17:12:46 675

原创 Lifecyle的原理

4、Activity或Fragment的生命周期发生变化时,通过LifecycleRegistry的handleLifecycleEvent通知观察者的生命周期的变化。3、观察者通过LifeCycle对象的addObserver注册监听生命周期的变化,通过removeObserver移除监听生命周期的变化。1、Lifecycle是典型的观察者模式,被观察者的继承关系如上图所示。2、LifeCycleRegistry是Lifecycle的子类。

2023-11-21 17:33:56 150

原创 DataBinding原理

说明:ActivityMainBindingImpl文件是编译器根据activity_main.xml布局文件在项目编译时生成的,该文件在build\source\kapt文件夹下面。2、随后,经过一系列函数调用,ActivityMainBindingImpl对象最终会实例化,并与activity_main.xml进行绑定。7、如果实例对象的某个属性发生变化,可以调用notifyPropertyChange方法,最后通知(notify)View界面的更新。

2023-11-20 16:27:37 172

原创 编程语言的基本元素

如果是面向对象语言,需要定义类和对象的语法,包括成员变量、方法、继承等。定义语言支持的基本数据类型,例如整数、浮点数、字符、布尔值等。如果是支持并发编程的语言,需要定义并发和多线程的语法和机制。定义支持的运算符,如算术运算符、逻辑运算符、比较运算符等。考虑向后兼容性,以确保新版本的语言能够支持旧版本的代码。定义函数和方法的语法,包括参数传递、返回值、递归等。设计变量的声明和赋值规则,包括作用域、生命周期等。设计异常的抛出和捕获机制,以及处理异常的语法。定义注释的语法,以及支持自动生成文档的规范。

2023-11-10 16:49:38 254

原创 一种使用wireshark快速分析抓包文件amr音频流的思路方法

amr的常用码率格式以及在IP域中的传输方式,可以参考网络资源,友情链接:https://blog.csdn.net/szfhy/art。2.使用ue的二进制编辑模式,编辑该文件,添加amr头,6个字节数据“#!AMR”,字节数据为 23 21 41 4D 52 0A。1. 使用wireshark过滤amr,并导出原始数据文件;6.生成的文件使用VLC播放器进行播放音频。

2023-11-01 11:24:34 978

原创 内存泄漏分析

内存泄漏是指在程序运行过程中,分配给程序的内存空间在不需要时没有被正确释放或回收的情况。

2023-09-04 10:22:16 165

原创 正则表达式匹配规则

以上只是正则表达式语法的一部分。正则表达式可以非常复杂,可以进行更高级的模式匹配,如捕获组、非捕获组、零宽断言等。学习和使用正则表达式需要时间和实践,你可以使用在线正则表达式测试工具来练习和验证你的正则表达式。

2023-08-16 09:54:43 363

原创 Java8 新特性

Lambda表达式,也可称为闭包,它是推动Java8 发布的最重要的新特征,Lambda允许把函数作为一个方法的参数传递进方法中。代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。代表了一个作用于两个同类型操作符的操作,并且返回了操作符同类型的结果。接受一个object类型和一个double类型的输入参数,无返回值。接受一个object类型和一个long类型的输入参数,无返回值。接受一个object类型和一个int类型的输入参数,无返回值。

2023-07-24 16:20:44 93

原创 Google JetPack

17、Traceur:帮助开发者识别和解决应用程序中的性能问题的库,包括对应用程序进行分析和跟踪。16、App Startup:帮助在应用程序启动过程中管理和初始化组件,以提供启动性能和效率。14、Security:用于应用程序啊安全的工具和功能,包括加密、密钥管理和安全储存等。10、Data Binding:将布局文件中的UI组件与应用程序逻辑进行绑定的库。11、ConstraintLayout:灵活的布局库,用于创建复杂的用户界面。12、CameraX:简化相机功能的库,用于创建复杂的用户界面。

2023-07-08 17:10:26 276

原创 C typedef和define的异同

然后跳出这个圆括号,先看右边,又遇到圆括号(只有函数后面才跟形参圆括号),这说明(*func)是一个函数,所以func是一个指向这个这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int,此处就是声明函数。根据我们上面的阐述可以知道,新结构建立的过程中遇到了pNext的声明,类型是pNode,要知道pNode表示的是类型的新名字,在类型本身还没有完全建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

2023-05-06 15:29:14 1174

原创 C 关键字

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增)(unsigned char : [-2^7, 2^7 - 1] 即 [-128, 127])1、静态全局变量,改变全局变量的可见性。静态全局变量在声明它的文件之外是不可见的。4、类的静态成员,实现多个对象之间的数据共享,并且不会破坏封装性,也保证了安全性。3、静态函数,改变函数的可见性。5、类的静态函数,减少资源消耗,不需要实例化就可以使用。2、静态局部变量,改变局部变量的销毁时期。

2023-05-05 20:21:59 408

转载 C void*理解

void *的范围较大,所以强制转换,使其进行范围缩小。

2023-04-24 15:18:52 197

转载 C 函数指针和指针函数

signal是一个函数,函数的参数为int类型,返回值是一个函数指针,调用该函数,这个函数的参数为int类型,返回值为void类型。调用指针p,并将返回值赋值给a,=,但p后面的()不能忘记,如果有参数可以参数,没参数也不能省略。()的优先级高于*,所以test先跟()结合成为一个函数,剩下的int *就是函数的返回类型。指针函数:简单来说就是一个函数的返回类型是指针,它的根本是一个函数。(*)是一个指针,指向一个void类型无返回值的函数,x本质是个指针。函数指针:首先它是一个指针,指向一个函数。

2023-04-21 10:36:42 56

原创 linux inotify机制

inotify是文件系统变化通知机制,在监听到文件系统变化后,会向相应的应用程序发送事件。典型的应用场景是文件管理器,理想情况下是用户修改了文件内容后立刻显示出文件最新的内容,如果没有inotify机制,一般会采用轮询的方式实现这种功能,这不能再第一时间反应文件系统的变化,而且浪费CPU时间。支持的事件类型,可以看出来支持的事件类型非常丰富,基本满足了我们对于文件监听的各种诉求。我们可以按照各自的场景,针对上述不同的事件类型做出相应的处理流程。就不会在监听 pathname 所指代的文件发出的事件了。

2023-04-17 20:33:32 606

原创 linux 文件读写

举个例子,比如第一次打开文件时分配的值fd = 0,如果该文件被关闭,下次新打开一个文件时,fd依然为0,但如果之前打开的文件没有被close掉,则下次新打开一个文件时,fd递增为1,一直递增到系统设定的同时打开文件的最大值为止,这个最大值可以使用 ulimit -n 查看,一般为1024。打开当前目录下的text.txt文件,如果不存在则创建,首先写入一个字符串,然后关闭文件,再重新打开读取该文件中的内容并打印。每一个rwx都对应一个。这些打开方式可以使用。

2023-04-17 16:39:29 835

原创 NDK编译脚本

CLEAR_VARS是编译系统预定义的一个变量,它指向一个特殊的Makefile,这个Makefile负责清除 LOCAL_xxx 的变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES 等)但不会清除 LOCAL_PATH。之所以需要清理这些变量是因为所有的编译控制文件是在一趟make执行过程中完成的,而所有的变量都是全局的,会对其他Android.mk文件产生影响。,用于返回Android.mk所在目录的路径。

2023-04-14 18:16:26 713

原创 C 文件读写

如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。如果写入成功,它会返回写入的字符,如果发生错误,则会返回。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。如果写入成功,它会返回一个非负值,如果发生错误,则会返回。函数从 fp 所指向的输入文件中读取一个字符。函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型。当上面的代码被编译和执行时,它会在 /tmp 目录中创建一个新的文件。

2023-04-13 14:46:03 331

原创 init进程

init进程是Android系统中用户空间的第一个进程,进程ID为1,源代码位于目录。作为Android系统的第一个进程,init进程承担这很多重要的初始化任务,一般init进程的初始化可以分为两部分,前半部分挂载文件系统,初始化属性系统和Klog, selinux的初始化等,后半部分主要通过解析init.rc来初始化系统daemon服务进程,然后以epoll的监控属性文件,系统信号等。init.rc。

2023-04-06 11:20:45 174

转载 Java对象在内存中的存储

Java对象内存中的存储

2022-09-04 15:26:22 458

转载 Java中的偏向锁、轻量级锁和重量级锁

Java锁状态

2022-09-02 16:37:46 336

转载 apk签名

有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性: android:sharedUserId="android.uid.system" android:sharedUserId="android.uid.shared" android:sharedUserId="android.media" 这时候apk的签名就需要是系统签名(platform、shared或media)才能正常使用。常用系统签名方式A

2021-08-28 16:01:28 570

原创 Dialog代码分析

1、Dialog构造函数中获取WindowManager对象和创建Window对象,为界面显示做准备。2、Dialog中create()会调用dispathOnCreate(),接着调用onCreate(Bundle saveInstance)方法,onCreate(Bundle saveIntance)是一个空方法,需要用户继承后实现,该方法要求调用setContentView()来为Window添加View。3、Dialog中Show()首先判断onCre...

2021-08-19 09:24:41 349

原创 Zygote的总结

一、重点工作回顾1.Btrunc业务及代码架构学习熟悉B-trunc业务需求、项目组织架构、代码逻辑结构。由于B-trunc集群业务的复杂性,代码组织形式具有多层次和多模块的特点。先后对业务逻辑核心GotaSystem和UI逻辑Gota4G展开学习,掌握AP与CP交互、AT指令、消息处理、UI显示等关键技术和知识点。2.解决GH820、GH880项目BTrunC相关的故障。以EC单为切入点,深入分析代码的逻辑缺陷,并解决问题。问题单涉及了业务逻辑、界面显示和系统等各方面的问题,在解决这些问题同时.

2021-07-17 14:52:43 107

转载 Activity窗口显示

1.一个activity的显示WindowSission 是进程独有的,主要是用来跨进程和WMS通讯实现window的移动尺寸动画的执行。2.requestLayout()和invalidate()区别?invalidate 刷新的是darty区域,局部刷新界面,invalidate调用多次不会有效率问题,因为invalidate 多个dirty矩形可以一次重会完成,requestlayout便利所有view视图,效率比较低。2.画图需要四大金刚:1.Bi...

2021-06-23 15:37:39 281

原创 开发常用软件

https://www.androidos.net.cn/tools

2021-06-23 14:27:08 108

原创 邮件发送

public static void sendEmail(Context context, String receiver, String subject, String body, File file) { try { Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, new String[]{receiver}); it.setType("*/*.

2021-04-21 15:41:24 76

原创 Window窗口——窗口属性

1.窗口类型与层级Android支持的窗口类型很多,不过我们可以将它们统一划分为三大类,即Application Window, System Window和Sub Window。另外各个种类下还细分为若干子类型,且都在WindowManager.java 中定义,如下所示。1. Application Window普通应用程序的窗口都属于这一类,如表1-1所示。 表 1-1 Application Window 细分 Type Descript

2021-03-10 17:19:16 1760

原创 问题解决——启动白屏

1.前言在Android手机中,打开一个App,就会先展示一个白屏,然后才是进入欢迎页面。为什么会有白屏呢?2.白屏是什么首先我们要知道这个白屏是什么,才能去解决这个问题。我们知道Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog、还是Toast,他们的视图实际上都是附加在Window上的。没错,这个白屏,就是Window的背景。我们先来看一下Android中App的启动过程:系统启动时init进程会创建Zygote进程,Zygote进程负责后续A

2021-03-10 10:19:38 587

原创 安卓系统架构

一、Android架构图二、5层框架的简单描述Linux Kern

2021-03-01 11:08:01 1798 2

原创 免费测试API

https://www.free-api.com

2021-02-25 16:57:31 341

原创 UDP打洞

1. 原理打洞过程(1)ClientA请求Server。(2)ClientB请求Server。(3)Server把ClientA的IP和端口信息发给ClientB。(4)Server把ClientB的IP和端口信息发给ClientA。(5)ClientA利用信息给ClientB发消息。(A信任B)(6)ClinetB利用信息给ClientA发消息。(B信任A)(7)连接已经建立。两者可以直接通信了。//---------------------------------

2020-11-13 16:39:38 618

原创 Android常用技巧——系统签名

第一种:使用keytool-importkeypair生成keystore文件,后缀名为.jks,放到android studio中。1、下载keytool-importkeypair 地址:https://github.com/getfatday/keytool-importkeypair2、在源码中拷贝 platform.x509.pem、platform.pk8(位于../build/target/product/security)不同厂商的位置不同,需要正确路径下的platform.x509

2020-11-13 15:51:59 865

原创 Android常用技巧——引入aar文件

第一步:将aar文件拷贝到libs目录下第二步:修改build.gradle 配置文件:添加repositories { flatDir { dirs 'libs' }}这个是添加一个本地仓库,并把libs目录作为仓库的地址。

2020-11-13 15:23:16 4283

原创 Android常用技巧——打Jar包

eclipse 我们都会生成jar 包,那么Android Studio 如何生成呢?第一步:切换成Android 找到Gradle 下的app第二步: 屏蔽application 创建libaray, 屏蔽applicationId ,然后进行编译第三步:点击右上角 找到app第四步:找到 libjarsForRelease 双击 可以生成jar包第五步 :找到jar包生成的位置然后 你需要的一个jar包就完...

2020-11-13 15:03:15 550

Speex音频压缩和回声消除

Speex音频压缩和回声消除,对原始的PCM音频数据进行压缩,以及消除录音时,因为外放造成的回音。此项目的重点是通过jni调用Speex进行处理,对于需要开发音频的开发人员,具有参考价值!

2020-03-04

Speex语音聊天(含音频压缩和回声消除)

实时语音聊天程序,能够一对一进行语音聊天,语音数据通过服务器转发。项目采用了Speex库进行音频压缩和回声消除。数据传输量小,音效好。

2018-07-12

空空如也

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

TA关注的人

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