.java生成dex文件
參考:http://www.android100.org/html/201502/26/123364.html
首先第一個是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不認 Java 的 byte code 的,所以不能直接這么打包,而要用 dx 工具轉成 Dalvik byte code 才可以。當然,dx 工具轉了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件。
第二個是,Android 里面雖然也提供了 URLClassLoader 的實現,但是并不能用。要動態加載其它類,可以用的 Class Loader 有:?
DexClassLoader,PathClassLoader,其中,DexClassLoader 可以加載 apk, jar 或者 dex 文件,例如:?
File jarFile = new File("/sdcard/test.dex");?
# if ( jarFile.exists() ) {?
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader());?
Class<?> c = cl.loadClass("xiaogang.test.Test");?
但是 DexClassLoader 要求指定一個可寫的目錄,即 DexClassLoader 構造函數的第二個參數,在上例中是 /sdcard/test?
這個參數的含義是:directory where optimized DEX files should be written?
因為 Dalvik 在加載 dex 文件時,會動態進行優化,DexClassLoader 要求指定優化后 dex 文件存放的位置。?
PathClassLoader 的限制要更多一些,它只能加載已經安裝到 Android 系統中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時候都會出現 ClassNotFoundException. 例如:
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());?
由于 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經過 Dalvik 優化過的 dex 文件,這個目錄的 dex 文件是在安裝 apk 包的時候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 應用安裝之后都保存在 /data/app 目 錄下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目錄下就會生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在調用 PathClassLoader 時,它就 會按照這個規則去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照這個規則就會去讀 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,顯然這個文件不會存在,所 以PathClassLoader 會報錯。?
在 Google 修正這個問題之前,我們要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加載已安裝的 apk
接下來制作dex文件,用dx 命令生成 .dex 文件
1.dx 加入環境變量
dx路徑 ??/sdk/android-sdk-macosx/tools:/Users/jianweiwang/Documents/dev/sdk/android-sdk-macosx/build-tools/22.0.1
用vim命令加入 ??vim ~/.bash_profile?
source 命令 生效 source??~/.bash_profile?
2.執行命令
dx --dex --output ./TestClassLoader.dex ./TestClassLoader.class
但是出現錯誤:
UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)at com.android.dx.command.dexer.Main.processClass(Main.java:704)at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)at com.android.dx.command.dexer.Main.access$300(Main.java:83)at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)at com.android.dx.command.dexer.Main.processOne(Main.java:632)at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)at com.android.dx.command.dexer.Main.run(Main.java:246)at com.android.dx.command.dexer.Main.main(Main.java:215)at com.android.dx.command.Main.main(Main.java:106) ...while parsing TestDex.class參考:http://gaebolg.blog.163.com/blog/static/19826906820138544049440/
http://stackoverflow.com/questions/24662801/bad-class-file-magic-or-version
原因 我用javac 編譯的class文件 java 環境是1.8
解決方法 :
用eclipse 導出個 1.6的class 繼續執行命令 ?dx --dex --output ./TestDex.dex .
出現錯誤
UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.cf.iface.ParseException: class name (com/example/testactivity/TestDex) does not match path (com/example/TestDex.class)at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:520)at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)at com.android.dx.command.dexer.Main.processClass(Main.java:704)at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)at com.android.dx.command.dexer.Main.access$300(Main.java:83)at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)at com.android.dx.command.dexer.Main.processOne(Main.java:632)at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)at com.android.dx.command.dexer.Main.run(Main.java:246)at com.android.dx.command.dexer.Main.main(Main.java:215)at com.android.dx.command.Main.main(Main.java:106) ...while parsing com/example/TestDex.class類文件夾不一致?
建立相應文件夾執行
com/example/testactivity/執行dx命令 成功生成:TestDex.dex
?
轉載于:https://www.cnblogs.com/wjw334/p/4874161.html
總結
以上是生活随笔為你收集整理的.java生成dex文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【软件工程导论题型大总结】名词解释总结
- 下一篇: (王道408考研数据结构)第七章查找-第