标签:
Android插件技术已经出来很久了,从包建强大大的那篇《Android插件化:从入门到放弃》出来以后,插件化技术的场景也明朗了。
app插件牵涉到很多基础
过程分析,首先从launcher上面点击app图标,然后到activity的OnResume。
在AMS里面调用startProcessLocked,首先开启一个新的进程,同步一个主线程。
上图是启动默认activity的流程。
1.1launcher->AMS(system_server) launcher 首先发送启动activity的请求
1.2AMS判断该请求为新的app创建请求,该流程非常复杂,最终会走到startProcessLocked, 创建process:
Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
app.info.dataDir, refreshTheme, entryPointArgs);
1.3 调用Zygote启动新的进程,其实就是fork一个标准的进程。
1.4 启动activityThread.main方法,获取name之类的参数,绑定到zygote启动的新进程。
1.5 把新进程bind 到AMS。
1.6 AMS启动新进程里面的activity。
第一步:打包资源文件,生成R.java。
首先看aapt的源码:Resource.cpp 里面关键函数buildResources
buildResource里面,检测AndroidManifest.xml的合法性,然后开始makeFileReource,把res下的资源文件
加入到ResourceTable中。调用compileResourceFiles,把value-xml文件解析,然后加入到resource.arsc 文件。
compileResourceFiles最终会调用parseAndAddEntry, 把资源写入到R.java中。
然后是调用compileXmlFiles,处理其他的drawable,anim,layout等xml文件。
resource.arsc 就是ResouceTable。关于这个文件的解析:http://www.cnblogs.com/feng9exe/p/5676802.html
最终aapt会把assect里面的files,resource.arsc,AndroidManifest.xml等统一打包为“*.ap_”文件。
第二步:AIDL编译 生成对应的.java文件。AIDL的编译过程其实就是把AIDL文件自动生成java文件,生成后放在bin\classes
下面。
第三步:编译工程源代码,生成class文件。
编译所有src下面的代码,生成对应的class文件。假设一般情况下,只是使用Android SDK开发而已。
第四步:把class文件编程成dex文件。dx工具主要作用就是把claass转化为dalvik使用的dex文件。消除冗余信息,压缩常量池等。
第五步:打包生成APK文件,打包工具为apkbuilder.
主要是把,resource.ap_,dex文件 打包成APK文件,但是没有签名。
这里在class文件到dex中 还有一个过程proguard。class+progroud->dex
第六步:签名,目前有2中方式,jarsinger工具,或者signapk工具。
第七步:签名后,字节需要对其,zipalign工具就是干这个事情的。
至此,整个打包过程就结束了。
标签:
原文地址:http://www.cnblogs.com/deman/p/5907837.html