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中函 ...
随机推荐
- IPFS扫盲
第二届深圳区块链技术与应用大会暨展览会,深圳区块链存储与IPFS技术应用大会暨展览会于2019年4月9日在深圳会展中心6号馆举行.那么这个IPFS是什么?和区块链有什么关系?有什么用?又怎么用呢?接下 ...
- C++文件输入和创建
#include <fstream> //头文件 ifstream inf; ofstream ouf; inf.open("zy4.txt", ios::out); ...
- Java读取txt文件和写入txt文件
package com.nickwong.code; import java.io.*; /** * Created by Nickwong on 31/07/2018. * 根据1-8楼的建议,优化 ...
- GNOME 系统设置
详细的GNOME系统设置全文,参见这里. 以下摘录使用到的部分. 1. 在任务栏上显示日期或周几(二选一).秒数 $ gsettings set org.gnome.desktop.interface ...
- 带你领略Linux系统发展及版本更迭
Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...
- 关于input
form表单的使用: 1.iuput:type:类型有很多常用的: text:输入的内容为文本格式(内容可见) password:输入的内容为......(内容不可见) radio:显示为单选框(框为 ...
- python之路-----python操作 mysql
========================pymysql============================ 一.pymysql 基础 安装命令:pip3 install pymysql - ...
- 常见类 Object
1.在Java类继承结构中Java.lang.Object类位于顶端 2.如果定义一个Object类没有使用extends关键字声明其父类,则其父类为Java.lang.Object类 3.Objec ...
- 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from functools import reduce CHAR_TO_INT = { ': 0, ': ...
- elasticsearch kabana中创建索引
在kabana中创建索引和索引类型语法 PUT clockin{ "mappings": { "time": { } }} 查询索引下的所有数据 GET clo ...