文档章节

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
粉丝 10
博文 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
442
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
101
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
6分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
12分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
13分钟前
0
0
React16.4 开发简书项目 从零基础入门到实战

React16.4 开发简书项目 从零基础入门到实战 关注我的订阅号下载 React16.4 开发简书项目 从零基础入门到实战

蜗牛奔跑
16分钟前
0
0
day57-20180815-流利阅读笔记-待学习

社恐怎么办?这个漫画或许能治愈你 毛西 2018-08-15 1.今日导读 近日,芬兰漫画家卡罗利娜·科尔霍宁创作的绘本《芬兰人的噩梦》在中国大火。一时间书中的主人公马蒂成为了人们茶余饭后热议的...

aibinxiao
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部