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





更多相关文章

  1. Android资源加载机制
  2. Android(安卓)6.0 读写SD卡权限问题(续)
  3. [Android(安卓)SQLite]数据存储与访问 - 内部存储
  4. 常用到的Android命令(持续更新)
  5. java.io.IOException: open failed: EINVAL (Invalid argument)
  6. android 9.0 访问http
  7. Android(安卓)自定义 attr
  8. 图片切换ImageSwitcher&Gallery
  9. Http的请求方式

随机推荐

  1. 【记录】Android(安卓)广播的发送与接收
  2. Android(安卓)WebView 缓存处理
  3. View绘制流程源码解析-第一篇
  4. android之旅(一)简单布局
  5. AS 配置使用NDK
  6. Android之监测database的改变--notifyCha
  7. Android(安卓)-- 自定义View
  8. Android(安卓)view 滑动事件冲突解决方法
  9. Android(安卓)Fragment 体系源码跟踪笔记
  10. 使用 Intel HAXM 为 Android(安卓)模拟器