当前位置: 首页 > 编程日记 > 正文

关于Android方法数量限制的问题

限制Android方法数量的原因是:


Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16,65536个。

Op & Format

Mnemonic / Syntax

Arguments

6e..72 35c

invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB

B: method reference index (16 bits)

注意是method reference,这里限制的是自己代码、Android框架、第三方库三者方法数量的总和。

dex里方法只能索引65536个,但是报错不在这里。Android打包dex的过程如下:


//Main.Java

-> main() -> run() ->不分包执行runMonoDex()(或者分包执行runMultiDex())-> writeDex()

// DexFile

->toDex() -> toDex0()

// MethodIdsSection extends MemberIdsSection extends UniformItemSection extends  Section

->Section 的prepare() -> UniformItemSection的prepare0() ->MemberIdsSection的orderItems() -> getTooManyMembersMessage()

//Main.java

->getTooManyIdsErrorMessage()

MemberIdsSection里执行了这么一段代码

protected void orderItems() {

int idx = 0;

if (items().size() >DexFormat.MAX_MEMBER_IDX + 1) {

throw newDexIndexOverflowException(getTooManyMembersMessage());

}

for (Object i : items()) {

((MemberIdItem) i).setIndex(idx);

idx++;

}

}

getTooManyMembersMessage核心代码如下:构建了错误信息字符串。

private String getTooManyMembersMessage() {

try {

String memberType = this instanceofMethodIdsSection ? "method" : "field";

 formatter.format("Too many %s references:%d; max is %d.%n" +

Main.getTooManyIdsErrorMessage() + "%n" +

"References bypackage:",

memberType, items().size(),DexFormat.MAX_MEMBER_IDX + 1);

return formatter.toString();

}

}

}

可见代码里检测了方法数量的上限,超过就会报错。这里的限制DexFormat.MAX_MEMBER_IDX

出自

public final classDexFormat {

/**

* Maximum addressable field or methodindex.

* The largest addressable member is0xffff, in the "instruction formats" spec as field@CCCC or

* meth@CCCC.

*/

public static final int MAX_MEMBER_IDX =0xFFFF;

}

因此方法不能超过65536。这里的根源还是在dex字节码规范里方法引用索引的限制,但是强制报错是在这里限制的。

另外,域的数量也有此限制。

错误信息:

Error:Errorconverting bytecode to dex:

Cause:com.android.dex.DexIndexOverflowException:field ID not in [0, 0xffff]: 65536(笔者开发时遇到的是域数量问题,方法数量问题错误信息于此类似)

:XXXXXX:transformClassesWithDexForDebug FAILED

Error:Executionfailed for task ':XXXXXX:transformClassesWithDexForDebug'.

>com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException: Process 'command 'C:\ProgramFiles\Java\jdk1.8.0_73\bin\java.exe'' finished withnon-zero exit value 2

解决方法:

Google官方出的分包方案,采用MultiDex支持库

1,配置building.gradle,开启MultiDex

android {

defaultConfig {

multiDexEnabled true

}

}

dependencies{

compile'com.android.support:multidex:1.0.0'

}

2,配置应用

方法1:在AndroidManifest.xml的application中声明android.support.multidex.MultiDexApplication;

<?xmlversion="1.0" encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.android.multidex.myapplication">

<application

...

android:name="android.support.multidex.MultiDexApplication">

...

</application>

</manifest>

方法2:让你自己的Application类继承MultiDexApplication

方法3:让你自己的Application类重写attachBaseContext 方法,

@Override

protected voidattachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

其他错误情况:

Error:java.lang.OutOfMemoryError: Java heap space.

Please assign morememory to Gradle in the project's gradle.properties file.

For example, thefollowing line, in the gradle.properties file, sets the maximum Java heap sizeto 1,024 MB:

<em>org.gradle.jvmargs=-Xmx1024m</em>

:XXXXXX:transformClassesWithDexForDebugFAILED

Error:Executionfailed for task ':XXXXXX:transformClassesWithDexForDebug'.

>com.android.build.api.transform.TransformException: java.lang.RuntimeException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException:Process 'command 'C:\Program Files\Java\jdk1.8.0_73\bin\java.exe''finished with non-zero exit value 3

解决方法:

Building.gradle

dexOptions {

javaMaxHeapSize "4g"

}

javaMaxHeapSize对应正则表达式是"\\d+[kKmMgGtT]?"4g指4G字节。

DexOptions类包含了获取JavaMaxHeapSize的方法,对应Building.gradle里dexOptions设置的javaMaxHeapSize。


参考:

http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html

http://jayfeng.com/2016/03/10/%E7%94%B1Android-65K%E6%96%B9%E6%B3%95%E6%95%B0%E9%99%90%E5%88%B6%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83/

http://developer.android.com/intl/es/tools/building/multidex.html

相关文章:

asp.net中显示DataGrid控件列序号的几种方法

在aps.net中多数据绑定的控件很多&#xff0c;论功能来说&#xff0c;应该属DataGrid最为齐全&#xff0c;但它没有提供现成的显示记录序号的功能&#xff0c;不过我们可以通过它所带的一些参数来间接得到序号&#xff0c;下面来看看怎样得到和显示序号值计算方式如下&#xff…

一口气看完45个寄存器,CPU核心技术大揭秘

作者 | 轩辕之风O来源 | 编程技术宇宙头图 | CSDN下载自视觉中国自1946年冯诺伊曼领导下诞生的世界上第一台通用电子计算机ENIAC至今&#xff0c;计算机技术已经发展了七十多载。从当初专用于数学计算的庞然大物&#xff0c;到后来大型机服务器时代&#xff0c;从个人微机技术蓬…

用友公司Java面试题(含答案)

为什么80%的码农都做不了架构师&#xff1f;>>> 用友公司Java面试题&#xff08;含答案&#xff09; 1.Hashtable和HashMap有什么区别&#xff1f; a.Hashtable是继承自陈旧的Dictionary类的&#xff0c;HashMap继承自AbstractMap类同时是Java 1.2引进的Map接口…

使用memcache做web缓存

为什么80%的码农都做不了架构师&#xff1f;>>> 下载: memcached server [密码: vTI8, 安装启动和调用, 内部有说明] 下载: python-memcached 1.57 现在准备用web.py写个网站, 缓存这块一直没想好用哪个, 今天终于想好了, 直接用memcache # coding: utf-8import me…

Asp.net中DataGrid控件的自定义分页

使用实现起来虽然比较方便&#xff0c;但是效率不高&#xff0c;每次都需要读取所有页&#xff08;整个记录集&#xff09;&#xff0c;而加载的只是其中一页&#xff0c;造成了资源的浪费&#xff0c;记录多又会使效率变得很低。下面通过DataGrid的自定义分页功能来减少资源使…

实战:在Windows Server2008上配置NLB

1.1 在Windows Server2008上配置NLB 试验环境&#xff1a; DCServer是ESS.COM域的域控制器。 Fileserver和Research属于ESS.COM域&#xff0c;安装有Windows Server 2008企业版。 Sales计算机是ESS.COM域的成员&#xff0c;安装Vista企业版。 试验要求&#xff1a; 实现FileSer…

无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资

10月30日&#xff0c;矿山无人驾驶运输企业踏歌智行完成了2亿元的B轮融资&#xff0c;本轮融资由前海母基金和宝通投资共同领投&#xff0c;清研资本、蓝焱资本等跟投。踏歌智行继2019年连续完成三轮融资后&#xff0c;再创行业新高。据了解&#xff0c;踏歌智行2019年签订了超…

Python加密—RSA加密

为什么80%的码农都做不了架构师&#xff1f;>>> 公钥加密&#xff0c;私钥解密。 import rsa import base64 from Crypto.PublicKey import RSA # RSA加密解密pubkey -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcB4zYqi3mjdP3E2f9jyPuF0X…

在asp.net中为Web用户控件添加属性和事件

在90年代初&#xff0c;Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程。它可以利用十分易用的模型在Web服务器上动态生成HTML&#xff0c;并且很容易的实现了对数据库的访问&#xff0c;就当时来说&#xff0c;这是一项多么吸引人的技术&#x…

1024 鲲鹏开发者技术沙龙·福州站圆满收官!给程序员的福利你收到了吗?

10月24日&#xff0c;由华为技术有限公司与福建鲲鹏生态创新中心联合主办的“1024鲲鹏开发者技术沙龙”在福州顺利举行。在沙龙上&#xff0c;来自福建鲲鹏生态创新中心运营总监宋宗佑为活动进行致辞&#xff0c;福建鲲鹏生态创新中心生态总监朱晓彤对鲲鹏生态创业中心进行介绍…

IPsec ××× 配置實例

試驗top:ipsec ***的配置包括一下幾個步驟:1.配置ike的協商2.配置ipsec的協商3.配置端口的應用4ike的調試和排錯按照步驟建立ike 的協商策略和參數R1<config>#crypto isakmp policy 編號<1-10000>編號越低優先級越高#hash { md5 | sha1 } 此命令表明設置密匙認…

springMVC参数绑定与数据回显

简单例子&#xff1a;修改商品信息的jsp页面&#xff1a; 参数绑定过程&#xff1a; 1.2.1 默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。 1.1.1 HttpServletRequest 通过request对象获取请求信息 1.1.2 HttpServletResponse 通…

使用Qt编写模块化插件式应用程序

动态链接库技术使软件工程师们兽血沸腾&#xff0c;它使得应用系统&#xff08;程序&#xff09;可以以二进制模块的形式灵活地组建起来。比起源码级别的模块化&#xff0c;二进制级别的模块划分使得各模块更加独立&#xff0c;各模块可以分别编译和链接&#xff0c;模块的升级…

datagrid的正反双向排序

在asp.net中利用datagrid控件按列进行排序很是方便。可是我们只能单项排序&#xff01;如果我们需要正反排序那么就需要加入一些代码控制一下。 首先我们需要将datagird控件的属性设置为 AllowSorting"True"&#xff0c;且需要排序列需要制定排序表达式 eg: SortExpr…

比Python 3.8快20%,Pyston v2正式发布

作者 | 写代码的明哥来源 | Python编程时光头图 | CSDN付费下载于视觉中国Pyston 自从 2017 年发布 0.6.1 版本后&#xff0c;已经淡出了人们的视线三年多了&#xff0c;导致现在新人都很少听过它的大名。前两天&#xff08;2020年10月28日&#xff09;Pyston 在官方博客上&…

基于Netty实现的轻量级分布式服务框架

对分布式技术比较感兴趣&#xff0c;于是在闲暇时间写了一个简单的RPC框架娱乐一下&#xff0c;项目持续更新中...... GitHub项目地址: Pudding 如果感觉Pudding对你有帮助可以顺手点个Star哦......哈哈 直接看一下示例代码吧 第一步: 启动注册中心 public class RegistryTest…

在分页状态下删除纪录的问题

在使用DataGrid分页的时候&#xff0c;正常情况下&#xff0c;绑定数据库列表纪录时会自动产生分页的效果&#xff0c;然而我发觉在删除纪录的时候总会发生"无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount。"的异常&#xff0c;其实解决这个问题很简…

老码农90%的程序猿都是瞎努力,这份路线教你成为高手!

数据正在变得越来越常见&#xff0c;小到我们每个人的社交网络、消费信息、运动轨迹……&#xff0c;大到企业的销售、运营数据&#xff0c;产品的生产数据&#xff0c;交通网络数据……如何从海量数据中获得别人看不见的知识&#xff0c;如何利用数据来武装营销工作、优化产品…

android 365手机秘书源代码

2019独角兽企业重金招聘Python工程师标准>>> 应用到的知识还算挺多的&#xff0c;网络编程&#xff0c;xml解析&#xff0c;通知&#xff0c;广播&#xff0c;联系人&#xff0c;服务等&#xff0c;希望对新手有帮助 运行环境&#xff1a; 在android 2.3.3 运行…

centos安装及网络配置

感谢老师传授&#xff0c;共同学习&#xff01;谢谢&#xff01;仅供自己日后复习之用&#xff01;centos安装关键点&#xff1a;创建分区&#xff1a;/ 系统分区/boot 启动分区SWAP 交换分区&#xff0c;虚拟内存。主要是缓解物理内存不足。虚拟化软件&#xff1a;VMware work…

使用DataGrid动态绑定DropDownList

简单的使用模板列绑定DropDownList&#xff0c;初学者想必都会了&#xff0c;但有时候&#xff0c;我们要做的就是在编辑的时候想让某一列定制为DropDownList&#xff0c;并且根据正常情况下显示的值自动变换DropDownList中所选的值&#xff0c;然后保存选择后的值到数据库或XM…

隐私数据在隐私AI框架中的安全流动

作者 | Rosetta技术团队责编 | 晋兆雨出品 | AI科技大本营本文中&#xff0c;我们将介绍为了保护用户的隐私数据&#xff0c;在隐私 AI 框架的计算任务全流程中&#xff0c;数据是如何以密文形式流动&#xff0c;同时仍正确完成加法、乘法等计算步骤的。隐私 AI 系统存在的目…

MS Sql Server 作业编辑报错以及不显示历史记录

如下图&#xff1a; 解决方法&#xff1a; 1.开始->运行&#xff0c;输入dcomcnfg.exe 2.打开组件服务器->计算机->我的电脑->DCOM配置&#xff1b; 3.找到Microsoft Office Excel或者Microsoft Office Word点击右键->属性 4.选择安全&#xff0c;将启动和激活权…

基于Guava实现的文件复制

需求&#xff1a;现需要将文件D:\A\B\C\abc.txt进行一下操作 1.在文件夹D:\A\B\C下&#xff0c;没有以abc命名的文件夹则创建 2.将目标文件D:\A\B\C\abc.txt复制到abc下 实现代码&#xff1a; /*** 以目标文件名创建文件夹&#xff0c;并将目标文件复制到该文件夹下** param sr…

破局传统算法痛点,腾讯安全首提基于跨模态检索的二进制代码-源代码匹配

整理 | 高卫华出品 | AI科技大本营头图 | CSDN付费下载自视觉中国近日&#xff0c;在NeurIPS 2020正式发布的论文入选名单中&#xff0c;腾讯安全科恩实验室聚焦解决二进制安全问题的《CodeCMR: Cross-Modal Retrieval For Function-Level Binary Source Code Matching》&#…

DataGrid删除确认及Item颜色交替

有时候我们需要在删除DataGrid中Item相对应的数据时&#xff0c;需要弹出一个确认对话框来提示使用者&#xff0c;其实这个功能非常简单&#xff0c;下面的代码可以在DataGrid的Item 中产生颜色交替的效果。 private void dg_ItemDataBound(object sender, DataGridItemEve…

SharePoint 2010 自定义日志

7/6/2012 How to log to the SharePoint ULS Logs(Clean Debugging and Error Logging broken down into steps) By: Philip Stathis 原文地址 http://www.thesharepointblog.net/Lists/Posts/Post.aspx?ID122 This article is meant to introduce a simple error logging rou…

使用Bot Service创建Bot Framework

创建Bot Service&#xff1a;进入至Azure控制台中&#xff0c;新建Bot Service&#xff0c;如不知道Bot Service在哪个选项中&#xff0c;可以先查找Bot Service再创建 在弹出的查询结果中&#xff0c;选择Bot Service&#xff0c;点击后会进入至下一个步骤 在弹出的Bot Servic…

[转]大三下,我们该做什么?一篇被转万次的日志,你值得一看

大三下&#xff0c;我们该做什么&#xff1f;一篇被转万次的日志&#xff0c;你值得一看 还有几个月&#xff0c;你就不得不参加考研、就业大军了&#xff0c;你做好准备了么&#xff1f;你知道211学校、985学校和非211、985的主要区别么&#xff1f;找工作机会一定是不均等的。…

如何在DataGrid里面产生滚动条而不滚动题头

作者Blog&#xff1a;http://blog.csdn.net/cuike519/ 我们在开发的时候一定遇到&#xff0c;使用DataGrid的时候由于不想分页&#xff08;数据没有那么多&#xff09;但是又显示不在一页里面&#xff0c;此时我们希望在DataGrid里面出现一个滚动条&#xff0c;可以上下滚动Dat…