位置: 编程技术 - 正文

彻底解决Android 应用方法数不能超过65K的问题(彻底解决老鼠进发动机舱)

编辑:rootadmin

推荐整理分享彻底解决Android 应用方法数不能超过65K的问题(彻底解决老鼠进发动机舱),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:彻底解决手机卡顿的软件,彻底解决老鼠进发动机舱,彻底解决win10win7局域网,彻底解决win10win7局域网,彻底解决win7驱动数字签名,彻底解决手机卡顿的软件,彻底解决红米手机卡顿,彻底解决红米手机卡顿,内容如对您有帮助,希望把文章链接给更多的朋友!

尊重原创 : to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]:

可能有些同学会说,解决这个问题很简单,我们只需要在Project.proterty中配置一句话就Ok啦,

dex.force.jumbo=true

是的,加入了这句话,确实可以让你的应用通过编译,但是在一些2.3系统的机器上很容易出现

INSTALL_FAILED_DEXOPT异常

对于以上两个异常,我们先来分析一下原因:

1、Android系统中,一个Dex文件中存储方法id用的是short类型数据,所以导致你的dex中方法不能超过k

2、在2.3系统之前,虚拟机内存只分配了5M

知道了原因,我们就来一个个的解决上面的问题,首先对于k的问题,我们在应用层是无法改变android系统的结构的,所以我们无法将数据类型从short改变为int或者其他类型,也就是说一个dex中的方法数不能超过k是我们无法逾越的鸿沟,我们只能减少一个dex中的方法数,首先最容易想到的方案就是去掉一些无用的Jar包,以及将一些属性设置为public,从而可以去掉get/set方法,这种方法只能临时解决问题,随着时间的推移,总有一天还是会出现方法数超过k的,毕竟一个应用一般是在加功能,不会减功能。

下面我来向大家介绍两种主流的解决方案,一种是以微信为代表的,将一些功能做成插件,动态加载,另一种方案是以facebook为代表的分包方案,将一个apk中的dex文件分割成多个dex文件,然后动态的去加载dex文件。其实这两种方案的核心思想是一样的,插件是把未来要开发的新功能做成apk和dex动态加载,而分包方案是将已经完成的功能分成多个dex文件动态加载,其实我个人觉得插件方案比分包方案更好的解决了k的问题,因为插件方案不仅能够解决k问题,还能让我们的应用体积减小,而分包只能解决k的问题。

关于插件开发,做成动态加载,我在很早之前一篇文章中就写过其基本思想,有兴趣的同学可以看看

彻底解决Android 应用方法数不能超过65K的问题(彻底解决老鼠进发动机舱)

《实现Android 动态加载APK(Fragment or Activity实现)》

分别在各个库工程中加入 multiDexEnabled = true 和 jniLibs.srcDirs =['libs']两个配置即可

8、如果你的项目没有自定义Application,那么你在AndroidManifest.xml中使用MultiDexApplication即可,如果你的项目有自定义Application,并且是继承是Application,那么只需要改为继承MultiDexApplication即可,如果你的项目时继承的其他Application,那么你需要重写

attachBaseContext

[java] view plaincopyprint?@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 经过上述配置,你的项目应该是已经成功分包了。如果分包成功,那么你解压你的apk文件,会发现有两个dex文件,通过上述的配置过程,我们发现此方案我们无法控制哪些类在main.dex中,哪些类在second.dex中,通过此种方案配置分包,可以兼容API4-API.其加载second.dex采用的是上述方案中的3

下面我们来看看基于Ant构建Android项目,并实现分包过程

在上述方案中,由于我们无法看到gradle构建项目的脚本,所以我们无法控制哪些类在第一个dex,哪些类在第二个dex,此方案中,我们采用Ant构建,Ant是允许用户自己定义构建方案的,比如我们可以通过自定义构建方案,将项目中某些第三方jar包放入到second.dex中,关于这个如何实现,请参考开源项目吧

4.4中的解决方案,其他系统大同小异

加载second.dex方法

[java] view plaincopyprint?/** @param loader PathClassLoader @additionalClassPathEntries 要被加载的dex文件,这里就是我们的second.dex @optimizedDirectory 就是dex文件解压的目录 */ private static void install(ClassLoader loader, List<File> additionalClassPathEntries, File optimizedDirectory) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException { /* The patched class loader is expected to be a descendant of * dalvik.system.BaseDexClassLoader. We modify its * dalvik.system.DexPathList pathList field to append additional DEX * file entries. */ //通过反射找到pathList的&#; Field pathListField = findField(loader, "pathList"); Object dexPathList = pathListField.get(loader); ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>(); //将second.dex 加入到PathClassLoader的加载路径中 expandFieldArray(dexPathList, "dexElements", makeDexElements(dexPathList, new ArrayList<File>(additionalClassPathEntries), optimizedDirectory, suppressedExceptions)); if (suppressedExceptions.size() > 0) { for (IOException e : suppressedExceptions) { Log.w(TAG, "Exception in makeDexElement", e); } Field suppressedExceptionsField = findField(loader, "dexElementsSuppressedExceptions"); IOException[] dexElementsSuppressedExceptions = (IOException[]) suppressedExceptionsField.get(loader); if (dexElementsSuppressedExceptions == null) { dexElementsSuppressedExceptions = suppressedExceptions.toArray( new IOException[suppressedExceptions.size()]); } else { IOException[] combined = new IOException[suppressedExceptions.size() &#; dexElementsSuppressedExceptions.length]; suppressedExceptions.toArray(combined); System.arraycopy(dexElementsSuppressedExceptions, 0, combined, suppressedExceptions.size(), dexElementsSuppressedExceptions.length); dexElementsSuppressedExceptions = combined; } suppressedExceptionsField.set(loader, dexElementsSuppressedExceptions); } }

分包成功后,解压apk文件,进入assert文件夹,我们看到如下结构,libs.apk就是第三方jar编译后形成的dex文件

对于上面提到的第二个问题INSTALL_FAILED_DEXOPT,根本原因就是2.3版本之前dalvik虚拟机的内存只有5M,所以无论是插件方案还是分包方案在某些手机上还是会遇到该问题,毕竟我们仅仅是减少了每个dex中包的数量,但是方法总数是没有减少的,所以解决此问题的根本方法就是修改虚拟机内存至8M,这个需求在Java层是无法实现,但是可以在c层实现,具体实现流程可以参考开源项目:

Android中的子菜单(SubMenu)使用案例 Android中创建子菜单的步骤:1、覆盖Activity中的onCreateOptionMenu()方法,调用Menu的addSubMenu()方法添加子菜单。2、调用SubMenu的add方法,添加子菜单。3、覆盖o

Android apk动态加载机制的研究 转载请注明出处:

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理 转载请注明出处:

标签: 彻底解决老鼠进发动机舱

本文链接地址:https://www.jiuchutong.com/biancheng/384278.html 转载请保留说明!

上一篇:实现Android 动态加载APK(Fragment or Activity实现)(android 动态化方案)

下一篇:Android apk动态加载机制的研究(android 动态添加控件)

  • 什么是纳税义务人,在理解这一观念时应注意哪些问题
  • 应付账款里的暂估
  • 房产税土地使用税新政策消息2023
  • 一般纳税人注销库存需要补交税吗
  • 实收资本何时交税
  • 能直接从公司账户向个人账户转钱吗
  • 工资薪金需要缴纳什么税种
  • 甲供材能否开具增值税专用发票
  • 资产负债表专项储备放哪个科目?
  • 利息保障倍数计算公式资本化利息
  • 计提企业年度所得税
  • 出售固定资产取得的收入
  • 辅助生产交互分配后的实际费用应在进行分配
  • 预收账款在什么科目核算
  • 2017年8月1日到现在多少天
  • 特定行业职工取得的工资、薪金所得,如何计算个人所得税?
  • 营改增后小规模纳税人如何报税
  • 债务免除的税务处理
  • 党建经费如何入账
  • 计划成本法下材料入库的会计分录
  • 销售折扣与折让影响应收账款周转率吗
  • 工程费用包括哪几类
  • 升级鸿蒙系统后
  • 仓库折旧费
  • 退休返聘人员的优点
  • sdi是什么文件
  • php利用云片网实现短信验证码功能的示例代码
  • 收到人才引进补助会计分录
  • videojs自定义按钮
  • php中的预定义变量
  • 补缴社保公积金申请书怎么写
  • phpstorm ftp
  • PHP:pg_fetch_row()的用法_PostgreSQL函数
  • 材料发票入账
  • 跨境服务免征增值税申报怎么填
  • 漏洞 标准
  • 多洛米蒂徒步线路
  • thinkphp 插件
  • 非盈利组织盈利怎么办
  • 跨年度发票会计分录
  • 基建费用如何摊销
  • linux进程状态有哪些
  • php二分查找算法两种方法
  • 其他收益和其他收入的区别
  • tcpreplay命令详解
  • 注销公司怎么搞
  • 小说连载阅读安卓版下载
  • 关于DEDECMS移动data后网站地图无法生成的解决方法
  • 企业所得税报表查询怎么查
  • 消费税是怎样征收的
  • 交耕地占用税如何交
  • 企业征收所得税会计分录
  • 购销合同上没有金额,怎么写比较好
  • 内账收入按含税还是不含税入
  • 盘亏存货可以转回来吗
  • 自产货物用于在建工程账务处理
  • 电子税务局申报流程
  • 小企业固定资产折旧方法包括
  • windows隐藏文件名
  • docker镜像包含什么
  • 深入解析linux内核
  • Ubuntu上安装anaconda
  • SPBBCSvc.exe - SPBBCSvc进程是什么文件 有什么作用
  • linux文件系统inode
  • 什么是四个菜
  • 2016年微软股价
  • ssh客户端软件
  • win8的ie浏览器
  • react-redux用法
  • visual studio 10 cocos2dx项目移植到eclipse的android项目(配置请参照上一篇文章开发环境搭建)
  • Django中login_required装饰器的深入介绍
  • regedit.exe
  • js实现上下左右跳动
  • 深入理解中国式现代化
  • jquery插件使用教程
  • nodejs怎么启动服务
  • Android使用opencv处理图片灰度
  • 新疆办房产证需要多久能拿证
  • 合伙企业可以融资吗
  • 我国为什么不推行安乐死
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设