Android方法引用超过65535的解决方式
//在app/build.gradle
android {
compileSdkVersion
buildToolsVersion "24.0.1"
defaultConfig {
...
minSdkVersion
targetSdkVersion
...
// 设置支持multidex
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
在application的子类(如果你需要子类的话)
package com.example; import android.app.Application;
import android.content.Context; /**
*
*/
public class MyApplication extends Application { @Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
如果你不需要application的子类直接继承multiDexApplication
package com.example; import android.support.multidex.MultiDexApplication;
import android.content.Context; /**
* Extended MultiDexApplication
*/
public class MyApplication extends MultiDexApplication { // 不需要重写attachBaseContext() //..........
}
dex是Android的java代码编译的一种文件格式,早期的Android直接在Dalvik虚拟机中加载和执行二进制的dex文件,Android4,4以后添加一种新的应用运行模式叫ART,他会在程序运行前即安装的时候进行一次预编译,将dex文件转换成机器代码存在本地,
这种文件格式的缺点就是Android代码的方法数量参照的单一二进制,因为文件格式的很大一部分存储的数字是两个字节的长度,即方法的最大数目是65535,如果一个应用的方法引用超过这个数字编译就会失败;
Google已经提供了一种方式叫Multidex;它包含编译时和运行时两个部分,从名字上可以看出来,在编译时它会将代码分成两个或更多的dex文件,在运行时,它会告诉类加载器怎样从这些dex文件中找到对应的类文件,但是这种方式也有一定的缺陷,它会增大程序启动的时间并且在老的机器上能造成程序无响应;应该怎样避免呢?
如果你的方法达到640000或以上,那你就应该设法减少你代码的方法引用或是类库中个的方法引用,怎么做呢如下:
1,看一下程序的直接和间接的依赖关系:添加一个大型的依赖库比你把相关的代码导入到程序中要更好,
2,使用ProGuard工具减少你不使用的代码
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
'proguard-rules.pro'
}
}
}
minifyEnabled true :
The getDefaultProguardFile(‘proguard-android.txt') 默认的规则
The proguard-rules.可以自定义规则
Android引入第三方SDK混淆报错shrinkDebugMultiDexComponents的解决方案
项目工程中,引用了一个第三方的SDK,它的jar包是已经混淆过的。在IDE下代码编译没问题,但是运行在手机上就报错。
Error:Execution failed for task ‘:app:shrinkDebugMultiDexComponents’.
java.io.IOException: Can’t read [src\app\build\intermediates\multi-dex\debug\allclasses.jar] (Can’t process class [com/dvrcam/DvrCamSDK/a$d.class] (Unknown verification type [255] in stack map frame))
大致意思是jar包目录com/dvrcam/DvrCamSDK/a/下的内部类d.class混淆失败。
解决方案
在工程的根目录下创建一个文件夹proguard,放入proguard.jar文件,下载地址:proguard.jar

在根目录的build.gradle文件中加入
flatDir { dirs ‘proguard’ } 和 classpath ‘proguard.io:proguard:5.2.1’
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
flatDir { dirs 'proguard' }//1.依赖库类目录
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'proguard.io:proguard:5.2.1'//2.依赖的库类
}
} allprojects {
repositories {
jcenter()
}
}
按照以上步骤操作,就能运行成功!
Android方法引用超过65535的解决方式的更多相关文章
- Android加载图片OOM错误解决方式
前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...
- Android方法引用数超过65535优雅解决
随着应用不断迭代更新,业务线的扩展,应用越来越大(比如:集成了各种第三方SDK或者公共开源的Library文件.jar文件)这样一来,项目耦合性就很高,重复作用的类就越来越多了,SO:问题就来了.相信 ...
- Android工程方法数超过65535的解决办法
Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.com.android.build.api.transfo ...
- 如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k
一:问题描述: 应用中的Dex 文件方法数超过了最大值65536的上限,简单来说,应用爆棚了. 二.解决方案: 方案1:使用插件化框架 比如: https://github.com ...
- Android自己主动化測试解决方式
如今,已经有大量的Android自己主动化測试架构或工具可供我们使用,当中包含:Activity Instrumentation, MonkeyRunner, Robotium, 以及Robolect ...
- Google Android API官网封杀了,没法查android技术资料的3种解决方式
1.从uhdesk上訪问简化版android api在线文档(反应速度极快) http://www.uhdesk.com/simpleandroidoc/index.html 2.下载chm本地文 ...
- SafeNet推出行业首款白盒password软件保护解决方式
数据保护领域的全球率先企业SafeNet公司日前宣布,推出行业首款採用白盒安全技术的的软件保护方案.SafeNet 圣天诺 软件授权与保护解决方式如今纳入了新的功能,可在"白盒" ...
- 解决Android单个dex文件不能超过65535个方法问题
一.找坑:谷歌规定单个dex文件中的方法不能超过65536的限制 我们编写项目过程中在工程的lib文件夹下引用的第三方插件jar包太多或者项目过大,编译运行时就有可能报出com.android.dex ...
- Building Apps with Over 65K Methods(解决APP引用方法总数超过65536)
本文翻译自http://developer.android.com/intl/zh-cn/tools/building/multidex.html#about.主要介绍当我们Android App中函 ...
随机推荐
- 2019/2/23Scala学习开始(Scala简介)
Scala简介 Scala是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性. Scala运行在Java虚拟机上,并兼容现有的Java程序 ...
- C语言实现过滤ASCII在0~127范围内的字符,并去除重复的字符
#include <stdio.h> #include <string.h> /* 1.以字符串作为参数 2.找出ASCII在1~127范围内的字符 3.去掉重复字符 */ i ...
- linux服务器上使用find查杀webshell木马方法
本文转自:http://ju.outofmemory.cn/entry/256317 只要从事互联网web开发的,都会碰上web站点被入侵的情况.这里我把查杀的一些方法采用随记的形式记录一下,一是方便 ...
- Win10安装.NetFamework3.5
步骤1:装载Win10安装镜像 本人用的是"cn_windows_10_multiple_editions_x64_dvd_6848463.iso" 如图,我把镜像装载到H盘; 步 ...
- kali ssh远程连接过程
准备工具: kali系统,secureCRT, 首先在kali系统中配置ssh文件,我们知道linux总是把所有的配置管理信息当作文件处理,所以对ssh的配置也是相当于对文件的编辑. vi /etc/ ...
- winform 所遇
主程序调用客程序: 方法一: Process.Start( System.Windows.Forms.Application.StartupPath + "\\SelfUpdate.exe& ...
- js dictionary
转载的 1.dictionary例子 <script type="text/javascript" language="javascript"> v ...
- Road of computer tec 01
回顾自己过去将近3年的学习经历 当初报考的时候,自己是真正喜欢这个专业的么? 当初报这个专业的时候,对计算机还没有什么很明显的概念,只知道这个专业以后是要每天面对电脑的,喜欢不喜欢谈不上吧,但是还蛮感 ...
- 【Alpha】测试报告
测试中发现的Bug 测试伴随着前后端的首次连接之后与开发一起进行,在本阶段,我们遇到了各种各样的bug,有些体现在功能上,有些虽然不会影响到具体的功能实现,但是会影响到用户体验.由于时间问题,我们对其 ...
- Java中的静态和枚举
一.静态成员 对静态成员最简单的解释,静态成员属于整个类而不属于某个对象,所以又叫做类变量.一个类不管创建多少个实例对象,静态变量在内存中有且只有一个(调用方法用类名调用). 通常的非静态变量称为实例 ...