- 博客(140)
- 资源 (3)
- 收藏
- 关注
原创 Android gradle 构建
构造函数注入 && 字段注入。实现: 在主项目的 build.gradle 中,定义一个 Transform 任务,并在 transform 方法中对输入文件进行操作。实现: 在主项目的 build.gradle 中,使用 afterEvaluate 闭包来获取子模块的 Gradle 任务,然后进行修改。实现: 在主项目的 build.gradle 中,使用 project 获取子模块的 Task 对象,然后进行修改。场景: 你需要在主项目的构建生命周期中获取子模块的 Gradle 任务并进行修改。
2024-08-13 18:07:52
778
原创 Kotlin
by关键字用法by关键字用于实现委托模式。委托模式允许一个对象将某些操作委托给另一个对象来处理,从而减少代码重复和提高代码的可维护性。如类委托(绑定接口到另一个对象),属性委托(绑定属性到另一个类属性)allowInsecureProtocol 改为isAllowInsecureProtocol=true以下是 Kotlin 中的一些常见注解及其说明:@JvmStatic: 将伴生对象(Companion Object)中的函数或属性编译为与 Java 兼容的静态函数或属性。
2024-08-08 14:20:55
1141
原创 JNI中GetStringUTFChars/ReleaseStringUTFChars
函数用于获取 Java 字符串的 C/C++ 字符串指针。该指针指向一个以 null 结尾的 UTF-8 编码的字符串。是用于获取和释放 Java 字符串的 C/C++ 字符串指针的函数。当您不再需要使用该指针时,必须调用。函数来释放它,否则会导致内存泄漏。
2024-08-08 09:05:11
856
原创 使用 kapt 注解生成依赖注入代码
根据 `@Insert`, `@Query`, `@Update`, `@Delete` 注解,生成相应的数据库操作方法实现。1. **解析注解:** `RoomCompiler` 读取 `@Entity`, `@Dao`, `@Insert`, `@Query`, `@Update`, `@Delete`, `@Database` 等注解。Kapt 使用注解处理器来根据注解生成代码。* `@Insert`, `@Query`, `@Update`, `@Delete` 注解用于定义数据库操作方法。
2024-07-22 19:48:20
737
原创 Android构建任务assemble、bundle、compile、package、install
将 APK 文件转换为 Android App Bundle 格式,它可以根据设备配置动态提供不同的代码和资源,从而减少 APK 文件的大小。需要注意的是,以上列举的只是部分常见的任务。任务不同,它们生成的是 Android App Bundle,而不是传统的 APK 文件。这些任务将编译后的代码和资源以及其他必要的资源文件打包成 APK 文件。这些任务主要负责将代码、资源和依赖项编译并打包成 APK 文件。这些任务负责将构建好的 APK 文件安装到目标设备或模拟器上。
2024-07-19 14:31:55
914
原创 对androidTestDebug 产物进行重新签名
在运行 gradle assembleAndroidTestDebug 任务后,自定义的 reSignAndroidTestDebug 任务将会被执行,并对子模块的 androidTestDebug 产物进行重新签名。your_keystore_path.jks、your_keystore_password、your_key_alias 和 your_key_password 需要替换为你的实际路径和密码。如果需要对其他子模块的产物进行重新签名,可以根据需要创建不同的自定义任务。// 设置密钥库密码。
2024-07-19 11:34:39
660
原创 Kotlin协程挂起和恢复
在 Kotlin 协程中,你可以使用 kotlinx.coroutines.sync.CountDownLatch 来实现类似于条件变量的挂起与恢复机制,但 CountDownLatch 更加偏向于计数器式的等待,而不是条件式的等待。condition.await() 会在 Mutex 锁定状态下挂起当前协程,直到 condition.signal() 被调用。signal() 方法会唤醒所有等待的协程,如果需要唤醒特定协程,可以使用 signalAll() 方法。
2024-07-11 21:32:14
1022
转载 Android插件化-Resource Injection-资源插件化
我们要做的就是在ContainerActivity#onCreate中加载插件Apk的时候,用这两个方法创建出来一份插件资源实例。Android应用中所有资源(layout、value等)都会被打包到Apk中,生成一个对应的R类,其中包含对所有资源引用的id。这样就完成了资源注入。
2024-07-11 10:31:41
122
转载 Git 合并多个 commit,保持历史简洁
开发过程中,本地通常会有无数次 commit ,可以合并“相同功能”的多个 commit,以保持历史的简洁。过程中,可能会存在冲突,此时就需要解决冲突。将 commit 内容编辑如下。编辑注释信息,保存退出。
2024-07-08 11:04:02
1649
原创 SOCKS 代理 和 HTTP 代理, && WebSocket
SOCKS 代理更像是一个网络连接的中介,它支持各种协议,提供更高的透明性和灵活性;而 HTTP 代理则专用于处理 HTTP 请求,并提供了一些安全功能。选择哪种代理取决于你的具体需求。
2024-05-28 20:32:11
2746
2
转载 Kotlin构建报错解决方案:The binary version of its metadata is 1.7.1, expected version is 1.5.1.
发布于 2023-03-30 17:31:436.3K0举报。
2024-05-26 14:34:15
2682
原创 Kotlin Flow应用举例,launchIn 和collect用法及区别
val messageFlow = MutableStateFlow<Message>(Message("初始消息"))val messageFlow = MutableStateFlow<Message>(Message("初始消息"))println("消息已存储到数据库:${message.content}")用于在协程中收集消息流的最新值。messageFlow.value = Message("这是一个新的消息")messageFlow.value = Message("这是一个新的消息")
2024-05-17 11:10:52
1071
原创 详细介绍Binder底层机制
Binder 代理对象负责将客户端的 AIDL 调用转换为 Binder 交易,并通过 IPC(进程间通信)通道将交易发送到服务端进程。当一个进程发送一个 Binder 交易时,Binder 驱动程序会将交易分配给一个 Binder 线程来处理。Binder 化是一个过程,它将一个对象转换为 Binder 对象,使其可以在进程之间传递。**Binder 代理对象:**位于客户端进程中,代表远程进程中的实际对象。**Binder 存根对象:**位于服务端进程中,接收来自客户端的 Binder 交易。
2024-03-12 15:10:41
490
原创 Android AMS
*WMS 通知 AMS 窗口状态更改:**当 WMS 的窗口状态发生更改时(例如,窗口获得或失去焦点),它会通知 AMS。**WMS 执行 AMS 的窗口操作:**AMS 可以向 WMS 发出命令来执行各种窗口操作,例如: * 创建窗口 * 销毁窗口 * 移动窗口 * 调整窗口大小 * 更改窗口属性。**WMS 提供窗口信息:**WMS 可以向 AMS 提供有关窗口的信息,例如: * 窗口的当前状态 * 窗口的尺寸和位置 * 窗口的透明度 * 窗口的输入焦点。这确保了窗口的一致性、堆叠顺序和资源分配。
2024-03-11 21:02:50
1242
原创 Android中类加载机制
它允许类加载器委派加载类的请求给其父类加载器,直到找到可以加载该类的类加载器为止。**按 DEX 文件加载顺序加载:**如果父类加载器中不存在该类,则按 DEX 文件加载顺序加载 DEX 文件中的类。第一个加载的 DEX 文件中的类将被加载。**System ClassLoader:**加载系统类路径 (CLASSPATH) 中的类,例如 java.class.path 中的类。**DexClassLoader:**用于加载从 DEX 文件加载的类,通常用于加载 Android 应用中的类。
2024-03-11 20:35:43
1328
转载 时序流程图绘制技巧
相信平时工作中有画图需要的读者都有这样的感受:有些图制作过程非常简单但逻辑清晰又不失美观,而有些图费时费力制作繁琐,但效果却不是特别惊艳,这其中的底层逻辑尤为关键,毕竟作图也是一门艺术。如果是多个时序图描述的,所有的实体的命名需要统一定义好,且颗粒度需要保持一致。时序图更加注重时间顺序,可以清晰地表示交互的先后顺序与时序关系,而流程图注重过程的控制流程,可以描述每个步骤的执行方式以及处理逻辑。1. 画流程图的时候,需要遵守从上至下、从左至右的顺序的原则进行排列,这样做的目的是流程图的逻辑性更高。
2023-12-19 19:30:36
1665
转载 【无标题】
在项目的开发过程中,随着开发人员的增多及功能的增加,如果提前没有使用合理的开发架构,那么代码会越来臃肿,功能间代码耦合也会越来越严重,这时候为了保证项目代码的质量,我们就必须进行重构组件化是指解耦复杂系统时将多个功能模块拆分,重组的过程。在Android工程上表现上就是把app按照其业务的不同,划分为不同的Module组件化和单一模块项目结构对比。
2023-11-27 09:32:14
114
转载 kill进程的几种方式
我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。,这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。命令:pid of xx进程,显示进程的进程号,同上pgrep。这是 kill 命令最主要的用法,也是本文要介绍的内容。
2023-10-18 10:28:58
3347
原创 Android SELinux
宏,将domain域和(hal_xxx_client )属性关联,system_server作为Hal服务客户端示例:hal_client_domain(system_server, hal_foo)宏,将domain域和(hal_xxx_server )属性关联,A HAL server关联域示例:hal_server_domain(my_hal_domain, hal_foo)示例,hal服务服务端属性。
2023-09-11 15:33:38
1294
转载 【无标题】
IDA全称是交互式反汇编器专业版,人们其简称为IDA,IDA pro 是业界最成熟、先进的反汇编工具之一,是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器!IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。根据选择的文件,ida将显示外一个或多个对话框,再选择特定的文件分析选项。然后加载,分析并显示。
2023-09-06 11:04:33
253
原创 C++ 宏定义打印日志
该类提供了 `addTask` 方法以添加任务队列,并使用条件变量 `cond_` 唤醒空闲线程来执行任务。在宏定义中,使用线程池的 `ThreadPoo::addTask` 方法来将任务加入任务队列中。为了解决这个问题,可以考虑使用线程池来重用线程,减少创建和销毁线程的开销。线程池可以通过预先创建一定数量的线程,并维护一个任务队列来实现。当需要执行任务时,先将任务加入队列,然后由线程池内的线程来执行。使用线程来延迟日志输出的做法可以避免当前线程暂停,但也会带来线程频繁创建与销毁的问题。
2023-09-05 15:33:46
709
原创 动态规划解题示例
自顶向下则是从最大的问题开始逐步拆解成小问题,直到求解最小子问题的解。确定状态:在动态规划问题中,状态一般就是我们需要优化的问题中的变量。现在要从这些物品中选择若干个放入背包,使得背包中物品的总重量不超过指定重量,同时背包中物品的总价值最大。确定边界条件:边界条件是指动态规划问题中最小子问题的解,也就是动态规划过程中需要初始化的值。最后,问题的解就是 $f(n,W)$,其中 $n$ 表示物品数量,$W$ 表示背包容量。求解问题:根据求解顺序和状态转移方程,计算所有可能状态的值,最终得到问题的最优解。
2023-08-26 11:42:31
173
原创 Leetcode刷题基础C++
Vector C++容器vector的数组片段截取操作_c++ vector 截取_stitching的博客-优快云博客 size() Map C++STL之map详解_c++stl map_行码棋的博客-优快云博客 size() emplace() map value最大值 C++-map:获取map中value最大值、最小值对应的键值对_c++找到map中最大的value_u013250861的博客-优快云博客
2023-08-26 11:39:40
122
原创 Leetcode解题方法
自顶向下则是从最大的问题开始逐步拆解成小问题,直到求解最小子问题的解。确定状态:在动态规划问题中,状态一般就是我们需要优化的问题中的变量。现在要从这些物品中选择若干个放入背包,使得背包中物品的总重量不超过指定重量,同时背包中物品的总价值最大。确定边界条件:边界条件是指动态规划问题中最小子问题的解,也就是动态规划过程中需要初始化的值。最后,问题的解就是 $f(n,W)$,其中 $n$ 表示物品数量,$W$ 表示背包容量。求解问题:根据求解顺序和状态转移方程,计算所有可能状态的值,最终得到问题的最优解。
2023-08-25 09:30:00
94
原创 Python基础
容器在编程中也叫数据结构,这里展示了几种常用的数据结构(collections集合是python内置的模块)。什么是包:为了避免模块名称冲突,python引入按目录组织模块的方法,称之为包,简单来说,包就是将多个模块用文件夹分方式组织在一起。x in s:判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False。s.pop() :在交互模式,pop 是删除集合的第一个元素(排序后的集合的第一个元素)示例:将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
2023-08-24 09:06:14
101
原创 TFLite模型文件转C语言文件
TFLite本身就是一个二进制文件,可以直接打包成C语言的unsigned char类型数组,由于文件比较大一个一个读写到数组里太麻烦了,我们可以直接在Linux下使用xxd命令,通过apt可以直接安装。就可以看到当前目录下有一个model.h的文件,并且里面自动生成了unsigned char数组与长度变量,数组里保存了所有二进制数据,可以直接调用。因为我们是最小RTOS,所以我们可以直接把这个.h的模型文件包含到我们的程序中就可以通过Tensor FLow提供的一些接口加载使用了。
2023-08-11 15:27:04
761
原创 Kotlin语法
loginButton.setOnClickListener {//函数动作}匿名函数定义在{}里,a,b入参,->表示转向,返回a+b。(2,3 方式避免管理null,少加?表达式返回值为条件句中最后一个表达式值。未初始化就使用会Kotlin 会抛出。自定义属性引用方式(get set)后面是高阶函数,函数中回调函数。var定义可变变量,可修改。无参的匿名函数形式为{}
2023-08-09 20:17:11
901
原创 AIDL & Binder机制和原理
而该Bp客户端的实例化流程,首先会先通过Parcel的readStrongBinder实例化一个BpBinder,然后一般会通过调用对应接口类中的asInterface方法将BpBinder转化为一个真正的Bp接口客户端,其实这个转化就是实例化一个Bp客户端,实例化时,会将BpBinder作为构造传参传入Bp客户端中。在C++层面的Binder相关类中,所谓的Bn端就是Binder的服务端,在此例中,Cameraservice的Bn端,显然就是之前AIDL自动生成的BnCameraService。
2023-07-04 10:30:00
1442
转载 UML类图绘制
五分钟读懂UML类图平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧:一、类的属性的表示方式在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modify...
2018-12-06 13:57:28
2629
2
转载 python 常用模块
常用模块一、什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块二、为何要使...
2018-11-08 13:46:57
343
原创 LUA模块声明及调用
模块声明一:module(...,package.seeall)分析:模块中module函数中以...为模块名,可动态转换成父模块require调用lua模块名。此时不需要另外指定模块名,避免了更换模块名带来的修改。并且模块中的全局变量和函数不需要另外加上模块名前缀。模块声明二:testmodule.lualocal M={ gValue1 = "value1", gValue2="v...
2018-07-04 20:07:47
1999
转载 LUA 模式匹配
随笔 - 64 文章 - 0 评论 - 57Lua模式匹配模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmatch(返回查找到字符串的迭代器)这些函数
2017-12-19 09:35:21
480
转载 linux 下各errno的意义
strerror(errno):获取errno对应的错误/****************************获取错误代码描述**************/#include /* for strerror */#include #include int main(int argc, char ** argv) { int i =
2017-12-01 15:07:27
384
转载 Lua 正则表达式 匹配
. 任意字符%s 空白符%p 标点字符%c 控制字符%d 数字%x 十六进制数字%z 代表0的字符%a 字母%l 小写字母%u 大写字母%w 字母和数字上面字符类的大写形式表示小写所代表的集合的补集。例如,'%A'非字母的字符:模式修饰符+ 匹配前一字符1次或多次* 匹配前一字符0次或多次;最长匹配 -- 先尽可能长地把本次匹配模式走完
2017-12-01 14:10:18
8326
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人