Android檢測模擬器

1. 前言

模擬器大家都應該很熟悉的吧!現在市面上的模擬器多的數不清,例如:雷電模擬器、夜神模擬器等等。而因爲模擬器所搭載的Android系統是閹割過的,一些安全相關的功能都沒有了。這就造成了一個安全問題,在模擬器運行的APP,可被動態調試、抓取數據等,從而增大APP被破解、敏感數據遭泄露的風險。所以一些公司就會禁止用戶在模擬器中使用他們的APP。

那怎麼檢測APP當前運行的環境是模擬器呢?接下來我就介紹一個方案給大家吧!

2. 解決方案

網上相關資料其實蠻多的,但是因爲模擬器的技術也在逐步增長,所以有些資料其實並沒有完全有用,還是會出現無法檢測某些模擬器。

我在GitHub上發現了一個開源項目 anti-emulator 。經測試可以檢測出市面上較常用的模擬器。我將關鍵代碼提取了出來,封裝成一個module,詳見 lib_anti_emulator

我封裝了兩個方法,如下所示:

/**
 * 檢測是否是模擬器
 *
 * @param context 上下文
 * @return true:是模擬器;false:不是模擬器
 */
public static boolean check(Context context) {
    try {
        return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()
                || isQEmuEnvDetected(context);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

/**
 * 檢測是否是模擬器,安全模式<br>
 * 機制較弱,可避免部分真機被識別爲模擬器,但是這也造成了有些模擬器無法被識別
 *
 * @param context 上下文
 * @return true:是模擬器;false:不是模擬器
 */
public static boolean checkSafely(Context context) {
    try {
        return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()
                || isQEmuEnvSafeDetected(context);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

這兩個方法的區分,看註釋大家也應該很清楚了。而這也是 anti-emulator 的最大缺點,可以說是檢測機制太強,或者說某些真機系統被魔改了,造成真機會被錯誤識別爲模擬器的bug。所以如果使用 check 方法,爲了避免用戶無法正常使用APP,就需要我們再做一些處理,例如當被檢測爲模擬器時,可以彈出窗口,引導用戶上報相關真機信息,然後後臺審覈並記錄這些信息,將此用戶所使用的真機加入白名單,免檢測模擬器。

當然如果APP不需要這麼強的檢測機制的話,那就用 checkSafely 方法就行了。

3. 演示

我在我的 BlogDemo 中已加入演示代碼,感興趣的可以去看看。下面是演示的相關內容,演示環境是雷電模擬器。

3.1 標準模式

能夠正確檢測模擬器,提示“是模擬器”。

使用標準模式

3.2 安全模式

不能夠正確檢測模擬器,提示“不是模擬器”。PS:雷電模擬器的仿真程度真高,所以平時大家調試APP的時候,如果不想用真機,可以試試雷電模擬器哦!比起 Android Studio 自帶的模擬器,不會那麼喫 CPU 和內存。

使用安全模式


如果想進一步交流和學習的同學,可以加一下QQ羣哦!

Android開發者羣號:371529514

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章