android 64K/65K问题 简单记录

2016-08-03  本文已影响0人  小面包屑

到底是65k还是64k?


都没错,同一个问题,不同的说法而已。

65536按1000算的话,是65k ~ 651000;

65536按1024算的话,是64k = 641024。

方法数不能超过65536 , 2的16次方。因为在Dalvik指令集里面,执行方法的invoke-kind  index 大小只给了16bit 。

使用了Google提供的解决方案, MultiDex 。  (另一个方法: compiling with Jack toolchain )

一般apk解压之后只有一个class.dex文件,使用了MultiDex之后有两个、三个 或者 N个。

编译过程:

sourceCode  ---Java Complier ---> .class Files ---Dex--> .dex files  (class.dex)

Application.attachBaseContext 执行MultiDex.install() 。

首次启动会对 class.dex/class2.dex文件执行 dexopt操作,生成ODEX文件。

非首次启动则直接从cache中读取已经执行过dexopt的ODEX文件。

问题:

安装时间长。

执行时间过长会出现ANR。

兼容性为android 4.0 以上。

5.0以后的机器,ART会把多个dex合并成oat文件。

android 2.2 或 2.3 的缓存只有5M,4.x提高到了8m或者16m

异步动态加载方案:

增加一个process(进程)来异步加载dex,在attachBaseContext里面轮询,看是否进程存在,是否已经加载完成。

加载完成后,进入Application的onCreated() 方法。

上一篇下一篇

猜你喜欢

热点阅读