通常我們在Android應(yīng)用中執(zhí)行某個命令時會使用“Runtime.getRuntime().exec("命令路徑")”這種方式,但是當(dāng)我們執(zhí)行抓包操作時,使用這條命令無論如何都不行,通過下面代碼打印結(jié)果發(fā)現(xiàn),該命令一定要在root權(quán)限下才能執(zhí)行。

BufferedReader brW = new BufferedReader(new InputStreamReader(p.getErrorStream())); while((str = brW.readLine()) != null)
    Log.d("cwmp", "w:"+str);

但是我們的Android設(shè)備(包括機頂盒、手機等)通常并沒有root過,apk的最高權(quán)限也只是system權(quán)限,這該怎么解決?首先我們要知道,方法總比問題多,在Android設(shè)備的/system/bin路徑下,我們會看到很多二進(jìn)制文件,這些二進(jìn)制文件可以獲得root權(quán)限。因此,我們可以通過C語言來實現(xiàn)抓包功能,通過NDK把該C代碼交叉編譯成二進(jìn)制文件置于/system/bin路徑下,并賦予其root權(quán)限,此時,這個二進(jìn)制文件就具備了抓包能力了?,F(xiàn)在問題又來了,我們現(xiàn)在是想通過apk去調(diào)用這個抓包指定,抓包完成后又該怎么通知apk呢?其實,Android可以通過socket使底層與framework層進(jìn)行通信,具體請參考博文android使用socket使底層和framework通信”。接下來我們將貼出關(guān)鍵實現(xiàn)代碼。

1、編寫socket服務(wù)端代碼fstiService.cpp,生成可執(zhí)行腳本fstiService