-
如果App引用的库太多方法数超过65536後无法编译。这是因为单个dex里面不能有超过65536个方法为什么有最大的限制呢, 因为android会把每一个类的方法id检索起来存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的 short占两个字节(保存-2的15次方到2的15次方-1,即-)最大保存的数量就是65536。新版本的Android系统中修复了這个问题 但是我们仍然需要对低版本的Android系统做兼容怎么设置。
-
下面从DEX自动拆包和动态加载两方面来分析
- 根据main-dex-list对整个工程编译后的所有class進行拆分,将主、从dex的class文件分开;
- 用dx工具对主、从dex的class文件分别打包成 .dex文件并放在apk的合适目录。
Proguard的官网执行步骤如下:
在 shrink 这一步proguard 会根据 keep 規则保留需要的类和类成员,并丢弃不需要的类和类成员也就是说,上面 shrink 步骤生成的临时 jar 包里面保留了符合 keep 规则的类这些类是需要放茬主 dex 中的入口类。
但是仅有这些入口类放在主 dex 还不够还要找出入口类引用的其他类,不然仍然会在启动时出现 NoClassDefFoundError而找出这些引用类,就昰调用的 com.android.multidex.MainDexListBuilder它的部分核心代码如下:
-
中的从 dex 流程如下: