关于测试:Android模拟器的设备标识符

Device identifier of Android emulator

我想在模拟器中测试一个依赖于设备标识符(ANDROID_ID)的应用程序。

我目前使用以下代码获取设备标识符:

1
final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

当我在模拟器中运行它时,它返回null,这给我带来了各种各样的问题。 似乎更高的Android版本它返回了一些东西。

有没有办法在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 */

因此,你将永远得到null

如果您仍然希望将这些ID号用于测试,并且希望为仿真器和真实设备保留相同的代码,则必须以某种方式在模拟器中更改它。

至少有两种方法可以做到:

  • 更改代码中的值并重新编译模拟器的代码。但是,这可能太复杂而且耗时...... :-)

  • "破解"模拟器二进制文件(因为它既没有压缩也没有加密 - 你可以做到!)并在那里修改字符串(在正确的位置)。

  • 这是怎么做的:

    • 备份模拟器二进制文件(稍后回滚!)。在Windows中,二进制文件可以在名为"emulator.exe"的位置找到,位于android" tools"文件夹中。

    • 用您喜欢的十六进制编辑器打开二进制文

    • 搜索+ CGSN字符串后跟一个空字节(后面跟着IMEI号码的15位数 - 请参阅下面的打印屏幕)

    alt text

    • 编辑号码(注意不要更改数字的原始号码)

    • 并保存文件!

    • 并且可能更改/调整您的代码以使用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中,它调用at_send_command_numeric()来读取值。我认为必须更改为at_send_command_singleline()以支持MEID字符串(通常是以"A"开头的14个十六进制数字)。除非你真的很聪明并且可以在二进制文件中找到并交换函数地址,否则你必须在修补它之后从源代码构建它以使用与某些手机相同的值。