Device identifier of Android emulator
我想在模拟器中测试一个依赖于设备标识符(ANDROID_ID)的应用程序。
我目前使用以下代码获取设备标识符:
1 | final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); |
当我在模拟器中运行它时,它返回
有没有办法在Android模拟器中获取设备标识符? 我是否错误地获取了设备ID?
也许可以通过控制台设置模拟器的设备标识符?
在模拟器中,IMEI和IMSI的值是硬编码的:
1 2 | 2325 {"+CIMI", OPERATOR_HOME_MCCMNC"000000000", NULL }, /* request internation subscriber identification number */ 2326 {"+CGSN","000000000000000", NULL }, /* request model version */ |
因此,你将永远得到
如果您仍然希望将这些ID号用于测试,并且希望为仿真器和真实设备保留相同的代码,则必须以某种方式在模拟器中更改它。
至少有两种方法可以做到:
更改代码中的值并重新编译模拟器的代码。但是,这可能太复杂而且耗时...... :-)
"破解"模拟器二进制文件(因为它既没有压缩也没有加密 - 你可以做到!)并在那里修改字符串(在正确的位置)。
这是怎么做的:
-
备份模拟器二进制文件(稍后回滚!)。在Windows中,二进制文件可以在名为"emulator.exe"的位置找到,位于android" tools"文件夹中。
-
用您喜欢的十六进制编辑器打开二进制文
-
搜索+ CGSN字符串后跟一个空字节(后面跟着IMEI号码的15位数 - 请参阅下面的打印屏幕)
-
编辑号码(注意不要更改数字的原始号码)
-
并保存文件!
-
并且可能更改/调整您的代码以使用IMEI作为您的id(如
Falmari 指出),或使用此技巧更改其他一些值。
如果你想要非null模拟器uuid,那么启动模拟器如下:
1 | emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66 |
正如Falmarri所说,设备Id在模拟器中将为0。
我使用这种方法根据参数的组合生成一个唯一的设备ID(它似乎对我有用,虽然我没有广泛测试它 - 模拟器和HTC Desire) - 这不是我的方法(我不记得了)我把它挖出来的地方 - 但它归于哪里归属)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * Creates a UUID specific to the device. There are possibly some instances where this does * not work e.g. in the emulator or if there is no SIM in the phone. */ public static void setDeviceUUID(Context context) { final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, androidId; tmDevice ="" + tm.getDeviceId(); tmSerial ="" + tm.getSimSerialNumber(); androidId ="" + Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); deviceMobileNo = tm.getLine1Number(); UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); deviceUUID = deviceUuid.toString(); } |
希望这可以帮助。
破解模拟器二进制文件以放入备用值是很好的。但是,它必须以十进制数字开头,因为在reference-ril.c中,它调用