1. Native application
本地應用程式是指可以直接運作在作業系統上,并且處理器直接執行機器碼的程式。
比如windows上的各種*.exe的程式,而linux上的是各種bin程式。
在Android上,OS是linux,是以各種bin程式就是所謂natvie application了,比如/system/bin目錄下的所有檔案。
這些應用程式都是由GCC(c/c++)編譯生成。
在Android軟體架構裡,這些應用程式組成了native layer:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SMzETMwkDO2QzNxkTMzEjMxMDN0gzNwcDOzUzM28CXzVmc1R3YylGUkVGZh9GbwV1Lc12bj5yalRXYpRWZt5SZulGbu92Lc9CX6MHc0RHaiojIsJye.png)
2. Native Exception
native layer裡的應用程式崩潰統稱為Native Exception,比如空指針,非法指針,程式跑飛,記憶體踩壞等,好比像windows下,程式崩潰彈出某某位址不能為read/write。
3. 總流程圖
原始的linux,對于使用者程序崩潰之後,處理方式有2種:直接終止程序;輸出coredump再終止程序。
而在Android,為了友善調試,在收到崩潰信号後,會先輸出tombstone,然後在根據設定是否抓取coredump,最後再終止程序。而我司在這之上還會将coredump及其他關鍵資訊打包。
以下是完整的NE處理流程圖:
4. 例子
我們以1個NE的例子來将流程走一遍。
首先寫test.c:
然後編寫Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=test.c
LOCAL_MODULE:=test
include $(BUILD_EXECUTABLE)
編譯後将test推送到手機端,然後執行它,其中走過的函數步驟如下:
當走到d()函數(也就是第6步之後)時必然産生1個NE。