【bug】有时候不能拉起ali一键登录页面 #8

Closed
opened 2025-12-23 23:02:41 +08:00 by admin · 2 comments
Owner

问题描述
小米手机有时候不能拉起ali一键登录页面
重现步骤
安装应用后,登录账号,然后卸载应用。再次编译安装,直接进入了主页,跳过了登录环节。

期望结果
如果插口拉起一键登录页面,否则拉取验证码登录页面

实际结果
直接进入了主页,跳过了登录环节。

环境信息
设备型号: [e.g., Pixel 6]
Android版本: [e.g., Android 13]
App版本: [e.g., v1.2.0]
##日子/截图
Crash日志如下(如有):

修复建议
[可选:如果你有修复思路]
##定位情况
-[]未分析
-[]初步定位,原因:
当应用卸载后 id = SharedPreferencesUtils.getString(Constants.USER_ID,"");
token = SharedPreferencesUtils.getString(Constants.IM_LOGIN_TOKEN,"");
依然有值。
-[]已确定原因,方案:

##验收标准
-[]在相同环境下不在复现
-[]回归测试通过

问题描述 小米手机有时候不能拉起ali一键登录页面 重现步骤 安装应用后,登录账号,然后卸载应用。再次编译安装,直接进入了主页,跳过了登录环节。 期望结果 如果插口拉起一键登录页面,否则拉取验证码登录页面 实际结果 直接进入了主页,跳过了登录环节。 环境信息 设备型号: [e.g., Pixel 6] Android版本: [e.g., Android 13] App版本: [e.g., v1.2.0] ##日子/截图 Crash日志如下(如有): 修复建议 [可选:如果你有修复思路] ##定位情况 -[]未分析 -[]初步定位,原因: 当应用卸载后 id = SharedPreferencesUtils.getString(Constants.USER_ID,""); token = SharedPreferencesUtils.getString(Constants.IM_LOGIN_TOKEN,""); 依然有值。 -[]已确定原因,方案: ##验收标准 -[]在相同环境下不在复现 -[]回归测试通过
Author
Owner

-[]初步定位,原因:
当应用卸载后 id = SharedPreferencesUtils.getString(Constants.USER_ID,"");
token = SharedPreferencesUtils.getString(Constants.IM_LOGIN_TOKEN,"");
依然有值。
image.png
image.png

-[]初步定位,原因: 当应用卸载后 id = SharedPreferencesUtils.getString(Constants.USER_ID,""); token = SharedPreferencesUtils.getString(Constants.IM_LOGIN_TOKEN,""); 依然有值。 ![image.png](/attachments/8543a15d-8b37-46d6-b092-9384e9f0809e) ![image.png](/attachments/e333c3f8-7066-4e40-b18f-c402cf962b37)
Author
Owner

上库链接:http://101.43.95.130:8082/c/zhini_im/+/8
应用卸载重装后依然能读取到用户登录信息的问题分析与解决方案

问题描述

在小米手机上,已经登录账号后卸载应用,然后重新安装应用,发现仍然能够读取到之前的
用户ID和Token信息。理论上卸载应用后,SharedPreferences等本地存储应该被清除了,
但实际情况却并非如此。

日志示例:
2025-12-24 21:26:41.191 32330-32330 renjianboOneClickLoginActivity com.xunpaisoft.social
D id: 1845 token: fy55PMnu5gtDLfOVppNRsnu2rOO5ya9+izmP2X8Ex0GPVMEYR0yiwwKwcrgL4z+cQ5uBIVpYL8Uf+tWKZPsQWrT+8Il63s3L0nFe0ZizsGcCQajZv/Tl/e2HlEKs9avTnJUO1OSYSZ+08PxN6IP8tvw5v04ZxSzmsFLNGHvW9fQ=

问题原因分析

  1. Android自动备份功能已启用

    • AndroidManifest.xml中设置了 android:allowBackup="true"
    • 这会导致Android系统自动备份应用数据到云端
  2. 备份规则文件未排除敏感数据

    • backup_rules.xml 和 data_extraction_rules.xml 都是默认配置
    • 没有排除存储用户登录信息的SharedPreferences文件
    • 导致敏感数据(用户ID、Token等)被自动备份
  3. 数据恢复机制

    • 卸载应用后重新安装时,Android系统会自动恢复备份的数据
    • 包括SharedPreferences文件(social_app.xml 和 config.xml)
    • 因此能够读取到之前的用户登录信息
  4. 小米手机的云服务

    • 小米手机可能启用了小米云服务的自动备份功能
    • 即使Android系统备份被禁用,小米云服务也可能备份应用数据
  5. 数据存储位置

    • SharedPreferencesUtils 使用 "social_app" 作为文件名
    • KeyStoreUtil 使用 Config.SP_CONFIG_FILE_NAME(值为"config")作为文件名
    • 这些文件在备份时都被包含在内

解决方案

方案一:修改备份规则文件(已实施)

  1. 修改 backup_rules.xml
    文件路径:app/src/main/res/xml/backup_rules.xml

    修改内容:

    <full-backup-content>
        <!-- 排除敏感的用户登录信息,防止卸载重装后自动恢复 -->
        <exclude domain="sharedpref" path="social_app.xml"/>
        <exclude domain="sharedpref" path="config.xml"/>
    </full-backup-content>
    

    说明:

    • social_app.xml 包含:USER_ID、IM_LOGIN_TOKEN、USER_TOKE等登录信息
    • config.xml 包含:KeyStoreUtil加密存储的敏感数据
  2. 修改 data_extraction_rules.xml
    文件路径:app/src/main/res/xml/data_extraction_rules.xml

    修改内容:

    <data-extraction-rules>
        <cloud-backup>
            <!-- 排除敏感的用户登录信息,防止卸载重装后自动恢复 -->
            <exclude domain="sharedpref" path="social_app.xml"/>
            <exclude domain="sharedpref" path="config.xml"/>
        </cloud-backup>
        <device-transfer>
            <!-- 排除敏感的用户登录信息,防止设备迁移时恢复 -->
            <exclude domain="sharedpref" path="social_app.xml"/>
            <exclude domain="sharedpref" path="config.xml"/>
        </device-transfer>
    </data-extraction-rules>
    

    说明:

    • cloud-backup:控制云端备份
    • device-transfer:控制设备迁移时的数据传输

方案二:添加安全检测机制(已实施)

在 MyApp.onCreate() 中添加了 checkAndClearRestoredData() 方法:

功能说明:

  1. 检测 AndroidKeyStore 中的密钥是否存在
  2. 如果密钥不存在(说明是全新安装),但 SharedPreferences 中有用户数据
  3. 则判断这些数据可能是被自动备份恢复的,需要清除

实现代码位置:
app/src/main/java/com/xunpaisoft/social/MyApp.java

关键逻辑:

  • 检查 AndroidKeyStore 中是否存在密钥 "pp_keystore_alias"
  • 如果密钥不存在(全新安装),但存在用户数据,则清除:
    • USER_ID
    • IM_LOGIN_TOKEN
    • USER_TOKE
    • IS_STUDENT_MODEL
    • STUDENT_MODEL_PASSWORD
    • config.xml 中的所有数据

方案三:完全关闭备份(不推荐)

如果不需要备份任何数据,可以在 AndroidManifest.xml 中设置:

<application
    android:allowBackup="false"
    ...
>

缺点:

  • 用户换设备或重装后无法恢复任何设置
  • 用户体验较差
  • 不符合Android最佳实践

技术细节

  1. Android自动备份机制

    • 备份时机:设备充电且连接WiFi时自动备份,每天最多一次
    • 备份内容:SharedPreferences、应用内文件、数据库等
    • 恢复时机:卸载后重新安装、恢复出厂设置后、换新设备时
    • 备份位置:Google云端(或厂商云服务,如小米云)
  2. 备份规则文件说明

    • backup_rules.xml:控制完整备份(API 23+)
    • data_extraction_rules.xml:控制云端备份和设备迁移(API 31+)
    • domain="sharedpref":指定SharedPreferences文件
    • path="文件名.xml":具体的文件名
  3. 数据存储位置

    • SharedPreferencesUtils:使用 "social_app" 作为文件名
    • KeyStoreUtil:使用 "config" 作为文件名(Config.SP_CONFIG_FILE_NAME)
    • 存储的敏感数据包括:
      • USER_ID(用户ID)
      • IM_LOGIN_TOKEN(IM登录Token)
      • USER_TOKE(用户Token)
      • STUDENT_MODEL_PASSWORD(青少年模式密码)
      • REAL_AUTH(实名认证状态)
  4. AndroidKeyStore机制

    • AndroidKeyStore中的密钥是硬件绑定的
    • 卸载应用后,AndroidKeyStore中的密钥会被清除
    • 重新安装时,会生成新的密钥
    • 因此可以通过检查密钥是否存在来判断是否是全新安装

注意事项

  1. 已备份的数据处理

    • 修改备份规则后,已经备份的数据仍可能被恢复
    • 用户需要:
      • 清除应用的备份数据(设置 → 备份 → 清除备份)
      • 或等待新的备份覆盖旧备份
  2. 测试建议

    • 卸载应用
    • 清除应用备份数据(如果可能)
    • 重新安装应用
    • 验证是否还会读取到旧数据
  3. 如果问题仍然存在

    • 检查小米云服务是否启用了应用数据备份
    • 在小米云服务中关闭该应用的自动备份
    • 检查是否有其他第三方备份工具
  4. 备份功能的必要性

    • 建议保持 allowBackup="true",但排除敏感数据
    • 这样可以备份非敏感数据(如应用设置、用户偏好等)
    • 既保护了安全,又兼顾了用户体验
  5. 安全建议

    • 所有敏感数据都应该排除在备份之外
    • 包括:登录凭证、加密密钥、密码、个人隐私信息等
    • 非敏感数据可以备份:应用设置、主题、字体大小等

相关文件清单

已修改的文件:

  1. app/src/main/res/xml/backup_rules.xml
  2. app/src/main/res/xml/data_extraction_rules.xml
  3. app/src/main/java/com/xunpaisoft/social/MyApp.java
    • 添加了 checkAndClearRestoredData() 方法
    • 添加了 KeyStore 的 import

相关配置文件:

  1. app/src/main/AndroidManifest.xml
    • android:allowBackup="true"
    • android:fullBackupContent="@xml/backup_rules"
    • android:dataExtractionRules="@xml/data_extraction_rules"

数据存储文件:

  1. social_app.xml(SharedPreferences)

    • 存储位置:/data/data/com.xunpaisoft.social/shared_prefs/social_app.xml
    • 包含:USER_ID、IM_LOGIN_TOKEN、USER_TOKE等
  2. config.xml(SharedPreferences)

    • 存储位置:/data/data/com.xunpaisoft.social/shared_prefs/config.xml
    • 包含:KeyStoreUtil加密存储的敏感数据

验证方法

  1. 测试步骤
    a. 在设备上登录应用
    b. 确认能够读取到用户ID和Token
    c. 卸载应用
    d. 清除应用备份数据(设置 → 备份 → 清除备份)
    e. 重新安装应用
    f. 检查日志,确认是否还能读取到旧数据

  2. 预期结果

    • 重新安装后,不应该读取到之前的用户ID和Token
    • 应该显示为空或默认值
    • 应该跳转到登录页面(OneClickLoginActivity)
  3. 如果仍然有问题

    • 检查小米云服务备份设置
    • 检查是否有其他备份工具
    • 检查日志中的 checkAndClearRestoredData() 方法是否执行
    • 检查备份规则文件是否正确生效

总结

问题根源:
Android自动备份功能在未排除敏感数据的情况下,会将用户登录信息备份到云端。
卸载重装后,系统自动恢复这些备份数据,导致能够读取到之前的登录信息。

解决方案:

  1. 在备份规则文件中排除敏感数据文件(social_app.xml 和 config.xml)
  2. 添加安全检测机制,在应用启动时检测并清除可能被恢复的旧数据

效果:

  • 新安装的应用不会再自动恢复用户登录信息
  • 卸载后需要重新登录,符合安全要求
  • 非敏感数据仍然可以备份,保持用户体验

建议:
保持当前配置,既保护了敏感数据的安全,又允许备份非敏感数据,是最佳实践。

上库链接:http://101.43.95.130:8082/c/zhini_im/+/8 应用卸载重装后依然能读取到用户登录信息的问题分析与解决方案 ================================================================================ 问题描述 -------------------------------------------------------------------------------- 在小米手机上,已经登录账号后卸载应用,然后重新安装应用,发现仍然能够读取到之前的 用户ID和Token信息。理论上卸载应用后,SharedPreferences等本地存储应该被清除了, 但实际情况却并非如此。 日志示例: 2025-12-24 21:26:41.191 32330-32330 renjianboOneClickLoginActivity com.xunpaisoft.social D id: 1845 token: fy55PMnu5gtDLfOVppNRsnu2rOO5ya9+izmP2X8Ex0GPVMEYR0yiwwKwcrgL4z+cQ5uBIVpYL8Uf+tWKZPsQWrT+8Il63s3L0nFe0ZizsGcCQajZv/Tl/e2HlEKs9avTnJUO1OSYSZ+08PxN6IP8tvw5v04ZxSzmsFLNGHvW9fQ= 问题原因分析 -------------------------------------------------------------------------------- 1. Android自动备份功能已启用 - AndroidManifest.xml中设置了 android:allowBackup="true" - 这会导致Android系统自动备份应用数据到云端 2. 备份规则文件未排除敏感数据 - backup_rules.xml 和 data_extraction_rules.xml 都是默认配置 - 没有排除存储用户登录信息的SharedPreferences文件 - 导致敏感数据(用户ID、Token等)被自动备份 3. 数据恢复机制 - 卸载应用后重新安装时,Android系统会自动恢复备份的数据 - 包括SharedPreferences文件(social_app.xml 和 config.xml) - 因此能够读取到之前的用户登录信息 4. 小米手机的云服务 - 小米手机可能启用了小米云服务的自动备份功能 - 即使Android系统备份被禁用,小米云服务也可能备份应用数据 5. 数据存储位置 - SharedPreferencesUtils 使用 "social_app" 作为文件名 - KeyStoreUtil 使用 Config.SP_CONFIG_FILE_NAME(值为"config")作为文件名 - 这些文件在备份时都被包含在内 解决方案 -------------------------------------------------------------------------------- 方案一:修改备份规则文件(已实施)✅ 1. 修改 backup_rules.xml 文件路径:app/src/main/res/xml/backup_rules.xml 修改内容: ```xml <full-backup-content> <!-- 排除敏感的用户登录信息,防止卸载重装后自动恢复 --> <exclude domain="sharedpref" path="social_app.xml"/> <exclude domain="sharedpref" path="config.xml"/> </full-backup-content> ``` 说明: - social_app.xml 包含:USER_ID、IM_LOGIN_TOKEN、USER_TOKE等登录信息 - config.xml 包含:KeyStoreUtil加密存储的敏感数据 2. 修改 data_extraction_rules.xml 文件路径:app/src/main/res/xml/data_extraction_rules.xml 修改内容: ```xml <data-extraction-rules> <cloud-backup> <!-- 排除敏感的用户登录信息,防止卸载重装后自动恢复 --> <exclude domain="sharedpref" path="social_app.xml"/> <exclude domain="sharedpref" path="config.xml"/> </cloud-backup> <device-transfer> <!-- 排除敏感的用户登录信息,防止设备迁移时恢复 --> <exclude domain="sharedpref" path="social_app.xml"/> <exclude domain="sharedpref" path="config.xml"/> </device-transfer> </data-extraction-rules> ``` 说明: - cloud-backup:控制云端备份 - device-transfer:控制设备迁移时的数据传输 方案二:添加安全检测机制(已实施)✅ 在 MyApp.onCreate() 中添加了 checkAndClearRestoredData() 方法: 功能说明: 1. 检测 AndroidKeyStore 中的密钥是否存在 2. 如果密钥不存在(说明是全新安装),但 SharedPreferences 中有用户数据 3. 则判断这些数据可能是被自动备份恢复的,需要清除 实现代码位置: app/src/main/java/com/xunpaisoft/social/MyApp.java 关键逻辑: - 检查 AndroidKeyStore 中是否存在密钥 "pp_keystore_alias" - 如果密钥不存在(全新安装),但存在用户数据,则清除: * USER_ID * IM_LOGIN_TOKEN * USER_TOKE * IS_STUDENT_MODEL * STUDENT_MODEL_PASSWORD * config.xml 中的所有数据 方案三:完全关闭备份(不推荐) 如果不需要备份任何数据,可以在 AndroidManifest.xml 中设置: ```xml <application android:allowBackup="false" ... > ``` 缺点: - 用户换设备或重装后无法恢复任何设置 - 用户体验较差 - 不符合Android最佳实践 技术细节 -------------------------------------------------------------------------------- 1. Android自动备份机制 - 备份时机:设备充电且连接WiFi时自动备份,每天最多一次 - 备份内容:SharedPreferences、应用内文件、数据库等 - 恢复时机:卸载后重新安装、恢复出厂设置后、换新设备时 - 备份位置:Google云端(或厂商云服务,如小米云) 2. 备份规则文件说明 - backup_rules.xml:控制完整备份(API 23+) - data_extraction_rules.xml:控制云端备份和设备迁移(API 31+) - domain="sharedpref":指定SharedPreferences文件 - path="文件名.xml":具体的文件名 3. 数据存储位置 - SharedPreferencesUtils:使用 "social_app" 作为文件名 - KeyStoreUtil:使用 "config" 作为文件名(Config.SP_CONFIG_FILE_NAME) - 存储的敏感数据包括: * USER_ID(用户ID) * IM_LOGIN_TOKEN(IM登录Token) * USER_TOKE(用户Token) * STUDENT_MODEL_PASSWORD(青少年模式密码) * REAL_AUTH(实名认证状态) 4. AndroidKeyStore机制 - AndroidKeyStore中的密钥是硬件绑定的 - 卸载应用后,AndroidKeyStore中的密钥会被清除 - 重新安装时,会生成新的密钥 - 因此可以通过检查密钥是否存在来判断是否是全新安装 注意事项 -------------------------------------------------------------------------------- 1. 已备份的数据处理 - 修改备份规则后,已经备份的数据仍可能被恢复 - 用户需要: * 清除应用的备份数据(设置 → 备份 → 清除备份) * 或等待新的备份覆盖旧备份 2. 测试建议 - 卸载应用 - 清除应用备份数据(如果可能) - 重新安装应用 - 验证是否还会读取到旧数据 3. 如果问题仍然存在 - 检查小米云服务是否启用了应用数据备份 - 在小米云服务中关闭该应用的自动备份 - 检查是否有其他第三方备份工具 4. 备份功能的必要性 - 建议保持 allowBackup="true",但排除敏感数据 - 这样可以备份非敏感数据(如应用设置、用户偏好等) - 既保护了安全,又兼顾了用户体验 5. 安全建议 - 所有敏感数据都应该排除在备份之外 - 包括:登录凭证、加密密钥、密码、个人隐私信息等 - 非敏感数据可以备份:应用设置、主题、字体大小等 相关文件清单 -------------------------------------------------------------------------------- 已修改的文件: 1. app/src/main/res/xml/backup_rules.xml 2. app/src/main/res/xml/data_extraction_rules.xml 3. app/src/main/java/com/xunpaisoft/social/MyApp.java - 添加了 checkAndClearRestoredData() 方法 - 添加了 KeyStore 的 import 相关配置文件: 1. app/src/main/AndroidManifest.xml - android:allowBackup="true" - android:fullBackupContent="@xml/backup_rules" - android:dataExtractionRules="@xml/data_extraction_rules" 数据存储文件: 1. social_app.xml(SharedPreferences) - 存储位置:/data/data/com.xunpaisoft.social/shared_prefs/social_app.xml - 包含:USER_ID、IM_LOGIN_TOKEN、USER_TOKE等 2. config.xml(SharedPreferences) - 存储位置:/data/data/com.xunpaisoft.social/shared_prefs/config.xml - 包含:KeyStoreUtil加密存储的敏感数据 验证方法 -------------------------------------------------------------------------------- 1. 测试步骤 a. 在设备上登录应用 b. 确认能够读取到用户ID和Token c. 卸载应用 d. 清除应用备份数据(设置 → 备份 → 清除备份) e. 重新安装应用 f. 检查日志,确认是否还能读取到旧数据 2. 预期结果 - 重新安装后,不应该读取到之前的用户ID和Token - 应该显示为空或默认值 - 应该跳转到登录页面(OneClickLoginActivity) 3. 如果仍然有问题 - 检查小米云服务备份设置 - 检查是否有其他备份工具 - 检查日志中的 checkAndClearRestoredData() 方法是否执行 - 检查备份规则文件是否正确生效 总结 -------------------------------------------------------------------------------- 问题根源: Android自动备份功能在未排除敏感数据的情况下,会将用户登录信息备份到云端。 卸载重装后,系统自动恢复这些备份数据,导致能够读取到之前的登录信息。 解决方案: 1. 在备份规则文件中排除敏感数据文件(social_app.xml 和 config.xml) 2. 添加安全检测机制,在应用启动时检测并清除可能被恢复的旧数据 效果: - 新安装的应用不会再自动恢复用户登录信息 - 卸载后需要重新登录,符合安全要求 - 非敏感数据仍然可以备份,保持用户体验 建议: 保持当前配置,既保护了敏感数据的安全,又允许备份非敏感数据,是最佳实践。
admin closed this issue 2026-01-25 09:44:00 +08:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/zhini_im#8