Android插件技術已經出來很久了,從包建強大大的那篇《Android插件化:從入門到放棄》出來以后,插件化技術的場景也明朗了。
app插件牽涉到很多基礎
1.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。
2.apk打包流程&自動打包技術。
第一步:打包資源文件,生成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工具就是干這個事情的。
至此,整個打包過程就結束了。
