본문 바로가기

Android

블루스택, 윈드로이, 지니모션 구분하기

광고 sdk를 만들면서 블루스택 윈드로이 지니모션과 같은 에뮬레이터를 필터링해달라는 요청이 있습니다.


윈드로이와 지니모션같은 경우 Build.BRAND나 Build.MODEL, Build.PRODUCT 등과 같은 정보로 확인이 가능했습니다.

TextView tv = (TextView) findViewById(R.id.textView1);

String info = "";

TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

String networkinfo = telManager.getNetworkOperatorName(); 

info+="BOARD ="+Build.BOARD+"\n";

info+="BRAND ="+Build.BRAND+"\n";

info+="DEVICE ="+Build.DEVICE+"\n";

info+="FINGERPRINT ="+Build.FINGERPRINT.startsWith("generic")+"\n";

info+="DISPLAY ="+Build.DISPLAY+"\n";

info+="MANUFACTURER ="+Build.MANUFACTURER+"\n";

info+="MODEL ="+Build.MODEL+"\n";

info+="PRODUCT ="+Build.PRODUCT+"\n";

info+="networkinfo ="+networkinfo+"\n";

SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);

if (manager.getSensorList(Sensor.TYPE_ALL).isEmpty()) {

   // running on an emulator

info+="running on an emulator!!";

} else {

   // running on a device

info+="running on an device!!";

}


위 소스로 각 에뮬로 실행한 결과

[ 블루스택 ] 


[ 윈드로이 ] 


[ 지니모션 ]


문제는 블루스택... 따라서 블루스택을 확인하기위해 각 시스템에 돌고있는 서비스를 체크하기로하였습니다.

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

List<RunningAppProcessInfo> list = am.getRunningAppProcesses();

List<RunningServiceInfo> listservice = am.getRunningServices(Integer.MAX_VALUE);



for(int i = 0; i < listservice.size(); i++) {

//실행중인 서비스 이름(패키지명)

info+=(listservice.get(i).process)+"\n";

}


info+="======================================\n";

for(int i = 0; i < list.size(); i++) {

//실행중인 프로세스 이름(패키지명)

info+=(list.get(i).processName+"\n");

}


결국 블루스택의 경우 서비스체크 윈드로이나 지니모션은 MANUFACTURER 를 체크하면 될듯합니다


오늘도 화이팅