android分包原理--MultiDex

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虚拟机执行程序





你可能感兴趣的:(android)