Android开发必备:JAR转DEX工具dx与d8深度解析与实践指南
1. 项目概述从JAR到DEX的桥梁搭建在Android开发的日常里尤其是涉及到插件化、热修复或者需要动态加载代码的场景我们经常会遇到一个核心需求如何将一个标准的Java归档文件JAR转换成Android运行时ART或Dalvik能够识别和执行的Dalvik可执行文件DEX。这听起来像是编译链后端的一个黑盒操作但理解并掌握它能让你在解决依赖冲突、进行底层调试或构建自己的模块化框架时拥有更强的掌控力。dx和d8这两个工具就是完成这项转换工作的核心“编译器”。简单来说这个过程就是将基于Java字节码.class文件打包而成的JAR包翻译成Android系统专属的指令集格式。早期的Android SDK主要依赖dx工具它伴随着SDK诞生稳定但略显陈旧。而d8则是Google在Android Studio 3.1之后力推的新一代DEX编译器它被集成在androidx的构建工具链中速度更快产生的DEX文件更优化并且是未来构建系统的默认选择。很多朋友在集成第三方SDK、处理遗留库或者自己动手封装工具库时都会直接或间接地用到它们。如果你曾对ClassNotFoundException或NoClassDefFoundError感到头疼并怀疑是不是DEX转换出了问题那么深入理解这个过程就是解开谜团的关键。2. 核心工具解析dx与d8的演进与抉择2.1 dx工具经典的奠基者dxDalvik eXchange是Android SDK中历史最悠久的DEX编译工具。它的核心职责非常明确读取一组Java类文件.class将它们合并、优化并转换成一个或多个.dex文件。在Android构建流程的早期javac将.java源文件编译成.class文件后就由dx接手后续的所有工作。它的工作方式相对直接。你可以在命令行中找到它通常位于SDK的build-tools/{版本号}/目录下。一个最基本的转换命令看起来是这样的dx --dex --outputclasses.dex input.jar这条命令告诉dx以input.jar作为输入启用DEX转换--dex并将输出结果保存到classes.dex文件中。dx会解压JAR包处理其中的所有.class文件进行常量池合并、方法索引优化等操作最终生成DEX格式的字节码。注意使用dx时一个需要特别留意的限制是“64K引用限制”。由于DEX文件格式的设计单个DEX文件中包含的方法、字段、类的引用总数不能超过65536个。对于大型应用或引入了庞大第三方库的项目很容易触发这个限制这时就需要启用dx的--multi-dex选项来生成多个DEX文件。dx的优点是极其稳定与旧版本构建系统的兼容性最好。但其缺点也显而易见编译速度相对较慢并且生成的代码优化程度不如后来的d8。2.2 d8工具高效的继任者d8的出现是为了解决dx在性能和输出优化上的瓶颈。它被设计为更快速、更智能的DEX编译器。从实现上看d8是用Java重写的它直接集成在Android Gradle插件AGP中成为了默认的DEX编译器。你可以在build-tools目录的相同位置找到它或者通过Gradle任务间接调用。一个典型的d8命令行转换示例如下d8 --release --lib android.jar --output . input.jar这里的--lib参数至关重要它指定了Android平台的核心库android.jar因为JAR包中的类可能会引用Android SDK中的类如Activity、Context。d8需要这些引用信息来完成正确的编译和链接。--release标志表示启用所有优化。与dx相比d8的核心优势有三点。第一是编译速度尤其是在增量编译和大型项目上提升非常明显。第二是更积极的代码优化例如更智能的代码收缩、内联和死代码消除这有助于减小最终APK的体积。第三是它对Java 8语言特性如Lambda表达式提供了原生支持而dx需要借助脱糖desugar这一额外步骤来处理。2.3 工具选型背后的逻辑那么在实际操作中该如何选择这个决策背后有几个关键考量。如果你的项目使用的是较旧的Android Gradle插件例如3.0.x或更早或者你需要与一个极其依赖旧版构建流程的遗留系统集成那么坚持使用dx可能是最稳妥的选择可以避免兼容性风险。然而对于绝大多数现代Android项目尤其是使用Android Studio 3.1及以上版本和AGP 3.1.0的项目强烈建议使用d8。它不仅速度更快还能自动带来APK体积的优化。Gradle在构建时已经默认启用了d8。你可以在项目的gradle.properties文件中看到或设置android.enableD8true。即使你需要手动调用命令行工具从未来维护性和性能收益的角度看投入时间学习并使用d8也是更明智的投资。我个人在迁移旧构建脚本时的体会是从dx切换到d8可能会暴露一些之前被隐藏的依赖问题比如某些类路径配置不完整。这看似是麻烦实则是好事它迫使你的构建配置变得更加规范和健壮。3. 实操流程详解从命令行到集成构建3.1 环境准备与工具定位动手之前第一件事是确认你的开发环境中有可用的Android SDK。无论你用的是Android Studio还是其他IDESDK的路径通常是明确的。找到build-tools目录是关键因为dx和d8都位于其中。例如在macOS或Linux上路径可能类似于~/Android/Sdk/build-tools/30.0.3/。我建议将你常用版本的build-tools目录添加到系统的PATH环境变量中这样在任意位置都可以直接调用dx或d8会方便很多。接下来是准备输入JAR包。这个JAR可以是你自己项目模块通过jar命令或Gradle的jar任务打出来的也可以是任何需要集成到Android环境中的第三方库。一个常见的“坑”是确保你的JAR包是可用的、未损坏的。你可以先用jar tf your.jar命令列出其中的内容确认包含预期的.class文件而不是只有资源文件。3.2 使用dx进行转换的完整步骤假设我们有一个名为my-library.jar的库文件需要将其转换为classes.dex。以下是使用dx的详细步骤和解释。首先打开终端导航到JAR文件所在的目录。执行以下命令dx --dex --verbose --output./output/classes.dex my-library.jar我们来拆解这个命令--dex这是核心指令告诉dx执行DEX转换操作。--verbose启用详细输出模式。强烈建议在第一次转换或排查问题时加上这个参数。它会打印出正在处理的类、遇到的警告等信息是极佳的调试工具。--output./output/classes.dex指定输出路径和文件名。这里我创建了一个output文件夹来存放结果保持工作区整洁。my-library.jar输入的JAR文件。执行后如果成功你会在output目录下看到classes.dex文件。用file命令检查一下file output/classes.dex应该显示为Dalvik dex file version 035之类的信息。对于可能超过64K限制的大型库你需要生成多DEX文件dx --dex --multi-dex --output./output/ my-library.jar注意这里--output指定的是一个目录。dx会在这个目录下生成主DEX文件classes.dex以及后续的classes2.dex、classes3.dex等。--multi-dex选项会自动处理类分割的逻辑。3.3 使用d8进行转换的完整步骤使用d8的流程略有不同因为它对Android运行时环境的依赖更明确。一个完整的转换命令需要指定Android核心库。首先你需要找到当前编译目标所对应的android.jar。它位于SDK的platforms目录下例如~/Android/Sdk/platforms/android-30/android.jar。请确保这里的API级别android-30与你项目compileSdkVersion或目标设备兼容。然后执行d8命令d8 --release \ --lib ~/Android/Sdk/platforms/android-30/android.jar \ --classpath ./dependency1.jar:./dependency2.jar \ --output ./output/ \ my-library.jar命令参数解析--release启用所有优化适用于最终发布。如果是调试可以使用--debug优化较少便于调试。--lib这是d8命令中最容易出错的部分。必须提供正确的android.jar路径否则编译器无法解析像android.app.Activity这样的基础类引用会报“找不到类”的错误。--classpath如果你的my-library.jar依赖了其他的JAR包例如gson.jar必须通过--classpath将这些依赖的路径传递进来多个路径用:Linux/macOS或;Windows分隔。这模拟了编译时的类路径查找。--output指定输出目录。d8默认会在该目录下生成一个或多个DEX文件如果需要多DEX通常命名为classes.dex、classes2.dex等。转换成功后进入output目录你会看到生成的DEX文件。你可以使用dexdump工具同样在build-tools目录下来反汇编DEX文件查看其内容dexdump -d output/classes.dex | less。这对于进行底层验证或学习DEX结构非常有帮助。3.4 将转换集成到自动化构建中手动执行命令只适用于偶尔的测试。在实际项目中我们更希望这个过程是自动化的。这里给出一个在Gradle中自定义任务来集成d8的示例这比调用dx更符合现代构建流程。在你的模块级build.gradle.kts或build.gradle文件中添加如下任务tasks.registerExec(jarToDexWithD8) { group custom description Convert a JAR file to DEX using d8 // 定义输入输出 val inputJar file(libs/my-library.jar) val outputDir file($buildDir/generated/dex/) val androidJar files(android.bootClasspath).first { it.name android.jar } inputs.file(inputJar) outputs.dir(outputDir) // 配置执行命令 commandLine listOf( // 找到d8命令的路径这里是一种查找方式 android.sdkDirectory.resolve(build-tools).resolve(android.buildToolsVersion).resolve(d8).absolutePath, --release, --lib, androidJar.absolutePath, --output, outputDir.absolutePath, inputJar.absolutePath ) // 在执行前创建输出目录 doFirst { outputDir.mkdirs() } }这个任务的关键点在于自动发现路径通过android.bootClasspath动态查找当前项目使用的android.jar避免了硬编码路径提高了任务的可移植性。声明输入输出使用inputs.file和outputs.dir让Gradle能够进行增量构建。如果输入JAR没有变化任务会跳过执行提升构建速度。集成到构建链你可以通过dependsOn或finalizedBy将这个任务与其他标准Gradle任务如assemble挂钩实现全自动转换。然后在终端运行./gradlew jarToDexWithD8即可执行转换。这种方式将手动命令的灵活性与Gradle构建的自动化、可重复性完美结合。4. 深度原理与高级应用场景4.1 DEX文件格式浅析与转换本质理解转换工具在做什么需要稍微了解一下DEX文件。Java的.class文件遵循JVM规范每个类一个文件包含独立的常量池、方法表等。而Android的DEX文件是一种经过高度整合和优化的格式。它将所有输入类文件中的常量池合并成一个全局的常量池对所有类、方法、字段的引用进行统一索引。这种设计带来了两个直接好处一是显著减少了整体文件体积消除了大量重复的常量信息二是为Android运行时ART的快速解释执行或AOT编译优化提供了便利的数据结构。因此dx或d8的转换过程远不止是简单的“翻译”。它包含了以下关键步骤解析与索引读取所有输入类文件构建一个全局的符号表。字节码转换将JVM字节码指令集基于栈的操作转换为Dalvik字节码指令集基于寄存器的操作。这是两者最根本的差异。优化进行一系列优化如冗余代码消除、方法内联、常量传播等。d8在这一阶段比dx做得更深入。布局与写入按照DEX文件格式将优化后的类信息、方法代码、常量池等数据段写入到最终的.dex文件中。4.2 复杂依赖与类路径处理实战在实际操作中单纯的my-library.jar往往还依赖其他库。假设你的库依赖了Google的Gson那么转换命令必须将gson.jar包含在类路径中否则d8在遇到import com.google.gson.Gson;这样的语句时就会报编译错误。处理复杂依赖链的命令示例如下d8 --release \ --lib ~/Android/Sdk/platforms/android-30/android.jar \ --classpath ./libs/gson-2.8.9.jar:./libs/other-dependency.jar \ --min-api 21 \ --output ./output/ \ ./libs/my-library.jar这里引入了--min-api参数它指定了生成DEX文件所支持的最低Android API级别。这个参数会影响某些字节码特性的使用以及编译器进行的优化策略。例如针对API 21编译器可能会使用一些在新的ART运行时上更高效的指令模式。如果依赖关系非常复杂手动管理--classpath会变得很痛苦。这时更专业的做法是利用Gradle或Maven来解析依赖并生成完整的类路径。例如在Gradle脚本中你可以通过configurations.compileClasspath或configurations.runtimeClasspath来获取项目依赖的所有JAR文件集合然后将其拼接成字符串传递给d8命令。这确保了构建环境与开发环境的一致性。4.3 动态加载与插件化中的应用将JAR转换为DEX的一个高级应用场景是动态加载这是很多插件化框架的基础。核心思路是在应用运行时从网络或本地存储下载一个JAR或已转换好的DEX文件然后通过DexClassLoader将其加载到当前应用的类加载器中。流程通常是这样的准备阶段在服务器端或构建服务器上使用d8将插件代码一个JAR转换为DEX文件。下发与存储将DEX文件或包含DEX的JAR/APK下发给客户端保存在应用的私有目录下。动态加载在客户端创建DexClassLoader实例。File dexOutputDir context.getCodeCacheDir(); // 优化后的DEX存放目录 DexClassLoader classLoader new DexClassLoader( dexFilePath.getAbsolutePath(), // DEX文件路径 dexOutputDir.getAbsolutePath(), // 优化后输出目录 null, // 库文件路径通常为null parentClassLoader // 父类加载器一般是当前应用的类加载器 );反射调用通过classLoader.loadClass(“com.plugin.MainClass”)加载插件类然后反射调用其方法。在这个过程中使用d8生成优化过的、体积更小的DEX文件可以减少网络传输量和客户端的存储占用。同时确保转换时使用的--min-api与客户端设备的最低API级别匹配可以避免兼容性问题。4.4 代码混淆与资源收缩的联动在正式的发布构建中JAR到DEX的转换往往不是独立的一步而是与ProGuard或R8代码混淆、资源收缩shrink紧密结合的。R8实际上是整合了ProGuard的混淆、优化功能与d8的DEX编译功能。当你使用Android Gradle插件并启用minifyminifyEnabled true时构建流程大致如下所有项目代码和库依赖AAR/JAR被收集起来。R8首先对Java字节码进行整体分析执行代码混淆、优化和收缩移除未使用的类、方法、字段。经过混淆优化后的字节码再由集成在R8内部的d8编译器直接编译成DEX文件。因此如果你手动对一个已经过混淆的JAR例如第三方提供的混淆后SDK执行d8转换通常会很顺利。但如果你对一个未混淆的、包含大量未使用代码的JAR进行转换得到的DEX文件会包含所有内容体积可能不够优化。在自动化构建中将转换步骤放在整个混淆优化流程之后是更合理的。5. 常见问题排查与调试技巧实录5.1 “ClassNotFoundException”与“NoClassDefFoundError”深度排查这是转换后动态加载时最经典的错误。两者略有区别ClassNotFoundException发生在类加载器明确找不到类的定义时NoClassDefFoundError则发生在编译时存在但运行时找不到例如静态初始化失败或依赖的类缺失。排查步骤确认DEX文件是否包含目标类使用dexdump工具。dexdump -f output/classes.dex | grep “Class descriptor”可以列出DEX文件中所有的类。仔细检查你的目标类包括包名是否在其中。检查类路径依赖如果目标类依赖了其他类而这些类不在同一个DEX文件中也会出错。使用dexdump -d output/classes.dex | grep -A 5 -B 5 “你的类名”查看其方法代码中引用了哪些外部类。确保这些被引用的类也存在于类加载器能加载到的DEX或原始APK中。验证类加载器路径动态加载时双重检查DexClassLoader构造函数的第一个参数DEX文件路径是否正确文件是否存在且可读。第二个参数优化输出目录应用有写入权限通常是context.getCodeCacheDir()。注意MultiDex如果你手动生成了多个DEX文件classes.dex,classes2.dex在动态加载时需要确保DexClassLoader能加载到所有必需的DEX文件。一种做法是将多个DEX文件打包成一个JAR或ZIP然后传递该压缩包路径。DexClassLoader内部会解压并处理其中的所有DEX文件。5.2 版本兼容性与API级别问题问题表现转换过程成功但DEX文件在低版本Android设备上运行时崩溃报错信息可能涉及不支持的指令或方法。根因与解决这通常与--min-api参数有关。d8编译器会针对指定的API级别进行优化可能会使用一些在新版本ART上才支持的指令。例如某些字符串操作或数学函数的内联优化只在较高API级别有效。解决方案在转换时明确指定你的应用支持的最低API级别。例如如果你的minSdkVersion是21则转换命令应加上--min-api 21。这能确保生成的DEX文件与目标设备兼容。验证方法使用dexdump查看DEX头信息dexdump -f output/classes.dex在输出中查找min_sdk字段确认其值是否符合预期。5.3 处理包含Android资源或特定注解的JAR普通的Java库JAR只包含.class文件。但有些Android库特别是以AAR形式提供但你可能只提取了其中的classes.jar可能依赖Android资源R类或使用了Android特有的注解如NonNull。问题直接转换这类JAR可能会失败提示找不到android.R或某些注解类。解决策略提供完整的依赖确保在--classpath中包含了对应的Android支持库或AndroidX注解库的JAR包。例如可能需要添加androidx.annotation:annotation的JAR。使用Android SDK编译最可靠的方法是在一个模拟的Android项目环境中通过Gradle依赖该库然后从构建输出如build/intermediates/transforms/中获取已经由AGP和R8正确处理过的DEX文件而不是自己手动转换原始的JAR。分离纯Java逻辑如果可能尝试将库中不依赖Android API的纯Java逻辑剥离出来单独打包和转换这样可以避免复杂的依赖问题。5.4 性能调优与输出分析对于大型库转换速度和输出DEX的大小是需要关注的。增量转换d8支持增量编译。如果你只是修改了JAR中的少量类理论上可以只重新转换变化的部分。但在手动命令行场景下实现真正的增量比较困难。更实用的做法是将其集成到Gradle中利用Gradle的增量构建特性。分析DEX内容使用d8的--pg-map输出ProGuard映射文件或使用Android Studio的APK分析器即使是对单个DEX来查看哪些类和方法占用了大量空间。你可能会发现一些意外的依赖或未被混淆的代码从而有机会进一步优化原始JAR。实验性优化d8提供了一些实验性标志来尝试更激进的优化例如--experimental-non-null-assertions。在生产构建中需谨慎使用但可以用于探索代码大小的极限优化。手动将JAR转换为DEX这项技能在现代Android开发中看似被高度自动化的构建系统所隐藏但它仍然是理解Android应用构成、处理高级场景如插件化、热修复、底层调试的基石。从稳定的dx转向更高效的d8不仅仅是工具的升级更是构建思维向现代化、高性能方向的演进。掌握其命令行用法、理解背后的原理并学会排查常见问题能让你在遇到构建或运行时类加载的“诡异”问题时不再束手无策而是能够直指核心高效解决。

相关新闻

双系统GRUB引导丢失修复全指南

双系统GRUB引导丢失修复全指南

1. 问题背景与核心需求上周帮同事处理一台双系统笔记本时,发现Windows更新后Ubuntu引导神秘消失。这已经是今年第三次遇到类似案例,让我意识到引导分区恢复是个高频痛点问题。对于LinuxWindows双系统用户而言,引导丢失就像家门口的钥匙突然不…

2026/8/17 5:35:01 阅读更多 →
Python高效处理列表对应运算:从zip与列表推导式到实战避坑

Python高效处理列表对应运算:从zip与列表推导式到实战避坑

1. 项目概述:从“手动算”到“一键算”的思维跃迁刚入行那会儿,我经常要处理一堆数据,比如计算两个产品列表的销售额总和,或者分析两组实验数据的比值。最开始,我的做法特别“原始”:打开Excel或者一个文本…

2026/8/17 5:34:01 阅读更多 →
数学建模竞赛解题思维与核心技术:从元胞自动机到多目标优化实战

数学建模竞赛解题思维与核心技术:从元胞自动机到多目标优化实战

1. 项目概述:从“优秀论文”到“解题地图”的深度解构每年数学建模竞赛结束后,最让参赛者挠头的,往往不是题目本身有多难,而是看到那些获奖论文时产生的困惑:“他们是怎么想到这个思路的?”“这些复杂的模型…

2026/8/17 5:34:01 阅读更多 →

最新新闻

Networkx图论分析库:从基础概念到Python实战应用

Networkx图论分析库:从基础概念到Python实战应用

1. 项目概述:为什么我们需要Networkx?如果你正在处理任何与“关系”有关的数据,比如社交网络中的好友连接、交通网络中的站点线路、论文之间的引用关系,甚至是分子结构,那么你很可能已经接触或即将接触到一个核心概念—…

2026/8/17 6:19:14 阅读更多 →
AI创意生成项目部署指南:从环境搭建到API集成全流程解析

AI创意生成项目部署指南:从环境搭建到API集成全流程解析

这次我们来看一个名为“蝙蝠变身超级有用的红肠知识”的项目。从标题看,这很可能是一个将“蝙蝠”元素与“红肠”知识进行趣味性结合的创意内容或工具。虽然标题略显抽象,但结合技术博客的语境,我们可以将其解读为一个内容生成、知识图谱构建…

2026/8/17 6:19:14 阅读更多 →
电工杯数学建模竞赛:工程优化与数据分析的实战建模指南

电工杯数学建模竞赛:工程优化与数据分析的实战建模指南

1. 赛题核心与破题方向:从“电工杯”的独特气质说起又到了一年一度的“电工杯”全国大学生电工数学建模竞赛,对于很多电气、自动化、计算机乃至经管专业的同学来说,这既是一次检验数模能力的绝佳机会,也是一个不小的挑战。和国赛、…

2026/8/17 6:19:14 阅读更多 →
Java private关键字深度解析:从封装原理到实战应用与避坑指南

Java private关键字深度解析:从封装原理到实战应用与避坑指南

1. 项目概述:为什么private关键字值得你花时间深究?在Java的世界里,private关键字可能是你最早接触的访问修饰符之一,但往往也是最容易被轻视的一个。很多开发者,尤其是刚入门的同学,会觉得它无非就是“不让…

2026/8/17 6:18:14 阅读更多 →
蒙特卡洛树搜索:从AlphaGo到工业优化的核心算法解析

蒙特卡洛树搜索:从AlphaGo到工业优化的核心算法解析

1. 从AlphaGo到日常决策:蒙特卡洛树搜索为何如此强大2016年,当AlphaGo在棋盘上击败李世石时,一个原本只在学术圈和特定游戏AI领域内流传的算法——蒙特卡洛树搜索,瞬间被推到了聚光灯下。很多人第一次听说它,觉得这名字…

2026/8/17 6:18:14 阅读更多 →
STM32温湿度在线监测:从传感器到网页的全链路开发实战

STM32温湿度在线监测:从传感器到网页的全链路开发实战

这类项目最值得先看的不是功能列表,而是能不能在普通开发板上稳定跑起来,以及数据怎么传到网页上。基于STM32的温湿度在线监测,核心解决的是把传感器数据采集、本地处理、网络上传和网页展示串成一个能实际工作的系统。它适合两类人&#xff…

2026/8/17 6:18:14 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →