1.android分包原理--MultiDex
1.未分包apk包括:
--AndroidManifest.Xml
--R或者r:r是混淆后
--resource.arsc:二进制资源文件
--lib
--META-INF:签名信息
--class.dex:是一个class文件,包含整个apk的代码
2.分包apk包括:会有多个class.dex
--AndroidManifest.Xml
--R或者r:r是混淆后
--resource.arsc
--lib
--META-INF:签名信息
--class.dex:是一个class文件,包含整个apk的代码(如果class2.dex过大,启动的时候会造成ANR)
3.java中常见类加载器:(java是父委托加载机制)
1.BootstrapClassLoader:纯c++实现的,没有对应的java类,主要加载jre/lib/目录下的核心库(通过extclassloader的getParent方法获取)
2.ExtClassLoader:主要加载/jre/lib/ext/目录下的扩展包(通过appclassloader的getParent方法获取)
3.AppClassLoader:主要加载CLASSPATH路径下的包(代码中通过class文件获取类加载器,通过getUrls方法获取加载路径)
public static void main(String[] args) {
// 第一步 获取Main的类加载器
Class mainClass=Main.class;
ClassLoader mainLoader=mainClass.getClassLoader();
System.out.println("mainClass的名字"+mainLoader.toString());
//第二步 打印AppClassLoader的加载路径
URL[] murlsUrls=((URLClassLoader)mainLoader).getURLs();
print(murlsUrls);
//第三步 通过getParent方法获取mainLoader中parent字段
ClassLoader parentLoader=mainLoader.getParent();
System.out.println("parentLoader的名字"+parentLoader.toString());
//第四步 打印ExtClassLoader的加载路径
URL[] parentUrls=((URLClassLoader)parentLoader).getURLs();
print(parentUrls);
//第五步 打印BootstrapClassLoader的加载路径
try {
Class launchClass=Class.forName("sun.misc.Launcher");
Method methodGetCLassPathMethod=launchClass.getDeclaredMethod("getBootstrapClassPath", null);
if(methodGetCLassPathMethod!=null){
methodGetCLassPathMethod.setAccessible(true);
Object object=methodGetCLassPathMethod.invoke(null, null);
if(object!=null){
Method methodGetUrls=object.getClass().getDeclaredMethod("getURLs", null);
if(methodGetUrls!=null){
methodGetUrls.setAccessible(true);
URL[] murlBoot=(URL[]) methodGetUrls.invoke(object, null);
print(murlBoot);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void print(URL[] murlsUrls) {
for(URL url:murlsUrls){
System.out.println(url);
}
}
4.Android常用类加载器:
PathClassLoader:加载/data/app目录下的apk文件,从这个目录来看,主要用来加载已经安装好的apk
DexClassLoader:加载路径需要在创建DexClassLoader时传入,也就是说可以加载任何路径下的apk/dex/jar
5.android分包
ant:配合eclipse使用,修改gradle.xml中引用的custom_rules.xml,在其中定义分包,在自定义的application中使PathClassLoader继承DexClassLoader,DexClassLoader继承BootClassLoader
gradle:配合androidstudio使用
apk文件:android安装包
dex文件:android dalvik虚拟机执行程序