.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文件相关推荐
- 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )
文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...
- 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )
文章目录 一.生成 dex 文件 二.生成 dex 文件代码示例 三.生成 dex 结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool ...
- dx 生成 DEX文件流程分析
dx 生成 DEX文件流程分析 命令 dx -JXms16M -JXmx2048M --dex --output=. /classes.dex ./classes.jar dalvik/d ...
- 超详细的java生成excel文件并下载
在网上随手一搜,可以搜到很多java生成excel文件相关的博客,但每个都有不同,核心点说清楚了,但具体运用的时候,相信大家或多或少都没法一次直接运用,这样每次去找并且运用的时候很费时间,所以这也是我 ...
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解...
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题
java生成压缩文件 ZipEntry出现乱码的问题 在项目中,一次导出的文件有好几个,而且文件内容比较大,最后考虑到把文件进行压缩在下载,开始试用JDK自带的ZIP压缩包时,ZipEntry ze ...
- java流与文件——java生成解压缩文件(夹)
[0]README 0.1) 本文描述转自 http://blog.csdn.net/chenssy/article/details/9622171 , 旨在理解 java流与文件--java生成解压 ...
- java 生成csv文件_Java生成CSV文件实例详解
本文实例主要讲述了java生成csv文件的方法,具体实现步骤如下: 1.新建csvutils.java文件: package com.saicfc.pmpf.internal.manage.utils ...
- Java生成ics文件
java生成ICS文件,这玩意好象是个什么日程表类的东西.可以导入到outlook里面用. public void exportActivityDates(HttpServletRequest req ...
最新文章
- c语言gather函数,TensorFlow函数:tf.gather_nd
- 关于onreadystatechange属性(转)
- Phonegap win7下环境配置流程
- aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
- 利用modelarts和物体检测方式识别验证码
- excel两个指标相关性分析_我用Excel发现了数据分析的本质:回归分析
- 特斯拉将美国政府告了:要求停止对华关税并退款!
- Vue学习笔记(五)—— 状态管理Vuex
- 最简单的图文教程,几步完成Git的公私钥配置
- python运算符及优先级顺序
- 堆栈小应用(一):括号匹配程序
- opencore(OC引导)关于修改sle系统权限的问题
- CAPL可以读写的几种文件
- TCP报文段和连接方式
- 苹果开发者中心如何上传构建版本
- Timer Class(计时器类别)
- 【学术相关】交大博士学长:研究生计算机专业的方向选择!
- ibm服务器做系统按f几,这是我的主板,请问开机启动热键按F几?
- 前端体系结构知识概括
- 游戏开发笔记(二)——开发流程和项目管理
热门文章
- WebLogic下载地址
- 修复 SyntaxHighlighter 3.0.83 Java 代码多行注释 Bug
- How to become an expert in the IP industry? Here is where you should start
- formal method online checking tool
- 最佳的七十五个网络分析和安全工具
- sed 和 awk 的一些用法
- mysql主从复制-mysqldump
- 在linux中安装mysql时遇到的问题
- Angular基础(五) 内建指令和表单
- SpringMvc 集成 shiro 实现权限角色管理-maven