android真機和模擬器(emulator)的判斷

最近收到領導需求要判斷真機和模擬器。先前項目裏是有的。可能當時能用,但現在都不能用了。然後,baidu上能夠找到的其實都不能用了。包括說使用cache來區分cpu架構是哈佛結構還是馮諾伊曼結構來判斷的——這個其實是最不靠譜的,因爲硬件結構是會優化的,並且也不會是一成不變的。各位可以自行去查看一下arm架構cpu內核所採用的結構,包括pc的cpu所採用的結構就會明白我爲什麼這麼說了。但還是要肯定一下最初提出這個思路並給出代碼的同學,是真的很厲害,可惜思路偏了。但copy機器碼到內存中再去執行的思路可以學習一下。

判斷真機還是模擬器,通過cpu信息是個好的思路,因爲至少目前來講,intel和amd公司基本上是以pc的cpu爲主,絕大部分手機的cpu使用的是arm架構的cpu。那個讀取 /proc/cpuinfo的就算了,因爲這個是個虛擬文件,下載linux的內核源碼看一下就知道,修改它是很容易的。android系統就是基於linux的。x86架構的cpu提供了一個cpuid的彙編指令,但這個不適用於arm架構的。arm架構的cpu廠商信息是通過cp15協處理器來存放的,但這個我看不懂linux裏面操作它獲取信息的源碼,放棄。

linux有提供很多有用的命令和信息。但有些命令到了android7.0之後去執行是需要root權限的,不過這個不要緊,android模擬器本身就不會不root,原因大家想一下也會明白。鑑於我們項目才使用上cpu這個判斷方式,爲了防止模擬器廠商馬上就把這個判斷給堵住了,我不太方便把判斷代碼直接貼出來,希望看到這文章的同學們能夠理解。下面是幾種方式的具體思路,任意一種都可以區分開來:

1,通過查看cpu信息,簡單粗暴的認爲當前環境爲intel和amd公司的cpu時,就是在模擬器上跑。

2,通過查看是否有鍵盤

3,通過查看usb信息

4,通過查看硬盤容量

另,請在c++代碼中使用 popen 命令來執行,具體命令裏再配合 grep 命令。相信各位同學一定知道怎麼做了。

下面是兩行關鍵的僞代碼。祝大家順利。

FILE *fp = popen(YOUR_CMD, "r");

fgets(buf, buf_size, fp)

如果用盡全力折騰一段時間而又的確需要這個判斷又實在不知道怎麼寫代碼的話,可以郵件我: [email protected]

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