文档章节

Unable to execute dex: method ID not in [0, 0xffff

addcn
 addcn
发布于 2016/07/28 19:23
字数 730
阅读 16
收藏 0

1、使用动态加载技术时,一般需要用到这两个类加载器:

  • PathClassLoader - 只能加载已经安装的apk,即/data/app目录下的apk。
  • DexClassLoader - 能加载手机中未安装的apk、jar、dex,只要能在找到对应的路径。

http://blog.csdn.net/u010687392/article/details/47121729

2、开发时提前编译多个dex

原理:

第一步将项目中的代码提前生成jar包,最好是不常改动的代码。 将第三方jar包和第1步中生成的jar包,cmd执行SDK中的dx.bat命令,将jar包编译生成dex文件,比如v4.dex,v7.dex,map.dex等,最好一类功能或模块对应一个dex,然后将这些dex文件放进assets文件夹中。

将以上生成dex的jar包,做成编译环境Library。类似于android.jar,这个Library只参与主项目代码编译,不参与项目打包。这样项目就不会报错,能正常编译运行。 最后同第一种方案,手动加载assets文件中的dex文件,需要用到一个MultiDex.java文件的API。 优点: 能很大程度上解决65534的问题,且由于预先编译dex,所以项目在开发期间编译运行效率能提高很多。

缺点: 打包生成的apk体积依然庞大,且只能拆分项目里的公共模块和第三方jar包,所以对于业务和开发者庞大的项目来说,所有人在一个项目里开发协作起来依然存在问题,而且res资源文件依旧是个难以拆分的问题。

http://xybcoder.github.io/2016/04/27/Multidex%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95%E6%95%B0%E8%B6%8A%E7%95%8C/

3、微信加载方案

首次加载在地球中页中, 并用线程去加载(但是 5.0 之前加载 dex 时还是会挂起主线程一段时间(不是全程都挂起))。

dex 形式

微信是将包放在 assets 目录下的,在加载 Dex 的代码时,实际上传进去的是 zip,在加载前需要验证 MD5,确保所加载的 Dex 没有被篡改。

dex 类分包规则

分包规则即将所有 Application、ContentProvider 以及所有 export 的 Activity、Service 、Receiver 的间接依赖集都必须放在主 dex。

加载 dex 的方式

加载逻辑这边主要判断是否已经 dexopt,若已经 dexopt,即放在 attachBaseContext 加载,反之放于地球中用线程加载。怎么判断?因为在微信中,若判断 revision 改变,即将 dex 以及 dexopt 目录清空。只需简单判断两个目录 dex 名称、数量是否与配置文件的一致。

总的来说,这种方案用户体验较好,缺点在于太过复杂,每次都需重新扫描依赖集,而且使用的是比较大的间接依赖集。

http://yydcdut.com/2016/03/20/split-dex/

© 著作权归作者所有

共有 人打赏支持
addcn
粉丝 12
博文 53
码字总数 13824
作品 0
深圳
程序员
私信 提问
Android Unable to execute dex: method ID not in [0, 0xffff]: 65536

eclipse开发环境 因为项目需要,引用的lib工程比较多,最后编译的时候出现以下异常: [2014-11-26 16:13:03 - Dex Loader] Unable to execute dex: method ID not in [0, 0xffff]: 65536 [2...

蓝色精灵_0907
2016/05/10
513
2
android 项目突然报错

[2015-12-05 20:24:10 - Dex Loader] Unable to execute dex: method ID not in [0, 0xffff]: 65536 [2015-12-05 20:24:10 - Djt-Family3] Conversion to Dalvik format failed: Unable to e......

天王盖地虎626
2015/12/05
102
1
Andriod 出现DEX的错误,搜索了下Andriod编译环境最多支持6W多个方法,如何解决?

最近平台的Andriod端编译出现了一个很少见的问题,就是由于工程中方法数量太多导致出现下面的异常,无法编译。 [2014-03-12 11:32:43 - Dex Loader] Unable to execute dex: method ID not ...

CapJes
2014/03/14
6.6K
1
关于安卓应用方法过多的问题

异常 : [2016-04-16 20:39:56 - Dex Loader] Unable to execute dex: method ID not in [0, 0xffff]: 65536 [2016-04-16 20:39:56 - qqzq] Conversion to Dalvik format failed: Unable to......

天使broken
2016/04/16
72
2
关于加入第三方包之后导致自定义包无法找到问题

在项目开发过程中,引入第三方的jar包之后,报出一下错误,提示自定义类无法找到,但删除引入的第三方包之后,运行正常: 起初怀疑是第三方Jar包问题,经过反复查看,结果发现真正原因在于引...

tyronejw
2015/12/11
25
0

没有更多内容

加载失败,请刷新页面

加载更多

fabric增删改查Mac

备份1.3版本,重新下载1.1版本到fabric文件夹 /opt/gopath/src/github.com/hyperledger/fabric -> /opt/gopath/src/github.com/hyperledger/fabric1.3 新建/opt/gopath/src/github.com/hype......

八戒八戒八戒
1分钟前
0
0
盘点愚人节各大网站彩蛋,谁最爱恶搞?

如今的愚人节俨然已是各品牌宣传了一个重要节日,同时,也成为了各大互联网科技企业凑热闹,比拼创意和策划的节日。跟小编一起看看有哪些有趣的策划吧! Google地图变成吃豆人游戏 每年愚人节...

临江仙卜算子
24分钟前
1
0
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍。Java8 用到了红黑树...

java菜分享
25分钟前
0
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
58分钟前
4
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部