android sdk dx.bat,android 用dx.bat 转换class 为dex

用android sdk里面的dx.bat转换class文件为dex文件

今天在看热更新的时候,实践的时候遇到的问题,转换class文件时出现的问题,所以写个笔记,记录当时出现的错误

1、首先建立一个class 的类(这个类就是需要转换的文件)

89e09308e47727ba149c56bae43cee81.png

2、运行项目,运行之后在build文件夹下找到该类的class文件

我们看到的,写的都是java为后缀名的文件,运行android 项目之后会在build文件夹下生成相对于的class文件。我们要编译的正式class文件

e5f34e2e3f88982e7883b434f7322746.png

最开始的时候是没有找到这个目录,在网上也搜索过答案,但说的都是很模糊,并没有找到相对于的文件夹,后来就一个一个的翻,结果找到了这个文件。可能是由于android studio版本的不同吧,我现在用的版本是 3.2的

3、复制这个文件夹, 记住 一定是要复制 你的类所在的目录的所有文件夹

f7a856c62f1eea71568b68bba84b0cf4.png

所以从com这个文件夹开始复制,复制到你电脑的任何地方,自己得到就行,我是复制到的E盘下面的test文件夹,然后把其他不要的文件删除了,只留下需要转换的文件,如下:

7b38469751d0eecdbb04e492b4fa91e7.png

4、打开dx ,目录是在android 的sdk里面 我的dx的目录 D:\Sdk\build-tools\28.0.3

b2108b58cb959a197c0a5224b71cb59d.png

复制当前目录,然后在dos窗口 跳转到当前的目录 (如果配置了DEX的环境变量,则不需要当前的操作)

5、配置DEX的环境变量

fa713dc06a26c9a55f3557e9f826d199.png

还有一步操作

在path 里面配置 D:\Sdk\build-tools\28.0.3

feea0842747367fb7d6af8b5821790f1.png

dx.bat 这个运行程序在任何版本都有,所以你只需要找一个版本配置就行了,在dos窗口 可以输入dx 测试一下

89e0de4e8761f571f0168b9242ac3f7c.png

6、转换文件

由于第一次操作,所以出现了一些不明白的问题

第一次尝试:

直接打开dos命令输入:

dx --dex --output=E:\test\com\example\mywork\Bugs.dex E:\test\com\example\mywork\Bugs.class

然后出问题了

class name (com/example/mywork/Bugs) does not match path (E:/test/com/example/mywork/Bugs/Bugs.class)

...while parsing E:/test/com/example/mywork/Bugs/Bugs.class

1 error; aborting

提示路径不匹配,在网上查找,搜索问题后 没有找到解决的办法。

然后就开始了第二次尝试:

dx --dex --output=E:\test\com\example\mywork\Bugs.dex E:\test\com\example\mywork\Bugs

同样的错误

第三次: 把文件换了一个地方,结果还是同样的问题

dx --dex --output=C:\Users\Admin\Desktop\com\example\mywork\patch.dex C:\Users\Admin\Desktop\com\example\mywork\Bugs.class

第四次:

dx --dex --output=E:\test\com\example\mywork\Bugs.dex E:\test\com\example\mywork\Bugs

看到别人写的文档上没有后缀名,所以我就把后缀名去掉了,最后日志变得不一样了

java.lang.RuntimeException: E:\test\com\example\mywork\Bugs: file not found

at com.android.dex.util.FileUtils.readFile(FileUtils.java:51)

at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:168)

at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:143)

at com.android.dx.command.dexer.Main.processOne(Main.java:678)

at com.android.dx.command.dexer.Main.processAllFiles(Main.java:575)

at com.android.dx.command.dexer.Main.runMonoDex(Main.java:310)

at com.android.dx.command.dexer.Main.runDx(Main.java:288)

at com.android.dx.command.dexer.Main.main(Main.java:244)

at com.android.dx.command.Main.main(Main.java:95)

好吧,直接提示文件找不到了。 但是我的文件确实在那里

第N次尝试 :切换到E:test目录下

dx --dex --output =E:\test\ptach.dex com\example\mywork\Bugs.class

对了,得到想要的dex文件了

7d732d1fa09ea983d5f523c1329d68fb.png

805536e0ad29a91cf0f6c14e1544f40b.png 终于成功了!

总结一下 命令输出的问题

1、复制这个文件在项目的所有文件夹 也就是从com这个文件夹开始复制

2、配置dx环境变量,这个看个人不配置,可以直接在dos窗口 跳转到SDK里面去直接运行dx命令(没有测试过,暂时不发表意见)

3、dx --dex --output =E:\test\ptach.dex com\example\mywork\Bugs.class

这句话的意思: dx --dex --output = 直接复制 E:\test\ptach.dex

这个目录是你转换后文件的存放位置+这个文件的名称

com\example\mywork\Bugs.class 这句话 前面的提示就是没有明白错误日志是什么意思。

错误的日志是说 你这个文件一定要在com.example.mywork 这个目录下面,

意思就是后面那句一定是必须要有com\example\mywork\Bugs.class 这些文字 ,

当然这个是我遇到的问题的解决办法,网上有很多都不一样,这个要看个人当时是什么情况,多试几次

找到问题的根源,就能够解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值