用android sdk裏面的dx.bat轉換class文件爲dex文件
今天在看熱更新的時候,實踐的時候遇到的問題,轉換class文件時出現的問題,所以寫個筆記,記錄當時出現的錯誤
1、首先建立一個class 的類(這個類就是需要轉換的文件)
2、運行項目,運行之後在build文件夾下找到該類的class文件
我們看到的,寫的都是java爲後綴名的文件,運行android 項目之後會在build文件夾下生成相對於的class文件。我們要編譯的正式class文件
最開始的時候是沒有找到這個目錄,在網上也搜索過答案,但說的都是很模糊,並沒有找到相對於的文件夾,後來就一個一個的翻,結果找到了這個文件。可能是由於android studio版本的不同吧,我現在用的版本是 3.2的
3、複製這個文件夾, 記住 一定是要複製 你的類所在的目錄的所有文件夾
所以從com這個文件夾開始複製,複製到你電腦的任何地方,自己得到就行,我是複製到的E盤下面的test文件夾,然後把其他不要的文件刪除了,只留下需要轉換的文件,如下:
4、打開dx ,目錄是在android 的sdk裏面 我的dx的目錄 D:\Sdk\build-tools\28.0.3
複製當前目錄,然後在dos窗口 跳轉到當前的目錄 (如果配置了DEX的環境變量,則不需要當前的操作)
5、配置DEX的環境變量
還有一步操作
在path 裏面配置 D:\Sdk\build-tools\28.0.3
dx.bat 這個運行程序在任何版本都有,所以你只需要找一個版本配置就行了,在dos窗口 可以輸入dx 測試一下
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文件了
終於成功了!
總結一下 命令輸出的問題
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 這些文字 ,
當然這個是我遇到的問題的解決辦法,網上有很多都不一樣,這個要看個人當時是什麼情況,多試幾次