這里
北大青鳥深圳嘉華老師將分享一些關(guān)于安卓開發(fā)教程中的加殼技術(shù)。希望能對想學(xué)安卓開發(fā)、或者是安卓開發(fā)工程師們有所幫助。
一、加殼技術(shù)原理
所謂apk的加殼技術(shù)和pc exe的加殼原理一樣,就是在程序的外面再包裹上另外一段代碼,保護里面的代碼不被非法修改或反編譯,在程序運行的時候優(yōu)先取得程序的控制權(quán)做一些我們自己想做的工作。
PC exe的加殼過程如下:
二、android apk加殼實現(xiàn)
要想實現(xiàn)加殼需要解決的技術(shù)點如下:
(1)怎么第一時間執(zhí)行我們的加殼程序?
首先根據(jù)上面的原理我們在apk中要想優(yōu)先取得程序的控制權(quán)作為android apk的開發(fā)人員都知道Application會被系統(tǒng)第一時間調(diào)用而我們的程序也會放在這里執(zhí)行。
(2)怎么將我們的加殼程序和原有的android apk文件合并到一起?
我們知道android apk最終會打包生成dex文件,我們可以將我們的程序生成dex文件后,將我們要進行加殼的apk和我們dex文件合并成一個文件,然后修改dex文件頭中的checksum、signature 和file_size的信息,并且要附加加殼的apk的長度信息在dex文件中,以便我們進行解殼保證原來apk的正常運行。加完殼后整個文件的結(jié)構(gòu)如下:
(3)怎么將原來的apk正常的運行起來?
按照(2)中的合并方式在當(dāng)我們的程序首先運行起來后,逆向讀取dex文件獲取原來的apk文件通過DexClassLoader動態(tài)加載。
具體實現(xiàn)如下:
(1)修改原來apk的AndroidMainfest.xml文件,假如原來apk的AndroidMainfest.xml文件內(nèi)容如下:
1. <application
2. android:icon="@drawable/ic_launcher"
3. android:label="@string/app_name"
4. android:theme="@style/AppTheme" android:name="com.android.MyApplication" >
5. </application>
修改后的內(nèi)容如下:
1. <application
2.android:icon="@drawable/ic_launcher"
3. android:label="@string/app_name"
4. android:theme="@style/AppTheme" android:name="com.android.shellApplication" >
5.<meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.android.MyApplication"/>
6. </application>
com.android.shellApplication這個就是我們的程序的的application的名稱,而
7.<meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.android.MyApplication"/>
是原來的apk的application名稱。
(2)合并文件代碼實現(xiàn)如下:
- 在我們的程序中加載運行原來的apk文件,代碼如下: