一.为什么要分包?
当方法数超过64k(65536)的上限时,超出缓冲区大小,爆棚。(具体原因再研究,占位)
二:解决办法。(之一)
1.使用android.support.multidex.jar.
2.build.gradle配置
android {
defaultConfig {
//...
multiDexEnabled true;
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
3.配置Application
public class MultidexTestApplication extends MultiDexApplication {
}
三:问题
1.Error:Execution failed for task ‘:multidextest:transformClassesWithJarMergingForDebug’.
com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex$V14.class
这个是jar包冲突引起的,编译版本自带了分包MultiDex jar包,去掉上面引入的jar即可。
四:工具
1.生成这么多方法,我是使用一个简单的Java程序弄的
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyClass {
public static void main(String arg[]) {
String fileDirPath = "D:\\Android\\as\\workspace\\TestJava\\java";
String javaClassStrStart = "package com.kongge.multidextest.pack%s;\n" +
"public class TestClass%s {\n";
String javaClassStrEnd = " \n" +
"}";
String content = "\n\tpublic void mothed%s(int a) {}\n";
File fileDir = new File(fileDirPath);
if (fileDir.exists() == false) {
fileDir.mkdirs();
}
for (int i = 0; i < 10; i++) {
String packageDirPath = fileDirPath + File.separator + "pack" + i;
File fileDirPackage = new File(packageDirPath);
if (fileDirPackage.exists() == false) {
fileDirPackage.mkdirs();
}
for (int k = 0; k < 100; k++) {
FileOutputStream fileOutputStream = null;
try {
File file = new File(packageDirPath + File.separator + "TestClass" + k + ".java");
if (file.exists()) {
file.delete();
} else {
file.createNewFile();
}
String javaClassStrStartTemp = String.format(javaClassStrStart, i, k);
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(javaClassStrStartTemp.getBytes());
for (int j = 0; j < 100; j++){
String itemString = String.format(content, j);
fileOutputStream.write(itemString.getBytes());
}
fileOutputStream.write(javaClassStrEnd.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
fileOutputStream = null;
}
}
}
}
}
}
保存成MyClass.java文件,直接使用命令行编译运行,保存地址和包名自行修改
javac MyClass.java
java MyClass