Android 使用dx/d8将jar转换为dex

news2024/11/25 6:42:14

前言

在 JDK1.8 之前我们可以通过 dx 工具将 jar 转为 dex。
为了能够支持 JDK1.8,目前 AGP 是通过在 D8/R8 将 class 文件编译成 dex 文件的过程中,对字节码进行转换来实现的,这个转换过程称为脱糖。
因此 JDK1.8 及以后我们需要使用 d8 工具将 jar 转为 dex。

dx

dx 位于AndroidSDK/build-tools/<33.0.0的版本号中。

  1. windows 电脑可以直接在目录下执行 dx,mac 需要./dx来执行。
  2. 建议将AndroidSDK/build-tools/<33.0.0的版本号配置到环境变量中。

在这里插入图片描述

如果你的项目使用的 JDK 版本<1.8,你完全可以使用 dx。
如果你的项目使用的 JDK 版本>=1.8,但是不包含 Lambda 等需要脱糖的代码,经实验也可使用 dx。

dx 命令行使用如下:

dx --dex --output=输出 目标.jar

Output name must end with one of: .dex .jar .zip .apk or be a directory.

如:

dx --dex --output=dexlib_dex.jar dexlib.jar

如果报错提示:

Uncaught translation error: com.android.dx.cf.code.SimException: ERROR in com.demon.dexlib.TestActivity.onCreate:(Landroid/os/Bundle;)V: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)
1 error; aborting

说明你的项目中有需要脱糖的代码。
虽然可以加上–min-sdk-version=26 去解决报错,继续生成 dex。

dx --dex --min-sdk-version=26  --output=dexlib_dex.jar dexlib.jar

但是运行使用会崩溃,因此慎用!!!

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup

d8

现在的 Android 项目普遍都是>=JDK1.8,会在 build.gradle 中配置:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = '1.8'
}

d8 位于AndroidSDK/build-tools/>=28.0.1的版本号中。

  1. windows 电脑可以直接在目录下执行 d8,mac 需要./d8来执行。
  2. 建议将AndroidSDK/build-tools/>=28.0.1的版本号配置到环境变量中。
    在这里插入图片描述

d8 命令行使用如下:

d8 --output 输出 目标.jar

Output must be a .zip or .jar archive or an existing directory

如:

d8 --output dexlib_dex.jar dexlib.jar

参考

U8 打包把 dx 替换为 d8
逆向开发使用 dx.jar、d8.jar、baksmali.jar 将 jar 转 dex 文件,解决 requires --min-sdk-version >= 26 (currently 13)问题
ASM 字节码插桩:从 Lambda 表达式讲起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络笔记之物理层

文章目录比特、比特率&#xff0c;码元率&#xff08;波特率&#xff09;通信方式之单工、半双工和双工介质访问控制数据、信号、模拟信号、数字信号传输介质多模光纤和单模光纤光纤的优点无线传输卫星通信的特点参考计算机网络笔记之网络概论 物理层的主要功能是规定了接口的…

如何优化 order by 语句

order by 查询语句使用也是非常频繁&#xff0c;有时候数据量大了会发现排序查询很慢&#xff0c;本文就介绍一下 MySQL 是如何进行排序的&#xff0c;以及如何利用其原理来优化 order by 语句。 建立一张表&#xff1a; CREATE TABLE cc4 (id INT(11) NOT NULL,user_name VA…

reactHooks+TS:富文本braft-editor常见用法

react富文本braft-editor使用 阅读文档推荐&#xff1a;https://www.yuque.com/braft-editor/be、https://braft.margox.cn/demos/code-highlighter、 1、安装 # 使用npm安装 npm install braft-editor --save# 使用yarn安装 yarn add braft-editor2、基本使用 第一步&…

FGH60N60SMD 60A600V IGBT单管在工业逆变应用中的解决方案

场截止IGBT单管 60A600V FGH60N60SMD 采用新型场截止 IGBT 技术&#xff0c;为太阳能逆变器、UPS、焊接机、电信、ESS 和 PFC 等低导通和开关损耗至关重要的应用。 ONsemi安森美IGBT单管系列&#xff1a; FGH40N60SMD FGH60N60SMD FGH75T65SHD-F155 NGTB40N120FL2WG特性&…

基于pytorch的CREStereo立体匹配算法

文章目录前言一、CREStereo是什么&#xff1f;1.自适应群相关层局部特征注意力2D-1D转换局部搜索可变形的搜索窗口Group-wise相关性2.级联的网络3.叠加级联推理4.叠加级联推理损失函数二、基于pytorch的CREStereo立体匹配算法前言 CREStereo目前在middlebury上的排名第三&#…

Java高手速成 | Spring、JPA与Hibernate的整合

01、设置Spring的配置文件 在Spring的配置文件applicationContext.xml中&#xff0c;配置C3P0数据源、EntityManagerFactory和JpaTransactionManager等Bean组件。以下是applicationContext.xml文件的源程序。 /* applicationContext.xml */ <?xml version"1.0" …

【财务】FMS财务管理系统---审计流程

本文是电商系列的终结篇&#xff0c;笔者在本文介绍了审计流程及注意事项。 本篇是介绍财务审计的&#xff0c;作为电商系列的终结篇。后续计划去完成供应链后台的相关系统的梳理与学习&#xff0c;非常感谢朋友们在阅读过程中提出的问题与建议。 一、审计及流程 财务审计是每…

吴晓波年终秀原版PPT下载

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点2023年&#xff0c;如何科学制定年度规划&#xff1f;罗振宇2023年跨年演讲PPT原稿《底层逻辑》高清配图清华大学256页PPT元宇宙研究报告.pdf&#x…

nginx学习笔记2(小d课堂)

nginx目录文件讲解&#xff1a; 我们这里要去了解我们画红框了的这四个目录。 我们一般只用这两个文件&#xff0c;nginx.conf.default是nginx的默认模板。 我们先来看看这个默认模板&#xff1a; 这里面会有特别多的配置&#xff0c;我们后面的课会去学到。我们可能以后改哪个…

【实战篇】37 # 如何使用 QCharts 图表库绘制常用数据图表?

说明 【跟月影学可视化】学习笔记。 QCharts 图表库 QCharts 是一个基于 spritejs 封装的图表库&#xff0c;可以让用户以组件的形式组合出各种图表&#xff1a;https://www.qcharts.cn/#/home QCharts 图表的基本用法 最简单的方式是&#xff0c;直接通过 CDN&#xff0c;…

Mac 几款不错的文件管理工具

Default Folder X 文件快捷访问工具 Default Folder X V6.9d19 是一款 Mac 上的文件夹快捷访问工具&#xff0c;您可以访问您最近的&#xff0c;最喜欢的&#xff0c;并打开文件夹的默认文件夹X的工具栏右侧的内容。扩大你把鼠标移到他们的层次弹出菜单&#xff0c;让您浏览您…

【胖虎的逆向之路】动态加载和类加载机制详解

胖虎的逆向之路 —— 动态加载和类加载机制详解一、前言二、类的加载器1. 双亲委派模式2. Android 中的类加载机制1&#xff09;Android 基本类的预加载2&#xff09;Android类加载器层级关系及分析3&#xff09;BootClassLoader4&#xff09;Class文件加载5&#xff09;PathCl…

从 Redshift 迁移数据到 DolphinDB

AWS Redshift 是最早的云数据仓库之一&#xff0c;为用户提供完全托管的 PB 级云中数据仓库服务。用户可以使用标准 SQL 和现有的商业智能工具&#xff0c;经济高效地进行数据分析。但 AWS Redshift 上手难度较大&#xff0c;对知识储备要求较高&#xff0c;设计和优化相当复杂…

PCB设计中的屏蔽罩设计

屏蔽罩是一个合金金属罩&#xff0c;是减少显示器辐射至关重要的部件&#xff0c;应用在MID或VR产品中可以有效的减少模块与模块之间的相互干扰&#xff0c;如图3-54所示&#xff0c;常见于主控功能模块和电源模块及Wifi模块之间的隔离。图3-54 屏蔽罩的使用 01 屏蔽罩夹子一般…

前端沙箱浅析

前言 沙箱&#xff0c;即sandbox。 通常解释为&#xff1a;沙箱是一种安全机制&#xff0c;为运行中的程序提供隔离环境。常用于执行未经测试或者不受信任的程序或代码&#xff0c;它会为待执行的程序创建一个独立的执行环境&#xff0c;内部程序的执行不会影响外部程序的运行…

Go第 7 章:数组与切片

Go第 7 章&#xff1a;数组与切片 7.1 为什么需要数组 7.2 数组介绍 数组可以存放多个同一类型数据。数组也是一种数据类型&#xff0c;在 Go 中&#xff0c;数组是值类型。 7.3 数组的快速入门 我们使用数组的方法来解决养鸡场的问题. 7.4 数组定义和内存布局 对上图的总…

QA | 关于信号发生器的扫频功能,您了解多少?

在上期文章中&#xff0c;我们介绍了可编程信号发生器使用中的相关问题&#xff0c;那么关于便携式信号发生器的扫频功能您是否有很多问题呢&#xff0c;今天我们将围绕信号源扫频功能详细解答大家感兴趣的几个问题&#xff0c;快来看看吧&#xff01;Q1&#xff1a;信号源是否…

Linux操作系统--文件管理(保姆级教程)

文件系统类型的含义 文件系统类型式指文件在存储介质上存放及存储的组织方法和数据结构。 Linux采用虚拟文件系统技术&#xff08;virtual file system)-VFS 一个世纪的文件系统想要被Linux支持&#xff0c;就必须提供一个符合VFS标准的接口&#xff0c;才能与VFS协同工作&am…

线程的创建与同步

线程的创建与同步线程的概念与实现方式线程的概念进程线程的区别线程使用线程相关的接口函数多线程代码线程并发线程的实现方式线程的同步信号量互斥锁读写锁条件变量线程的安全线程与fork线程的概念与实现方式 线程的概念 进程是正在执行的程序。线程是进程内部的一条执行路…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《4》

这篇主要了解语义分割(semantic segmentation)&#xff0c;语义分割是分类中的一个核心知识点&#xff0c;而且这些语义区域的标注和预测都是像素级的。在语义分割中有两个很相似的重要问题&#xff0c;需要注意下&#xff1a;图像分割(image segmentation)&#xff1a;将图像分…