-
Notifications
You must be signed in to change notification settings - Fork 43
Android编译及Dex过程源码分析
cheyiliu edited this page Jul 8, 2016
·
2 revisions
从createTasksForVariantData()方法中,我们可以看到依次创建了如下task:
sourceGenTask,resGenTask,assetGenTask
checkManifestTask
process the manifest(s) task
create the res values task
compile renderscript files task
merge the resource folders task
merge the asset folders task
create the BuildConfig class task
process the Android Resources and generate source files task
process the java resources task
process the aidl task
compile task
NDK tasks
final packaging task,zipalign task
lint tasks
关于multi-dex生成dex过程
若当前预估最大方法数超过单个Dex允许最大方法数时:
(1)若maxMethodIdsInProcess > 0,说明当前还有类在进行类转换,
还未写入到dex中,此时应阻塞,等待dex写入操作完成。
若所有类转换操作已完成,且dex中已经填充满,此时将填充满的dex转换成byte[],
并放到List<byte[]> dexOutputArrays列表中。
然后创建新的dex。若预估的最大方法数超出了dex的容量,则跳出循环。
从上面可以看出,multi-dex过程中,需要等到dex写入操作完成,
才能继续进行后面的类转化操作。
如果multiDexEnabled,则先处理main dex list中的class并写入main sex。
如果minifyEnabled,则为了将main dex最小化,需要创建secondary sex,
并将main dex list之外的类写入从dex。
对于非multiDexEnabled的情况,则只创建一个dex。
(2)将上面得到的List<byte[]>列表,依次写到classes.dex,classes2.dex,classes3.dex…
总结
构建一个apk的入口为BasePlugin.apply(Project),构建过程由各种Android Tasks组成。
其中Compile Task,用于将.java文件编译成.class文件。
对于PostCompile Task,如果支持multi dex,则先生成manifest_keep.txt,
maindexlist.txt文件并对组件类进行混淆操作。最后另起一个进程将.class写入dex包。
具体来说,关于.class文件到dex写入过程主要为:
(1)将class进行类转换处理
(2)将转换后的类写入到dex中(multidex会创建多个dex)
(3)将dex转换成byte[]
(4)将byte[]列表依次写入到classes.dex, classes2.dex, classes3.dex…
本文并没有讲述manifest_keep.txt,maindexlist.txt生成原理,需要等到后面研究了之后再写。
可能也没有讲清楚或有遗漏,欢迎指正。
Just build something.