# AndroidIdChanger 使用帮助 ## 1. 先选择正确的发行变体 - Android 4.2~7.1:安装 `AndroidIdChanger-legacy-release-2.2.1.apk`。 - Android 8.0 及以上、使用经典 Xposed 兼容接口:安装 `legacy`。 - Android 8.0 及以上、框架明确支持 libxposed API 102:安装 `modern`。 两个变体包名相同,只能安装一个。覆盖安装可保留同签名版本的应用配置;从历史私有签名版本升级时,由于签名不同,需要先备份配置、卸载旧版再安装。 ## 2. 作为普通应用查看信息 1. 打开 AndroidIdChanger。 2. 根据需要授予电话、附近设备或定位权限。拒绝权限不会阻止应用启动,对应字段会显示状态说明。 3. 点“环境检测”查看完整信息。 4. 使用侧边菜单“导出设备信息”生成 HTML。导出文件默认遮盖 IMEI、MEID、Android ID、序列号、MAC、电话、ICCID、IMSI 和 IP,仅通过临时授权分享。 页面包含以下主要维度: - 系统/构建:版本、SDK、指纹、安全补丁、基础系统、Build ID、产品、设备、Bootloader、基带等。 - 硬件:ABI、SoC、SKU、CPU、内存、存储、屏幕刷新率、传感器、摄像头和系统特性数量。 - 状态:电量、健康、温度、电压、网络类型、计费网络、VPN、Locale、时区和开机时长。 - 标识符:Android ID、IMEI、MEID、序列号、Wi-Fi/蓝牙、电话与 SIM 信息;受限时显示原因,不会伪造“真实值”。 - 应用环境:本应用版本、安装来源和签名证书 SHA-256。 ## 3. 作为 Xposed 模块使用 ### 3.1 框架管理器设置 1. 安装 APK。 2. 在 Xposed 框架管理器中启用 AndroidIdChanger。 3. 只选择确有测试需要的目标应用,不要默认选择系统全局作用域。 4. 首次启用模块后,按框架提示重启目标应用、重启设备或执行软重启。 应用有两道独立准入:框架作用域与 AndroidIdChanger 内部包名作用域。两者都允许时才会替换。 ### 3.2 创建配置 1. 点“一键随机”生成合成测试配置,或逐项手工编辑。legacy 生成 40 个可替换字段,modern 生成 19 个;每项均非空。 2. 每一行左侧复选框表示是否启用该字段。灰色且不能勾选的项目仅供查看。 3. 打开“Hook App”,选择目标应用。包名使用完整精确匹配,`com.example.app` 不会误匹配 `com.example.app2`。 4. 点“保存”。默认的“Hook 全部应用”开关为关闭状态。 生成器只创建测试语义数据:IMEI 与 ICCID 通过 Luhn 校验,MAC 为本地管理单播地址,电话使用 NANP 保留的 555-0100~0199 虚构号段,移动网络使用 001/01 测试 MCC/MNC。SDK、电池、存储、签名等只读维度保留本机值,不会伪造或保存。取消字段勾选只停用该值,不会删除已经编辑的内容;勾选的字段不能为空。点“保存”或“一键随机”会自动退出硬编码模式,使当前编辑值与实际生效来源一致。 “本机原始信息”页的保存按钮会禁用,代码层也会拒绝保存该页,避免把真实标识符误当成替换配置。 “运行应用”列表只在 Android 4.2~4.4 提供;Android 5.0 起系统公开 API 无法可靠枚举其他运行中的应用,因此界面只提供“已安装应用”列表。 ### 3.3 何时生效 - `legacy`:配置在目标进程启动时读取一次。保存后强制停止并重新打开目标应用;涉及系统/zygote 进程时可能需要重启设备。 - `modern`:框架支持 RemotePreferences 时,目标进程会收到配置变化并原子替换内存快照。目标应用若已经把返回值缓存到自身内存,仍需重启该应用。 - 框架不提供所需服务、目标方法不存在或系统禁止修改时,原值会继续返回。 ## 4. 配置导入与导出 侧边菜单提供“导出替换配置”和“导入替换配置”。文件为 UTF-8 properties,最小示例: ```properties profile.version=2 scope.all=false profile.useHardcoded=false scope.packages=com.example.demo value.AndroidId=0123456789abcdef enabled.AndroidId=true ``` 导出内容只包含 legacy 或 modern 能实际替换的值、字段开关和精确包名,不包含 SDK、IP、电池、存储、签名等只读本机信息,也不包含账号或日志。所有值、字段开关与作用域保存在同一份权威配置中,并在完整校验后一次提交。导入行为如下: - 文件上限 256 KiB;最多 256 个字段和 512 个作用域包名。 - 拒绝未知版本、未知或重复属性、未知字段、非法 UTF-8、非法布尔、非法包名、控制字符、超长值以及 v2 中“启用但为空”的字段;旧版 v1 会以安全默认值迁移,并自动关闭历史空值项。 - 完整解析与校验成功后才提交;失败时显示错误且不边解析边生效。 - v2 会保真恢复 `scope.all`、`profile.useHardcoded`、字段开关与包名列表;导入前应先检查来源可信且作用域符合预期。v1 缺少的两个开关默认关闭。 Android 4.4 及以上使用系统文档选择器;Android 4.2~4.3 使用系统可用的内容选择器兼容路径,不要求传统外部存储权限。 ## 5. 权限用途 | 权限 | 用途 | 拒绝后的行为 | | --- | --- | --- | | 电话状态/电话号码 | 尝试读取 IMEI、MEID、电话和 SIM 信息 | 显示“权限未授予”或系统脱敏状态 | | Wi-Fi/网络状态 | 显示当前连接、SSID/BSSID、IP、计费网络和 VPN | 对应字段不可用或脱敏 | | 定位(仅 API 32 及以下) | 旧系统读取 SSID/BSSID 所需 | Wi-Fi 标识被系统脱敏 | | 蓝牙连接(API 31+) | 读取系统允许返回的蓝牙地址 | 蓝牙字段不可用或脱敏 | | 附近 Wi-Fi(API 33+) | 读取系统允许返回的当前 Wi-Fi 信息 | Wi-Fi 字段不可用或脱敏 | | 查询已安装应用 | 显示 Xposed 内部作用域选择器 | 无法列出完整目标应用 | 应用不声明 `INTERNET`、短信、联系人、日志、写系统设置、所有文件访问等权限,也不包含遥测 SDK。 ## 6. 状态说明 - `[权限未授予]`:公开 API 存在,但运行时权限不足。 - `[系统已脱敏]`:系统返回 `UNKNOWN`、空标识或固定占位地址。 - `[系统已限制]`:公开设置对普通第三方应用固定隐藏,不能据此判断真实开关状态。 - `[系统或硬件不支持]`:API 级别过低、设备无相应硬件,或厂商未实现。 - `[不可用]`:调用成功但当前没有可展示值,或发生了可恢复异常。 ## 7. 常见问题 ### 模块显示未激活 - legacy:确认管理器已启用模块,并按框架要求重启。该状态通过传统自 Hook 检测,仅供提示。 - modern:状态表示框架是否向模块应用提供了 libxposed 服务;“未连接”不一定证明模块被禁用,也可能是框架或当前版本不支持服务。 ### 保存后目标应用仍看到原值 依次检查:框架管理器作用域、应用内 Hook App 列表、字段复选框、目标进程是否已重启、目标应用是否使用 native/缓存/硬件证明、该 Android 版本是否仍允许对应 Hook 点。 ### “恢复手机设备信息”会做什么 该操作会关闭 legacy 与 modern 的全部字段开关、退出硬编码模式并清空替换值;目标进程重启后由系统返回自身真实值。它不会扩大或删除框架管理器中的作用域。 ### 为什么 Build 字段没有全部变化 现代入口不写静态 Build 字段。传统入口也只能尽力修改;编译期内联、VM 缓存、native 层和 Android 17 的静态 final 限制都会造成不一致。这是平台边界,不应以此判断配置文件损坏。 ### 能否绕过 Play Integrity 或硬件证明 不能。本项目只处理少量 Java/framework 返回值,不修改硬件密钥、证明链或服务端状态。