文档章节

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
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

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
7
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
18
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部