在Android模拟器上更改设备ID?

monwx1rj  于 2023-06-04  发布在  Android
关注(0)|答案(8)|浏览(1434)

有没有办法更改模拟器的TelephonyManager返回的IMEI?还有,有没有办法更改Settings.Secure.ANDROID_ID返回的ID?
在服务器端存储用户数据时,我使用这些ID来区分用户。如果我的QA团队可以更改这些ID,使它们不使用同一组用户数据,那就太好了。

yqlxgs2m

yqlxgs2m1#

Settings.Secure.ANDROID_ID而言,这应该可以做到:
adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db "UPDATE secure SET value='newid' WHERE name='android_id'
其中newid通常是16位十六进制数字代码(即不要将“Android_”附加到它)。
我只在模拟器上试过这个。我想一个真实的的手机需要先扎根。

z0qdvdin

z0qdvdin2#

zyc zyc的答案是最好的一个,直到Android 7.1.1(25).从android 8开始,android_id的规则发生了变化,如官方开发人员文档中所述:https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html
在O中,Android ID(Settings.Secure.ANDROID_ID或SSAID)对于设备上的每个应用和每个用户具有不同的值。需要设备范围标识符的开发人员应该使用可重置的标识符,如广告ID,从而为用户提供更多控制。广告ID还提供了一个面向用户的设置,以限制广告跟踪。在Android O中:只要软件包名称和签名密钥相同,ANDROID_ID值就不会在软件包卸载/重新安装时更改。应用可以依赖此值在重新安装期间维护状态。如果某个应用安装在运行较早版本Android的设备上,则在设备更新为Android O时,Android ID将保持不变,除非卸载并重新安装该应用。仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件之间轮换时,Android ID值才会更改。只有随附Google Play服务和广告ID的设备制造商才需要进行此更改。其他设备制造商可能会提供替代的可重置ID或继续提供ANDROID ID。

s6fujrry

s6fujrry3#

我还没有尝试过,但是this page概述了一种涉及手动修改emaultor.exe文件的方法。这看起来非常简单,尽管您必须为每个QA团队成员创建一个单独的模拟器。

vulvrdjw

vulvrdjw4#

查询android_id在adb shell中使用以下命令:
设置获取安全android_id
在adb shell中使用以下命令更改android_id:
设置安全的android_id xxxxxxxxxxxxxx

whhtz7ly

whhtz7ly5#

如果您仍然需要更改IMEI,并且需要从脚本中进行更改:

EMU=$ANDROID_BASE/emulator/qemu/linux-x86_64/qemu-system-x86_64
p=$$ # Something unique enough
perl -e '
  $imei=substr("'$p'"."0"x15,0,15); $/=undef;
  open IN, "'$EMU'" or die "$!"; $b=<IN>; close IN;
  $b=~s/(\+CGSN.)0{15}/${1}$imei/;
  open OUT, ">'$EMU'-imei" or die "$!"; print OUT $b ; close OUT
'

然后移动你原来的qemu-system-x86_64二进制文件,这样你就可以把新的-imei重命名到它的位置。在$b=~行中使用CIMI而不是CGSN来更改IMSI(如果需要,请复制并调整$b=~行)。
显然,你需要一个不同的路径为Mac/Windows。

iqjalb3h

iqjalb3h6#

关于@zyc-zyc的回答
settings get secure android_id
settings put secure android_id xxxxxxxxxxxxxxxx
至少在Android P上不起作用(28)我试图通过sql更新
adb shell content delete --uri content://settings/secure --where "name=\'android_id\'"
adb shell content insert --uri content://settings/secure --bind name:s:android_id --bind value:s:XYXYXYX
检查结果:
adb shell content query --uri content://settings/secure --where "name=\'android_id\'"
行:0 _id=186,名称=android_id,值=XYXYXyx
adb shell settings get secure android_id
XYXYX
更新工作正常,但读取值时,所有解决方案都对设备没有影响

Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID)
6bc51xsx

6bc51xsx7#

自奥利奥以来,每个用户每个包的android id都是唯一的,并存储在:
/data/system/users/(user_id)/settings_ssaid.xml
甚至还有一个带有预构建二进制文件的open-source project on github,可以为您查询和修改id。您将需要root访问权限,但是,这在模拟器上应该不是问题。
更改似乎只有在重新启动后才生效。

7vux5j2d

7vux5j2d8#

嗨,我只是擦除模拟器的数据。解决了但意味着你的“新”设备。

相关问题