Android識別模擬器,判斷是模擬器還是真機

2020-09-27 08:00:52

前言

對於android開發者來說,模擬器是開發工具,但是對使用者來說,可能就是薅羊毛找漏洞的賺錢工具。

不管是活動風控還是內容保護等等其他的出發點,應要求可能會要識別Android模擬器,甚至禁止模擬器登入或後續操作。

今天做個簡單的探討。

原理

識別模擬器的原理,其實就是找出模擬器真機的差別,但是這些差別體現在哪呢,比如運營商、手機卡、藍芽、各種感測器等等。

但是現在的模擬器也是越來越厲害了,可以模擬不同品牌不同型號不同版本的手機,而且有藍芽、可以打電話。

是不是很頭疼,一不小心就會誤判了,所以現在市面上有一種方案也是根據模擬器和真機差別的次數來做一個容錯機制,比如模擬器和真機超過3個差別,就判為模擬器。

但是實際上,有的老版本手機甚至還不如模擬器先進…所以容錯機制中還可以加上對使用者的區別對待,個別使用者不檢測等等。

禁止模擬器安裝apk

模擬器一般的cpu架構都是x86的,我們可以在build.gradle中去掉對x86的支援。

        ndk {
            // 設定支援的SO庫架構
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }

當然也有一些手機可能也是x86的,這就誤判了,因為目前來說還沒有比較完善的解決方案,所以前面所說的容錯機制就比較重要了。

僅僅是去掉x86的支援還是不夠的,因為有的模擬器也不是x86架構,所以還是要進一步找出模擬器和真機的區別。

當然也可以不禁止,識別出來就行。

程式碼識別

這裡還是原理中提到的,判斷有沒有藍芽、序列號、感測器、cpu架構等等多重判斷。

這裡推薦一個庫:CacheEmulatorChecker

呼叫也比較簡單,一行程式碼即可:

       val emulator = EmulatorDetectUtil.isEmulator(this)
        if (emulator) {
            ToastUtils.show(this, "檢測到您的裝置可能為模擬器", Toast.LENGTH_LONG)
        }

驗證

禁止加程式碼識別的方案,目前驗證過的模擬器:

  • 逍遙模擬器
  • 藍疊模擬器
  • 夜神模擬器
  • 天天模擬器
  • 騰訊手遊助手
  • 雷電模擬器
  • MUMU模擬器
  • 魯大師手機模擬大師

以及各種主流手機品牌的主流機型,測試ok

最後

目前來說,還是沒有完善且公開的解決方案,所以為避免誤判,還是要根據自己的業務做相關的容錯機制,比如給user加個是否要判斷的欄位,要的情況下再判斷,否則放過。

看到最後,如果你有更好的方法,歡迎討論。