天天看點

深入分析Android native exception架構

1. Native application

    本地應用程式是指可以直接運作在作業系統上,并且處理器直接執行機器碼的程式。

        比如windows上的各種*.exe的程式,而linux上的是各種bin程式。

    在Android上,OS是linux,是以各種bin程式就是所謂natvie application了,比如/system/bin目錄下的所有檔案。

    這些應用程式都是由GCC(c/c++)編譯生成。

    在Android軟體架構裡,這些應用程式組成了native layer:

深入分析Android native exception架構

2. Native Exception

    native layer裡的應用程式崩潰統稱為Native Exception,比如空指針,非法指針,程式跑飛,記憶體踩壞等,好比像windows下,程式崩潰彈出某某位址不能為read/write。

3. 總流程圖

    原始的linux,對于使用者程序崩潰之後,處理方式有2種:直接終止程序;輸出coredump再終止程序。

    而在Android,為了友善調試,在收到崩潰信号後,會先輸出tombstone,然後在根據設定是否抓取coredump,最後再終止程序。而我司在這之上還會将coredump及其他關鍵資訊打包。

    以下是完整的NE處理流程圖:

深入分析Android native exception架構

4. 例子

    我們以1個NE的例子來将流程走一遍。

    首先寫test.c:

深入分析Android native exception架構

    然後編寫Android.mk:

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=test.c

LOCAL_MODULE:=test

include $(BUILD_EXECUTABLE)

    編譯後将test推送到手機端,然後執行它,其中走過的函數步驟如下:

深入分析Android native exception架構

    當走到d()函數(也就是第6步之後)時必然産生1個NE。