android分包原理--MultiDex
16lz
2021-01-26
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 blocke.printStackTrace();}}private static void print(URL[] murlsUrls) {for(URL url:murlsUrls){System.out.println(url);}}
4.Android常用类加载器:PathClassLoader:加载/data/app目录下的apk文件,从这个目录来看,主要用来加载已经安装好的apkDexClassLoader:加载路径需要在创建DexClassLoader时传入,也就是说可以加载任何路径下的apk/dex/jar
5.android分包ant:配合eclipse使用,修改gradle.xml中引用的custom_rules.xml,在其中定义分包,在自定义的application中使PathClassLoader继承DexClassLoader,DexClassLoader继承BootClassLoadergradle:配合androidstudio使用
apk文件:android安装包dex文件:android dalvik虚拟机执行程序
更多相关文章
- Android资源加载机制
- Android(安卓)6.0 读写SD卡权限问题(续)
- [Android(安卓)SQLite]数据存储与访问 - 内部存储
- 常用到的Android命令(持续更新)
- java.io.IOException: open failed: EINVAL (Invalid argument)
- android 9.0 访问http
- Android(安卓)自定义 attr
- 图片切换ImageSwitcher&Gallery
- Http的请求方式