说明从 Android 14 开始系统信任的 CA 证书存储路径已经从传统的 /system/etc/security/cacerts 迁移到了 APEX 模块即只读分区下的 /apex/com.android.conscrypt/cacerts。这就是为什么像安卓9那样手动复制到旧的 /system 路径下会失效。要解决这个问题可以试试利用tmpfs内存文件系统这是目前较推荐的方法通过在内存中创建一个临时文件系统 (tmpfs) 并绑定挂载绕过对只读分区的直接修改。成功后证书会立即生效无需重启模拟器但是重启后操作会失效。1.获取证书电脑 Charles 菜单HelpSSL ProxyingSave Charles Root Certificate保存为charles.pem。使用 OpenSSL 计算 Hash 并重命名在命令行下执行或者用git bash带有opensslopenssl x509-subject_hash_old-in./charles.pem在结果的第一行会看到8位字符复制这8位字符将charles.pem文件名改为2876f3f8.02876f3f8是复制的8位字符然后将.0文件复制到雷电模拟器的共享文件夹一般是/storage/emulated/0/Pictures2.模拟器打开root权限和文件读写3.使用ADB安装证书# 查看设备名adb devices# 先将证书拷贝的tmp目录, emulator-5554修改为你看到的设备名adb-semulator-5554 push 9a5ba575.0 /data/local/tmp/# 连接模拟器并获取 Root 权限adb-semulator-5554 root adb-semulator-5554 shellsu分别执行下面的命令安装证书#!/system/bin/shCERT_NAME2876f3f8.0# 记得修改成你的哈希值文件名CERT_PATH/data/local/tmp# 假设你把证书放在了这里# 1. 创建临时目录并复制原有证书mkdir-p-m700/data/local/tmp/tmp-ca-copycp/apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp-ca-copy/# 2. 创建 tmpfs 挂载点mount-ttmpfs tmpfs /system/etc/security/cacerts# 3. 将原有证书复制回 tmpfsmv/data/local/tmp/tmp-ca-copy/* /system/etc/security/cacerts/# 4. 将你的新证书复制进去cp/data/local/tmp/$CERT_NAME/system/etc/security/cacerts/# 5. 设置正确的权限和 SELinux 上下文chownroot:root /system/etc/security/cacerts/*chmod644/system/etc/security/cacerts/* chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*# 6. 将挂载绑定到新路径mount--bind/system/etc/security/cacerts /apex/com.android.conscrypt/cacerts好了现在再去模拟器中设置-安全和隐私-更多安全和隐私设置-加密与凭据-可信凭据看看系统选项中看看有没有描述信息为Charles Proxy CA开头的证书有就表示安装成功可以用Charles抓包了注意要先修改模拟器的网络代理4.自动脚本由于证书是通过在内存中创建一个临时文件系统 (tmpfs) 并绑定挂载的所以重启会失效需要重新执行一次最后那段脚本进行安装我们可以将最后一段命令做成bat脚本在启动模拟器后执行一次就好了将下面的命令保存为bash脚本charles.sh注意修改文件名和路径然后放在共享目录下#!/system/bin/shCERT_NAME2876f3f8.0# 记得修改成你的哈希值文件名CERT_PATH/data/local/tmp# 假设你把证书放在了这里# 1. 创建临时目录并复制原有证书mkdir-p-m700/data/local/tmp/tmp-ca-copycp/apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp-ca-copy/# 2. 创建 tmpfs 挂载点mount-ttmpfs tmpfs /system/etc/security/cacerts# 3. 将原有证书复制回 tmpfsmv/data/local/tmp/tmp-ca-copy/* /system/etc/security/cacerts/# 4. 将你的新证书复制进去cp/data/local/tmp/$CERT_NAME/system/etc/security/cacerts/# 5. 设置正确的权限和 SELinux 上下文chownroot:root /system/etc/security/cacerts/*chmod644/system/etc/security/cacerts/* chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*# 6. 将挂载绑定到新路径mount--bind/system/etc/security/cacerts /apex/com.android.conscrypt/cacerts编写bat脚本需要将adb加入系统环境变量echo off chcp 65001 nul title Charles 证书安装工具 echo echo Charles 证书安装工具 echo echo. :: 先 root adb -s emulator-5554 root :: 使用 adb shell 直接执行多条命令 adb -s emulator-5554 shell su -c sh /storage/emulated/0/Pictures/charles.sh echo. echo 执行完毕 pause这样每次需要抓包时等启动模拟器双击这个bat脚本就可以自动挂载证书了