- 博客(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
原创 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-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 函数指针和指针函数
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
转载 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
原创 邮件发送
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
原创 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音频压缩和回声消除
2020-03-04
Speex语音聊天(含音频压缩和回声消除)
2018-07-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人