Tinker热修复框架详解:Android应用补丁生成,提升应用稳定性
Tinker 是腾讯开源的Android热修复框架,通过动态更新和修复应用中的代码、资源和本地库文件,无需用户重新安装 APK,便可以及时修复应用中的 bug,优化用户体验。
下面是Tinker在Android项目中的详细用法,结合Kotlin 代码示例,介绍如何在项目中集成 Tinker实现热修复。主要包括:集成 Tinker、生成补丁、下载补丁并应用补丁。
一、 在项目中集成 Tinker
首先,确保在项目中已经正确引入 Tinker库。
1.1 添加 Tinker依赖
项目级 build.gradle
中添加 Tinker插件依赖:
buildscript {repositories {maven { url 'https://jitpack.io' }}dependencies {classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.9.14.14' // Tinker插件}
}
应用级 build.gradle
中应用 Tinker插件,并添加相关的库依赖:
apply plugin: 'com.android.application'
apply plugin: 'com.tencent.tinker.patch'android {compileSdkVersion 30defaultConfig {applicationId "com.example.myapp"minSdkVersion 21targetSdkVersion 30versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}Tinker{// 配置修复时需要保留的 dex 文件defaultConfig {keepDexList = ['classes.dex']}}
}dependencies {implementation 'com.tencent.tinker:tinker-android-lib:1.9.14.14' // Tinker库
}
二、生成补丁包
2.1 修改代码并生成补丁包
在应用中修复 bug 后,使用 Tinker生成补丁包,步骤如下:
1.首先构建 Release APK(包含修复的代码):
./gradlew clean assembleRelease
2.生成补丁包:
在应用修改后,执行以下命令来生成补丁包:
./gradlew tinkerPatchRelease
生成的补丁包会放在 build/outputs/patch/
目录下。
2.2 补丁包内容
补丁包包含以下几种文件:
dex:修复的 Java 类文件。
so:修复的 C/C++ 本地库文件。
资源:修复的资源文件,如图片、布局等。
三、下载和应用补丁
3.1 下载补丁包
补丁包生成后,上传到自己的服务器,用户的设备可以通过网络下载补丁包。
可以使用OkHttp、Retrofit等库下载补丁包,以下是OkHttp的下载示例。
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.File
import java.io.FileOutputStream
import java.io.InputStreamclass PatchDownloadManager {private val client = OkHttpClient()fun downloadPatch(patchUrl: String, destFile: File) {val request = Request.Builder().url(patchUrl).build()val response: Response = client.newCall(request).execute()val inputStream: InputStream = response.body?.byteStream() ?: returnval outputStream = FileOutputStream(destFile)inputStream.copyTo(outputStream)inputStream.close()outputStream.close()println("补丁下载完成: ${destFile.absolutePath}")}
}
此代码会下载补丁包并保存到设备的指定目录。
3.2 应用补丁
下载补丁后,需要在应用中应用它。Tinker提供了 TinkerInstaller.onReceiveUpgradePatch()
方法来加载补丁。
import com.tencent.tinker.lib.tinker.TinkerInstaller
import android.content.Contextclass PatchManager(private val context: Context) {fun applyPatch(patchFilePath: String) {try {// 应用下载的补丁TinkerInstaller.onReceiveUpgradePatch(context, patchFilePath)println("补丁应用成功")} catch (e: Exception) {println("补丁应用失败: ${e.message}")}}
}
3.3 启动时检查补丁并应用
通常,你会在应用启动时检查是否有补丁需要下载并应用。可以在 Application
类或 MainActivity
中进行补丁检查。
import android.app.Application
import android.os.Bundle
import com.tencent.tinker.lib.tinker.TinkerInstallerclass MyApplication : Application() {override fun onCreate() {super.onCreate()// 初始化 TinkerTinkerInstaller.install(this)// 检查并应用补丁checkAndApplyPatch()}private fun checkAndApplyPatch() {// 假设我们从服务器获取到了补丁的下载链接val patchUrl = "https://example.com/patch.apk"val patchFile = File(applicationContext.cacheDir, "patch.apk")val patchDownloadManager = PatchDownloadManager()patchDownloadManager.downloadPatch(patchUrl, patchFile)// 下载完成后应用补丁val patchManager = PatchManager(applicationContext)patchManager.applyPatch(patchFile.absolutePath)}
}
四、测试与调试
调试日志:Tinker会输出详细的调试日志,可以通过Logcat来查看应用是否成功加载补丁。
验证补丁:你可以通过检查应用中的更新内容,确保补丁已被正确应用。例如,检查修复的 bug 是否已经消失。
五、注意事项
版本控制:需要对每个补丁包进行版本控制,确保补丁包的兼容性和顺序性。
应用稳定性:热修复增加了应用的复杂度,开发者需要确保补丁的稳定性和兼容性,避免引入新的 bug。
支持库和工具:在使用 Tinker时,最好配合Proguard或R8来混淆代码,防止代码泄漏。同时,要确保 Tinker支持的Android版本和设备类型。
六、总结
通过以上步骤,你可以成功集成Tinker热修复框架到你的Android应用中,并利用它实现应用的动态更新。Tinker不仅可以修复代码中的 Bug,还可以进行资源、so 库等的热更新,从而避免频繁发布新的 APK 给用户带来的麻烦。
Tinker热修复的优缺点
Tinker是腾讯开源的Android热修复框架,通过动态更新 和修复 应用中的代码、资源和本地库文件,无需用户重新安装 APK,便可以及时修复应用中的 bug,优化用户体验。以下是 Tinker的优缺点:
优点:
1.增量更新:
- Tinker使用增量式补丁方式更新,只会更新修改过的部分(如修复的 Java 类、资源文件、so 库等),避免了每次更新整个 APK,节省了流量和用户的下载时间。
- 补丁包相对较小,大大减少了用户下载负担。
2.无需用户干预:
- 用户不需要手动下载和安装更新。Tinker会自动下载补丁包并在应用运行时动态应用更新,保持用户体验的流畅性。
3.灵活的修复能力:
- Tinker支持修复 Java 层的
Dex
文件、资源文件(如布局、图片等)和本地库(so
文件)。 - 通过修改部分代码和资源,可以快速修复 bug 或发布新功能。
4.开发者友好:
- Tinker提供了详细的文档和工具,支持生成增量补丁,开发者可以通过简单的命令生成补丁包。
- 支持与AndroidStudio 配合使用,简化了集成过程。
5.强大的兼容性:
- Tinker可以支持多种Android设备和系统版本,可以确保在不同的设备上稳定运行,适应性强。
6.开源与社区支持:
- Tinker是一个开源项目,开发者可以在 GitHub 上查看源代码并根据需求进行定制化修改。
- 作为一个成熟的热修复框架,Tinker拥有大量的开发者社区支持,开发者可以快速获得问题解答和帮助。
缺点:
1.增加应用复杂性:
- 集成 Tinker后,开发者需要管理补丁包的版本和兼容性问题,增加了开发和维护的复杂性。
- 热修复的引入意味着开发者要额外关注补丁的兼容性,避免因为错误的补丁导致应用崩溃。
2.对本地库的支持有限:
- 尽管 Tinker支持对
so
文件的热修复,但它并不完全支持对所有类型的本地库进行无缝更新。 - 某些复杂的 C/C++ 代码修改可能无法通过热修复简单的
so
库更新来完成。
3.性能开销:
- Tinker在运行时会加载补丁包,可能会稍微影响启动速度或者应用性能,特别是当补丁包较大时,补丁加载过程可能会稍有延迟。
- 如果应用中有大量的补丁包,可能会影响应用的启动速度和性能。
4.补丁文件版本控制问题:
- 在使用过程中,如何确保补丁包的版本控制、依赖关系及补丁的顺序性是一个挑战。
- 如果补丁包存在顺序问题或者版本不匹配,可能会导致补丁加载失败或引发其他崩溃问题。
5.不支持完全的原子性:
- Tinker在修复时并不完全支持原子性操作。即使热修复不会立即生效,旧版本的代码仍然在执行,可能会出现部分功能恢复或不稳定的情况。
与其他Android热修复插件对比
除了 Tinker,市场上还有其他流行的热修复框架,如Sophix(阿里巴巴推出)、AndFix、RePlugin 等。每个框架都有其优缺点,以下是与Tinker对比的优势和劣势:
1. Tinker vs Sophix(阿里巴巴)
-Sophix 优势:
- Sophix 提供了更强大的资源修复能力,可以热修复布局文件和图片等资源。
- 在热修复过程中,Sophix 的补丁包体积相对较小,并且采用了高效的增量更新策略。
- Sophix 具有强大的监控、回滚和统计功能,可以帮助开发者管理和追踪补丁的状态。
-Tinker优势:
- Tinker是一个成熟的开源项目,具有较长的开发历史,社区支持丰富。
- Tinker具有更强的灵活性,支持更广泛的修改内容,包括 Dex、资源和
so
文件。 - Tinker对热修复流程有较完善的支持,包括生成、发布和管理补丁的工具。
-对比:
-易用性:Tinker相对而言较为复杂,需要开发者更多的操作步骤,而 Sophix 提供了更多的自动化配置和管理工具,容易上手。
-稳定性和功能性:Tinker在功能上较为全面,适用于更多场景,Sophix 在资源修复上表现更好。
2. Tinker vs AndFix
-AndFix 优势:
- AndFix 也支持修复 Java 层的代码,通过增量修复的方式快速解决 bug,配置和使用相对简单。
- 由于其轻量级的设计,AndFix 对应用性能的影响较小。
-Tinker优势:
- Tinker支持更多类型的修复(Dex、资源、so),适用场景广泛。
- Tinker更适合大型项目,支持更强大的补丁生成和管理功能。
-对比:
-功能:Tinker在功能上比 AndFix 更全面,支持的修复类型更广泛,适合功能复杂的应用。
-性能:AndFix 因为设计简洁,性能开销更小,适用于较为简单的项目。
3. Tinker vs RePlugin
-RePlugin 优势:
- RePlugin 更专注于插件化和动态加载应用模块,适用于大规模的模块化管理和热修复场景。
- 它能够通过插件化的方式对单独模块进行热更新,提供了灵活的插件管理方案。
-Tinker优势:
- Tinker更专注于热修复,适用于修复代码和资源问题,支持的功能更为广泛。
- RePlugin 更适合于模块化管理的场景,而 Tinker更适合于修复单个应用中出现的问题。
-对比:
-应用场景:Tinker更适合传统的热修复场景,RePlugin 更适合基于插件化架构的应用。
-功能:Tinker提供更多的修复能力,RePlugin 侧重于模块化插件管理。
接入 Tinker对用户体验的影响
接入 Tinker后,用户的体验通常有以下几方面的表现:
1.无缝修复Bug:
- 用户不需要重新安装 APK,应用会自动获取补丁包并应用修复。Bug 修复通常是即时的,用户可以在不打扰的情况下继续使用应用。
- 比如,应用启动时发现存在 bug,会在后台自动修复,修复完成后用户不会察觉到任何操作,只是应用变得更加稳定。
2.减轻更新负担:
- 通过补丁包更新,用户无需下载整个应用 APK,只需下载修复的增量包。对于用户来说,下载和更新的速度更快,节省了流量。
- 更新内容是增量的,因此不会影响用户的原有应用体验,减少了更新的等待时间。
3.提升应用稳定性:
- 通过热修复,应用能够快速修复崩溃、ANR 等问题,提升应用的稳定性和用户满意度。
- 即使应用出现了某些故障,开发者也能通过热修复及时修复,避免频繁发布新版本,用户体验更加流畅。
4.可能的性能影响:
- 虽然 Tinker会增量更新并动态加载补丁,但在某些情况下,加载补丁的过程可能会稍微影响应用的启动速度,特别是在补丁较大的情况下。
- 如果补丁更新过于频繁或补丁包过大,可能会增加用户的等待时间,影响用户体验。
Tinker作为一种强大的Android热修复框架,具有许多优势,如增量更新、无需用户干预、灵活的修复能力等。然而,它也存在一些不足之处,例如性能开销、复杂性增加等。在选择热修复框架时,需要根据应用的规模、需求以及开发者的实际情况来进行选择。同时,Tinker在应用中的使用,会为用户带来更加稳定和流畅的体验,尤其是在解决 bug 和更新时表现出色
相关文章:
Tinker热修复框架详解:Android应用补丁生成,提升应用稳定性
Tinker 是腾讯开源的Android热修复框架,通过动态更新和修复应用中的代码、资源和本地库文件,无需用户重新安装 APK,便可以及时修复应用中的 bug,优化用户体验。 下面是Tinker在Android项目中的详细用法,结合Kotlin 代…...
手写—— netty 实现 rabbitMq客户端
要使用 Netty 实现一个 RabbitMQ 客户端,你可以将 RabbitMQ 协议封装在 Netty 中,通过自定义编码和解码来实现与 RabbitMQ 的通信。RabbitMQ 使用 AMQP (Advanced Message Queuing Protocol) 协议,因此我们需要创建合适的协议封装和处理逻辑。…...
调用高德地图天气查询api
之前使用的api一直用不了,才发现web端类型的没有天气查询功能 web服务才有 然后在linux的环境变量中配置一下 发现linux中配的环境变量不行,于是给输入amap_weather给的字典明文token。 # 选用RolePlay 配置agent from modelscope_agent.agents.role_p…...
【Vulkan入门】03-创建Device
目录 先叨叨git信息关键代码VulkanEnv::CreateDevice() 编译并运行程序题外话 先叨叨 在上篇已经选择了一个合适的PhysicalDevice。 本篇要为这个PhysicalDevice创将一个Device。Device可以理解为APP与PhysicalDevice之间的代理。 所有APP与PhysicalDevice之间交互的资源都通过…...
【Axios】如何在Vue中使用Axios请求拦截器
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
query did not return a unique result: 2;
文章目录 错误原因分析关键位置可能原因解决方法1. 检查数据库数据2. 修改查询方法3. 限定查询返回唯一结果4. 检查业务逻辑 总结 1、LoginLogRepository2、LoginLogService3、LoginLogApiService4、MyAuthenticationSuccessHandler 微信小程序开发者工具控制台报错 {"tim…...
PHP升级
PHP升级CentOs8 wget http://rpms.famillecollet.com/enterprise/remi-release-8.rpm rpm -ivh remi-release-8.rpm --nodeps --force rpm -qa | grep remi dnf module list php dnf module enable php:remi-7.4首先,重置当前的 PHP 模块,以便清理所有已…...
C++设计模式(原型、代理、适配器、组合)
一、原型模式 1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式允许通过复制现有的对象来创建新对象,而不是通过实例化类来创建。这种方式可以避免创建重复的对象,从而提高性能和降低内存消耗。 2.组成 …...
超详细搭建PhpStorm+PhpStudy开发环境
刚开始接触PHP开发,搭建开发环境是第一步,网上下载PhpStorm和PhpStudy软件,怎样安装和激活就不详细说了,我们重点来看一看怎样搭配这两个开发环境。 前提:现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...
Axure RP在智慧农场可视化大屏系统设计中的应用
随着科技的飞速发展,智慧农业已成为现代农业的重要发展方向。智慧农场可视化大屏系统作为智慧农业的重要组成部分,正逐步成为农场管理、决策和展示的核心工具。Axure RP,作为一款强大的原型设计工具,其在智慧农场可视化大屏系统的…...
《嵌入式硬件设计》
一、引言 嵌入式系统在现代科技中占据着至关重要的地位,广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础,直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面ÿ…...
【C语言篇】C 语言总复习(上):点亮编程思维,穿越代码的浩瀚星河
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 在计算机科学的广袤宇宙中,C语言犹如一颗璀璨的恒星,散发着持久而耀眼的光芒。它作为一种基础且强大的编程语言,承载…...
多线程——04
本节目标 1. wait 和 notify 方法 2. 代码案例 1. wait 和 notify 方法 1. 方法使用 多个线程的执行顺序本身是随机的(抢占式执行) wait —— 让指定线程进入阻塞状态 notify —— 唤醒对应的阻塞状态的线程 注意: wait, notify, notifyAl…...
使用ECS和OSS搭建个人网盘
在linux服务器 一、下载cloudreve安装包。 执行如下命令,下载cloudreve安装包。 wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/cloudreve_3.3.1_linux_amd64.tar.gz 下载完毕后,执行如下命令,解压cloudreve安装包。 tar -zxvf c…...
Android 单元测试断言校验方法 org.junit.Assert
判断布尔值 assertTrue assertFalse 判断对象非空 assertNull(object); 案例: PersistableBundle result Util.getCarrierConfig(mockContext, subId);assertNull(result); 判断是否相等 assertEquals("mocked_string", result.toString()); package or…...
SpringSecurity学习
介绍 SpringSecurity是一个作用于身份认证和权限控制的框架,其针对的主要就是网站的安全问题 页面代码 要使用SpringSecurity的前提是有一个可以正常访问业务逻辑的代码,再使用SpringSecurity实现权限控制和身份验证。 后端代码 package com.learn.…...
Eureka和Zookeeper、Nacos的区别
目录 一、Eureka与Zookeeper的区别 适用场景: 架构设计: 功能特性: 社区生态: 二、Eureka与Nacos的区别 接口方式: 实例类型: 健康检测: 服务发现: 一致性与可用性&#…...
基于gitlab API刷新MR的commit的指定status
场景介绍 自己部署的gitlab Jenkins,并已经设置好联动(如何设置可以在网上很容易搜到)每个MergeRequest都可以触发多个Jenkins pipeline,pipeline结束后会将状态更新到gitlab这个MR上希望可以跳过pipeline运行,直接将指定的MR的指定pipeline状态刷新为…...
SpringBoot | 拦截器 | 统一数据返回格式 | 统一异常处理 | 适配器模式
拦截器 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码. 也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户请求前阻止其执行. 在拦截器当中,开发人员可以在…...
Oracle清除水位
– 清除水位 ALTER TABLE 数据库名.表名 ENABLE ROW MOVEMENT; ALTER TABLE 数据库名.表名 SHRINK SPACE CASCADE; ALTER TABLE 数据库名.表名 DISABLE ROW MOVEMENT; – 回收统计信息 BEGIN DBMS_STATS.GATHER_TABLE_STATS(OWNNAME > ‘数据库名’, TABNAME > ‘表名’…...
软件工程——期末复习(2)
Part1:软件工程基本概念 软件程序文档数据 在软件工程中,软件通常被定为程序、文档和数据的集合。程序是按事先设计的功能和性能要求编写的指令序列;程序是完成指定功能的一段特定语言代码。文档是描述程序操作和使用的文档,是与…...
RAID1技术是什么?它的发展和工作原理如何?
RIAD1是一种先进的数据存储与冗余技术,设计用于解决现代分布式系统中常见的数据安全、数据一致性和高可用性等问题。随着云计算和大规模分布式存储系统的兴起,如何保障数据在高效传输与存储过程中仍然能具备足够的安全性和可靠性,成为了各大企…...
【Apache Paimon】-- 8 -- flink 创建 paimon connecor 的两种方式
目录 1、使用 catalog 创建非临时表 2、使用 with 创建 temporary 表 3、对比 4、参考 1、使用 catalog 创建非临时表 CREATE CATALOG my_catalog WITH (type = paimon,warehouse = hdfs:///path/to/warehouse );USE CATALOG my_catalog; CREATE TABLE `<your-paimon-…...
js进阶-关于运算符++
一、运算符与表达式 运算符按参与的运算单元数量分为:一元运算符、二元运算符和三元运算符;表达式是运算单元和运算符一起构成的;每个表达式都有一个运算后的返回值。 二、关于运算符 1.概述 运算符分为两部分,第一部分是返回运…...
三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
绘图工具 三维地图:Cesiumjs 建模方式:激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具:C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...
通过EPEL 仓库,在 CentOS 7 上安装 OpenResty
通过EPEL 仓库,在 CentOS 7 上安装 OpenResty 通过EPEL 仓库,在 CentOS 7 上安装 OpenResty步骤 1: 安装 EPEL 仓库步骤 2: 安装 OpenResty步骤 3: 启动 OpenResty步骤 4: 设置开机自启步骤 5: 验证安装说明 通过EPEL 仓库,在 CentOS 7 上安装…...
每日一题 LCR 054. 把二叉搜索树转换为累加树
LCR 054. 把二叉搜索树转换为累加树 使用后序遍历即可 class Solution { public:TreeNode* convertBST(TreeNode* root) {int temp 0;dfs(root,temp);return root;}void dfs(TreeNode* root,int &temp){if(!root){return ;}dfs(root->right,temp);temp root->val;…...
【贪心算法】贪心算法五
贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.跳跃游戏 II 题目链接&…...
vue2播放视频和预览文件的组件以及使用方法
##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…...
记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009
项目是个老项目,依赖包也比较大,咱就按正常流程走一遍来详细解决这个问题,先看一下node版本,我用的是nvm管理的,详细可以看我的其他文章 友情提醒:如果项目比较老,包又大,又有一些需…...
【批处理脚本】更改Windows系统中的 hosts 解析文件
概述 作用 修改 Windows 系统中的 hosts 文件,可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行,将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景: 屏蔽网站、域名重定向、DNS 污染防…...
AIGC 与艺术创作:变革与机遇
在当今数字化时代,人工智能生成内容(AIGC)正以惊人的速度重塑着艺术创作的格局,为艺术家们带来了令人振奋的新机遇。 一.AIGC 的崛起与艺术领域的变革 随着人工智能技术的不断进步,AIGC 逐渐在艺术领域崭露头角。它依…...
String IP和Int IP的互相转换
android中,wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址,但这是一个int值,如何转换为常见的如192.168.1.129这种形式,以及这种形式如何转换回int值的形式。 这里ip分为4段,每一段的值都是0 ~ 255&am…...
【大数据学习 | 面经】yarn的资源申请和分配的单位-Container
在yarn中,资源的申请和分配是以container为单位进行的,而不是直接以application和task为单位。 每个提交到yarn上的应用程序(application)都有一个对应的ApplicationMaster(AM)。这个AM负责与ResourceMana…...
php基础:文件处理2
1.文件属性 当我们在程序中操作文件时,可能会使用到文件的一些常见属性,比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数,如下表所示。 2.目录操作 新建目录:mkdir(路…...
gradle下载慢解决方案2024 /12 /1android studio (Windows环境)
gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...
使用Java将PDF文件解析成Excel文件
安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…...
怎么区分直线模组中的导程和行程?
直线模组是一种直线传动装置,安装方便,精度高,其使用范围广。直线模组中的导程和行程是两个不同的概念,它们分别描述了直线模组的不同性能参数。 直线模组的行程指的是模组能够正常移动的最大距离,即滑块预期移动的有效…...
算法日记 42 day 图论
今天来看看广度优先搜索,并且写几个题。刷到这里我才想起来,当时第一次面试的时候问的就是这个题,当时大概知道一点思路,但不清楚是图论方面的,更别说写出来了。 广度优先搜索(BFS) 不同于深度…...
STM32 GPIO 8种工作模式的应用场景
目录 一、四种输入模式1、模拟输入:2、浮空输入:3、上拉输入:4、下拉输入: 二、四种输出模式1、推挽输出:2、开漏输出:3、复用推挽输出:4、复用开漏输出: 一、四种输入模式 1、模拟…...
JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?
类加载器分类 大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。 先回顾下,在 Java 中,类的初始化分为几个阶段: 加载、链接(包括验证、准备和解析)和 初始化。 而 类加载器&#x…...
揭秘:短视频矩阵源码功能开发分析!!!
一、短视频矩阵系统源码概述 短视频矩阵系统源码旨在为内容创作者及企业提供一种高效的工具,以实现对多个短视频账户的一站式管理。该系统支持同时管理、发布、监控和优化多达1000个短视频账户,显著提升了操作效率。 二、主要功能 1. 多账号管理 该系…...
leetcode - 2337. Move Pieces to Obtain a String
Description You are given two strings start and target, both of length n. Each string consists only of the characters ‘L’, ‘R’, and ‘_’ where: The characters ‘L’ and ‘R’ represent pieces, where a piece ‘L’ can move to the left only if there i…...
第九篇:k8s 通过helm发布应用
什么是helm? Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 在红帽系的Linux中我们使用yum来管理RPM包,类似的,在K8s中我们可以使用helm来管理资源对象(Deployment、Service、Ingress…...
MySQL:锁机制
锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效…...
在lio_sam中融入GPS
文章目录 概要GPS里程计GPS因子反算后的GPS里程计概要 在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。 GPS里程计 利用GeographicLib第三方库将经纬度投影到局部笛…...
快速构建NLP理论知识体系
NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板,NLP可以通过现成的模型对输入的语音、文字、图片进行处理(分词、标词性、去停…...
长期稳定境外号码解决方案:内地用户如何打电话、接收短信和验证码
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 三大方案对比 📒📝 免费且稳定的境外号码📝 长期稳定且符合本地政策📝 适合低频使用者⚓️ 相关链接 ⚓️📖 介绍 📖 许多用户在日常生活中需要拨打境外电话、接收短信或验证码,尤其是跨境电商从业者,更是对境外号…...
SpringCloud 与 SpringBoot版本对应关系,以及maven,jdk
目录 SpringCloud 与 SpringBoot各版本的对应关系 方式一 Learn 方式二 OverView SpringBoot与JDK、maven 容器等对应关系 SpringCloud 与 SpringBoot各版本的对应关系 SpringCloudSpringBootFinchley2.0.xFinchley.SR1Spring Boot >=2.0.3.RELEASE and <=2.0.9RELEAS…...
FSMC实验
FSMC ,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM 、 NAND FLASH 、 NOR FLASH 和 PSRAM 等存储器。 从上图我们可以看出, STM32 的 FSMC 将外部设…...