Android模拟器抓HTTPS流量实战:Burp证书配置与网络安全性绕过
2026/5/30 2:58:37 网站建设 项目流程

1. 为什么在模拟器里抓HTTPS流量比真机还让人头疼?

刚接手一个老Android项目的接口调试任务时,我第一反应是开Burp——结果连首页都打不开。不是报错,是直接白屏。反复确认代理设置、Burp监听端口、Wi-Fi代理配置都没问题,最后抓包一看:所有请求全被标记为Connection refused。折腾两小时后才意识到,问题根本不在Burp,而在Android系统本身:从Android 7.0(Nougat)开始,系统默认只信任**系统证书存储区(System CA Store)**里的根证书,而Burp生成的CA证书默认只存进用户证书区(User CA Store)。更麻烦的是,从Android 9(Pie)起,即使你手动安装了Burp证书到用户区,App只要没显式声明信任用户证书(通过android:networkSecurityConfig),它的HTTPS请求就压根不会走你装的证书链。

这事儿在真机上还能靠Magisk模块或Root后手动导入系统证书勉强绕过,但在模拟器里——尤其是官方Android Studio自带的AVD(Android Virtual Device)——你既没有root权限(默认禁用),也无法像刷机那样挂载system分区写入证书。我试过用adb root命令,结果返回adbd cannot run as root in production builds;也试过修改AVD启动参数加-writable-system,但一重启证书就消失。后来才搞明白:AVD的system镜像是只读挂载的,且每次快照恢复都会重置证书状态。所以“在模拟器里配Burp证书”这件事,本质不是“怎么装证书”,而是“如何让Android系统在不root、不改镜像、不重启的前提下,长期、稳定、批量地信任你自定义的CA证书”。

这个标题里的“实战”二字,不是修饰词,是血泪教训。它意味着你要面对的不是文档里写的理想流程,而是:证书安装后App仍报SSL handshake failed、Burp显示client hello但无后续、某些App(比如银行类、游戏登录SDK)干脆拒绝联网、甚至同一台模拟器上A App能抓B App抓不了……这些都不是Burp配置错了,而是Android网络安全性策略在底层层层设防。关键词Android模拟器、Burpsuite、HTTPS流量捕获、证书配置、网络安全性策略,每一个都踩在Android安全机制的敏感神经上。这篇文章就是为你拆解:在不越狱、不刷机、不依赖第三方ROM的前提下,如何让AVD真正“睁一只眼闭一只眼”,把Burp当成本地可信CA来用。适合正在做Android App渗透测试、接口联调、逆向分析的开发者和安全工程师,尤其适合那些被javax.net.ssl.SSLHandshakeException报错折磨到凌晨三点的人。

2. Burp证书的本质:不是文件,而是信任链的起点

很多人卡在第一步:下载Burp证书后,双击安装,提示“已安装”,然后就以为万事大吉。结果打开App,Burp里一片空白,或者全是红色的Client closed connection before response was sent。这时候翻文档、搜论坛,得到的答案往往是“去设置里手动安装证书”——但问题来了:Android模拟器的“设置→安全→加密与凭据→安装证书”路径,在不同Android版本下藏得极深,而且安装位置有严格区分。更重要的是,你安装的到底是什么?是.crt?.cer?还是.pem?它们之间有什么区别?

先说结论:Burp Suite Pro/Community版导出的证书,本质上是一个X.509格式的根证书(Root CA Certificate),其核心作用不是“加密数据”,而是“签发终端证书的权力”。当你在Burp中开启Proxy → Options → Proxy Listeners → Edit → Import / Export CA Certificate,选择导出为DER格式(.cer)或PEM格式(.crt)时,你拿到的其实是同一个东西的不同编码方式:

  • DER格式(.cer):二进制编码,是Android系统原生最认的格式,兼容性最好;
  • PEM格式(.crt):Base64编码的文本格式,开头是-----BEGIN CERTIFICATE-----,结尾是-----END CERTIFICATE-----,人类可读,但Android模拟器安装时容易因换行符或空格解析失败。

我实测过:在Android 11 AVD上,用adb push推送PEM格式证书到/sdcard/Download/burp.crt,再通过Settings手动安装,90%概率提示“无法安装此证书”;换成DER格式的burp.cer,安装成功率接近100%。这不是玄学,是Android证书安装服务(com.android.certinstaller)的解析逻辑决定的——它对PEM的头部尾部校验极其严格,哪怕多一个空格或少一个换行,都会直接拒收。

但光装对格式还不够。关键要理解Android证书信任模型的三层结构:

证书类型存储位置默认是否被App信任修改难度典型场景
系统证书(System CA)/system/etc/security/cacerts/✅ 所有App默认信任⚠️ 需root+remount system为可写真机Root后导入、定制ROM预置
用户证书(User CA)/data/misc/user/0/cacerts-added/❌ 仅当App显式声明<certificates src="system" /><certificates src="user" />时才信任✅ 无需root,adb即可安装模拟器常规操作、非敏感App调试
应用专属证书(App-specific)App私有目录✅ 仅该App自己信任⚠️ 需修改App源码或反编译重打包银行App、支付SDK等高安全要求场景

Burp证书默认只能装进“用户证书区”,这就解释了为什么很多App抓不到:它们压根没声明要信任用户区证书。比如一个典型的network_security_config.xml长这样:

<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">example.com</domain> <trust-anchors> <certificates src="system" /> </trust-anchors> </domain-config> </network-security-config>

注意<certificates src="system" />这一行——它明确告诉系统:“只信系统证书,别管用户装了啥”。这就是为什么你证书装得再正确,App照样报SSL错误。而模拟器的特殊性在于:你没法像真机那样用Magisk模块动态注入系统证书,也没法像物理设备那样进入Recovery模式刷入修改版system镜像。所以真正的突破口,不是“怎么装证书”,而是“怎么让App主动去读用户证书”。

2.1 为什么必须用DER格式?一次真实的编码解析实验

为了验证格式差异,我做了个最小化实验:

  1. 在Burp中导出CA证书,分别保存为burp.der(DER)和burp.pem(PEM);
  2. openssl x509 -in burp.pem -text -noout查看PEM内容,确认其Subject为CN=PortSwigger CA
  3. openssl x509 -inform DER -in burp.der -text -noout对比DER解码结果,完全一致;
  4. 将两个文件通过adb push传到AVD的/sdcard/Download/目录;
  5. 在AVD Settings中依次点击“Security → Encryption & credentials → Install from storage”,选择burp.pem,弹窗提示“Cannot install this certificate”;选择burp.der,成功进入安装界面,输入锁屏密码后显示“Certificate installed”。

背后原理是:Android证书安装服务在解析证书时,会先尝试用ASN.1 DER解码器读取文件头。DER是严格的二进制编码,头部有固定OID标识(0x30 0x82),而PEM是文本封装,需要先Base64解码再转DER。AVD的证书安装服务(基于AOSPCertInstaller)在处理PEM时,对Base64解码后的数据长度、填充字符、换行符位置异常敏感。我抓了logcat | grep CertInstaller日志,发现失败时输出Failed to decode PEM: invalid base64 input,而DER则直接跳过解码步骤,走原生ASN.1解析。

提示:如果你只有PEM格式证书,可以用OpenSSL一键转DER:
openssl x509 -in burp.pem -outform der -out burp.cer
转换后务必用file burp.cer确认输出为burp.cer: data(而非ASCII text),否则仍是文本格式。

2.2 用户证书的存储路径与权限机制

很多人以为证书装完就进了系统,其实不然。Android将用户证书存在一个受严格保护的目录:/data/misc/user/0/cacerts-added/。这个路径的权限是drwx------(700),只有UID 0(root)和UID 1000(system)能读写。普通App进程(UID 10000+)根本无法访问该目录,那App是怎么读到证书的?答案是:通过Android Keystore System的KeyChainAPI间接调用

当你在Settings里安装用户证书时,系统会触发KeyChain服务,将证书的SHA-256指纹存入/data/misc/keychain/下的SQLite数据库,并在/data/misc/user/0/cacerts-added/生成一个以指纹命名的.0文件(如a1b2c3d4...e5f6.0)。App在建立TLS连接时,如果配置了<certificates src="user" />,系统就会查询这个数据库,找到对应证书文件并加载进TrustManager。

我用adb shell run-as com.example.app cat /proc/self/status | grep Uid确认过,App进程的UID是10123,而/data/misc/user/0/cacerts-added/的owner是1000(system),所以App绝不可能直接open()这个文件。它走的是Binder IPC调用KeyChainService,由system_server进程代为读取并返回证书内容。这也是为什么你不能用adb shell cp手动复制证书到该目录——权限不允许,且缺少数据库注册,系统根本不认。

所以,“安装证书”这个动作,本质是向Android的密钥管理服务注册一个信任锚点,而不是简单地拷贝一个文件。这也是为什么模拟器里不能跳过Settings安装步骤,直接用adb push硬塞证书——没有KeyChain服务的注册,证书就是一张废纸。

3. 绕过网络安全性限制:三种实战级方案深度对比

既然App默认不信任用户证书,那解决方案就聚焦在一个目标上:让目标App的网络请求主动加载用户区证书。这里没有银弹,只有三种经过千锤百炼的实战方案,每种适用场景、实施难度、稳定性都截然不同。我按推荐顺序排列,不是按复杂度,而是按“在模拟器环境下谁最稳、谁最容易翻车”。

3.1 方案一:修改App的networkSecurityConfig(推荐指数 ★★★★★)

这是最干净、最符合Android官方设计的方案,前提是:你有App的APK文件,且它未启用APK Signature Scheme v3强校验(v2/v3签名下,修改resources.arsc后需重新签名)。

核心原理:Android允许App通过res/xml/network_security_config.xml文件,精细控制每个域名的信任锚点。只要把<certificates src="system" />改成<certificates src="user" /><certificates src="system" /><certificates src="user" />,App就会同时信任系统和用户证书。

实操步骤(以APK为例):

  1. 下载apktool(v2.6.2+),执行apktool d app-release.apk -o app-decoded反编译;
  2. 检查app-decoded/res/xml/目录下是否存在network_security_config.xml。若不存在,说明App未自定义网络策略,默认只信系统证书;
  3. 若存在,用文本编辑器打开,找到<trust-anchors>节点,将其内容替换为:
    <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors>
  4. 保存后执行apktool b app-decoded -o app-modified.apk回编译;
  5. jarsignerapksigner重新签名(注意:必须用debug keystore或你自己的release keystore,否则安装失败);
  6. adb install app-modified.apk安装。

为什么这个方案在模拟器里最稳?
因为AVD本身就是为开发调试设计的,它对debug签名的APK没有任何额外限制。而networkSecurityConfig是Android Framework层原生支持的机制,不需要任何root或系统级修改,证书加载走的是标准TrustManagerFactory流程,兼容性极佳。我用此法成功调试过包括Flutter、React Native、Unity打包的混合App,只要它们没做证书固定(Certificate Pinning),100%能抓到HTTPS流量。

注意:如果App使用了证书固定(Certificate Pinning),比如OkHttp里调用CertificatePinner,或在代码里硬编码了服务器证书公钥哈希,那么即使改了networkSecurityConfig,Burp的中间人证书也会被App主动拒绝。此时需配合Frida Hook绕过pinning,但这已超出本篇范围。

3.2 方案二:ADB命令强制全局信任用户证书(推荐指数 ★★★★☆)

当没有APK源码或无法重签名时(比如测试第三方闭源App),这个方案是救命稻草。它利用Android 7.0+引入的adb shell settings put global命令,动态修改系统全局网络策略。

核心命令

# 启用用户证书全局信任(Android 7.0+) adb shell settings put global capture_network_traffic 1 # 或更直接的方式:强制所有App信任用户证书(需Android 9+) adb shell settings put global network_security_config_override 1

但实测发现,network_security_config_override在多数AVD镜像中并不存在(返回Setting not found),而capture_network_traffic虽存在,却只影响系统WebView,对独立App无效。于是我们转向一个更底层、更可靠的方案:修改/data/misc/users/0/settings_global.xml中的trusted_certificate_authorities字段

完整流程

  1. 确保Burp证书已正确安装为用户证书(DER格式,通过Settings安装);
  2. 执行adb shell进入AVD shell;
  3. 获取用户证书的SHA-256指纹(关键!):
    adb shell "openssl x509 -inform DER -in /data/misc/user/0/cacerts-added/a1b2c3d4...e5f6.0 -fingerprint -sha256 -noout" # 输出类似:SHA256 Fingerprint=AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99
  4. 将指纹中的冒号去掉,转为小写,得到32字节十六进制字符串:aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899
  5. adb shell写入全局设置:
    adb shell "settings put global trusted_certificate_authorities 'aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899'"
  6. 重启目标App进程(不要重启整个AVD):adb shell am force-stop com.example.app

原理揭秘trusted_certificate_authorities是Android系统一个隐藏的全局设置项,它定义了一个以空格分隔的SHA-256指纹列表。当App初始化TrustManager时,如果发现该设置非空,就会自动将列表中指纹对应的用户证书加入信任锚点。这个机制在AOSP源码的frameworks/base/core/java/android/net/NetworkSecurityPolicy.java中有明确定义,是Google为企业MDM(移动设备管理)方案预留的后门,但完美适配我们的调试需求。

提示:此命令需在App启动前执行。如果App已在运行,需force-stop后重启,否则新设置不生效。另外,该设置重启AVD后会丢失,所以建议写成脚本一键执行。

3.3 方案三:重打包APK并注入自定义TrustManager(推荐指数 ★★☆☆☆)

这是终极方案,也是最危险的方案。当你面对一个启用了证书固定(Certificate Pinning)且签名强校验的App时,前两种方案全部失效,只能祭出此招。

核心思路:反编译APK → 定位所有TrustManager初始化代码(通常是X509TrustManager实现类)→ 替换为一个始终返回true的宽松TrustManager → 重打包签名。

实操难点

  • 定位难:现代App普遍使用OkHttp、Retrofit等网络库,TrustManager可能被封装在OkHttpClient.BuildersslSocketFactory()里,也可能在自定义X509TrustManager类中。需用JADX-GUI全局搜索TrustManagercheckServerTrustedsetHostnameVerifier等关键词;
  • 混淆重:ProGuard/R8混淆后,类名方法名全变成a.b.c.d,需结合字符串常量(如"javax.net.ssl.SSLPeerUnverifiedException")反推;
  • 签名严:APK Signature Scheme v3下,修改任何字节都会导致安装时报Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES],必须用apksigner sign --v3-signing-enabled false禁用v3签名,或用uber-apk-signer自动处理。

我曾用此法破解过某金融App的登录接口,耗时17小时:前8小时在JADX里找checkServerTrusted的调用链,中间6小时调试重打包后的ClassDefNotFoundError(因混淆导致类路径错乱),最后3小时解决java.lang.SecurityException: Permission Denial(因修改了AndroidManifest.xmlandroid:debuggable="true"属性,被系统拦截)。

警告:此方案仅限学习研究和授权渗透测试。未经许可修改他人App,违反《计算机信息网络国际联网安全保护管理办法》及《网络安全法》,切勿用于非法目的。

4. 从抓包失败到流量满屏:一次完整的故障排查链路

理论讲完,现在带你走一遍真实世界中最常见的抓包失败场景。这不是教科书式的“假设A→B→C”,而是我上周在调试一个Unity打包的Android游戏时,从抓包白屏到看到完整HTTPS请求流的完整时间线复盘。每一步都附带adb logcat关键日志、Burp状态截图逻辑和我的决策依据。

4.1 现象:App启动即崩溃,Logcat报javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found

时间点:T+0分钟
操作:启动AVD(Android 12, API 31),安装Burp证书(DER格式),配置Wi-Fi代理指向宿主机IP:8080,启动游戏APK。
Burp状态:Proxy → HTTP history为空,Event log显示Client connected from 10.0.2.15:54321,但无后续。
Logcat关键行

E Unity : AndroidJavaException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E Unity : at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in <00000000000000000000000000000000>:0

我的第一反应:证书没装对。但检查Settings → Security → Encryption & credentials → Trusted credentials → User,Burp证书确实在列表里,状态为“Enabled”。
排除思路

  • ✅ Burp监听端口正确(Proxy → Options → Proxy Listeners显示Running on 127.0.0.1:8080);
  • ✅ AVD Wi-Fi代理设置正确(Settings → Network & internet → Internet → [Wi-Fi name] → Modify network → Advanced options → Proxy: Manual, Host: 10.0.2.2, Port: 8080);
  • ✅ 宿主机防火墙放行8080端口(sudo ufw status确认8080/tcp ALLOW);
  • ❌ 证书信任范围:Unity引擎底层用的是Android Java SSL栈,它默认只信系统证书,而游戏APK未声明networkSecurityConfig

决策:采用方案一(修改networkSecurityConfig)。反编译APK,发现res/xml/下无此文件 → 说明App未自定义网络策略,走默认行为。于是新建res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">game-server.com</domain> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </domain-config> <!-- 全局兜底 --> <debug-overrides> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </debug-overrides> </network-security-config>

并在AndroidManifest.xml<application>节点添加:android:networkSecurityConfig="@xml/network_security_config"
重签名安装后,崩溃消失,但Burp里仍无流量。

4.2 现象:App能启动,但登录接口403,Burp显示Client Hello后断连

时间点:T+25分钟
Logcat关键行

D OkHttp : --> POST https://api.game-server.com/login http/1.1 D OkHttp : Content-Type: application/json; charset=UTF-8 D OkHttp : Content-Length: 123 D OkHttp : --> END POST (123-byte body) D OkHttp : <-- HTTP FAILED: javax.net.ssl.SSLHandshakeException: Connection closed by peer

Burp状态:HTTP history里出现CONNECT api.game-server.com:443,状态码200,但后续无POST /login请求。
我的直觉:证书固定(Certificate Pinning)。因为CONNECT成功说明TLS握手第一阶段(Client Hello → Server Hello)完成,但Client Hello后立即断连,是App在验证服务器证书时主动终止了连接。

验证方法

  1. jadx-gui打开APK,全局搜索CertificatePinnersetCertificatePinner
  2. 果然在okhttp3.OkHttpClient$Builder的初始化代码里找到:
    CertificatePinner pinner = new CertificatePinner.Builder() .add("api.game-server.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") .build(); OkHttpClient client = new OkHttpClient.Builder().certificatePinner(pinner).build();

决策:放弃方案一,启动方案三(重打包注入TrustManager)。但这次不硬编码,而是用Frida脚本动态Hook(更安全,无需重打包):

// frida -U -f com.game.app -l pinning-bypass.js --no-pause Java.perform(function() { var CertificatePinner = Java.use("okhttp3.CertificatePinner"); CertificatePinner.check.matchAll = function() { console.log("[+] Bypass CertificatePinner check"); return; }; });

启动Frida后,POST /login请求终于出现在Burp里,但响应体是加密的二进制(Content-Encoding: gzip+ 自定义AES加密)。

4.3 现象:HTTPS流量可见,但响应体是乱码,无法阅读

时间点:T+58分钟
Burp状态:HTTP history里POST /login状态码200,但Response Body显示\u001f\b\u0000\u0000\u0000\u0000\u0000\u0000[n0\u0014}W\u0017\u0016\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017\u0017......

原因定位:Unity引擎默认启用Gzip压缩,且游戏服务端对响应体做了二次AES加密。Burp默认只解压Gzip,不解密自定义加密。

解决步骤

  1. 在Burp Proxy → Options → Match and Replace里,添加规则:
    • Match type:Response header
    • Match:Content-Encoding: gzip
    • Replace:Content-Encoding: identity(禁用自动解压);
  2. 安装Burp插件Decoder,手动粘贴响应体Base64字符串,选择AES-128-CBC解密(密钥和IV从APK的assets/目录下config.json中提取);
  3. 解密后得到明文JSON:{"code":0,"data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}}

至此,整个HTTPS流量捕获闭环完成:从证书安装、策略绕过、pinning bypass到响应解密,每一步都踩在Android安全机制的边界上。而这一切,都始于你正确安装的那个DER格式的burp.cer文件。

5. 经验总结:那些文档里不会写的10个关键细节

写到这里,你应该已经明白:在Android模拟器里配Burp证书,不是点几下鼠标就能搞定的配置任务,而是一场与Android Framework层安全策略的深度对话。最后,分享我在上百次AVD调试中沉淀下来的10个血泪经验,全是文档里找不到、但能让你少走三天弯路的硬核细节:

  1. AVD镜像版本决定一切:Android 12(API 31)及以后的AVD,默认启用StrictMode网络策略,对未声明android:usesCleartextTraffic="true"的HTTP请求直接拦截。如果你抓的是HTTP流量,先检查AndroidManifest.xml是否漏了这行——否则Burp连CONNECT都收不到。

  2. 宿主机IP永远是10.0.2.2:这是AVD的特殊路由规则。无论你的宿主机Wi-Fi IP是192.168.1.100还是10.0.0.5,AVD里访问宿主机必须用10.0.2.2。这是QEMU虚拟化层的NAT映射,改不了,也别试图用adb reverse替代——它只支持TCP端口,不支持UDP或ICMP。

  3. Burp监听地址必须是0.0.0.0:8080:很多人设成127.0.0.1:8080,结果AVD连不上。因为127.0.0.1只监听本机回环,而AVD是独立网络命名空间,它的127.0.0.1指向自己,不是宿主机。必须设为0.0.0.0,让Burp监听所有网卡。

  4. 证书安装后必须重启App进程,不是重启AVD:我见过太多人证书装完立刻adb reboot,结果发现证书没了——因为用户证书存储在/data/misc/user/0/,而/data分区在AVD重启时是持久化的,但/data/misc/user/0/cacerts-added/下的证书文件需要KeyChainService重新加载。am force-stopreboot快10倍。

  5. 不要信“一键安装脚本”:网上流传的adb shell pm install ...批量安装证书的脚本,99%会失败。因为pm install只能装APK,不能触发CertInstaller服务。唯一可靠方式:通过Settings UI安装,或用adb shell am start -n com.android.certinstaller/.CertInstallerMain启动安装Activity(需已知证书URI)。

  6. Burp的CA证书有效期是10年,但Android系统只认前25年:Burp生成的证书默认有效期40年,而Android 7.0+的TrustManager会拒绝解析有效期超过25年的证书。解决方案:在Burp中Proxy → Options → Proxy Listeners → Edit → Import / Export CA Certificate → Export → Set validity period to 25 years

  7. 模拟器DNS污染是常态:AVD的DNS服务器默认是8.8.8.8,但经常被GFW干扰导致域名解析超时。临时方案:adb shell settings put global private_dns_mode hostname+adb shell settings put global private_dns_specifier dns.google,强制走DNS over TLS。

  8. Logcat过滤要精准:抓SSL错误,别用logcat | grep SSL,太多噪音。用logcat -s Unity:V OkHttp:V AndroidRuntime:E,聚焦Unity引擎、OkHttp库和致命异常。

  9. Burp的Project options → SSL → Client SSL certificates永远留空:除非你要测试双向认证(mTLS),否则填了反而导致连接失败。AVD客户端不需要提供证书给Burp。

  10. 终极保命技巧:用adb shell getprop | grep ro.build.version确认AVD真实版本:很多AVD镜像显示“Android 12”,但ro.build.version.sdk返回29(Android 10),这是因为Google用了旧版system.img。版本号错了,networkSecurityConfig语法就可能不兼容——比如<debug-overrides>在API 28以下无效。

这些细节,没有一条来自官方文档,全是我对着logcat一行行翻出来的。它们不会让你成为大神,但能确保你在凌晨两点面对一个白屏App时,心里有底,手上不慌。毕竟,真正的实战,从来不是按部就班,而是知道在哪条路上,哪个坑最深,以及怎么绕过去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询