You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AndroidTV/FireTV配置Charles Proxy时网络安全配置资源解析异常

解决AndroidTV/FireTV中Charles Proxy证书在network_security_config.xml的解析问题

我之前在给AndroidTV和FireTV配置Charles SSL代理时,也遇到过完全一样的问题——明明证书资源放在res/raw里,配置里写了@raw/my_ca,IDE自动补全成应用命名空间,编译能过但运行直接崩溃,报错说Unknown certificates src。折腾了好久终于找到了解决办法,分享给你:

先还原下我的问题场景和报错信息,和你的情况几乎一致:

我的network_security_config.xml配置:

<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="@raw/my_ca" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

运行时崩溃日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.package, PID: 29431
java.lang.RuntimeException: Unable to create application com.my.package.tv.ui.TVAppClass: java.lang.RuntimeException: Failed to parse XML configuration from network_security_config
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5881).

Caused by: android.security.net.config.XmlConfigSource$ParserException: Unknown certificates src. Should be one of system|user|@resourceVal
at: Binary XML file line #6
at android.security.net.config.XmlConfigSource.parseCertificatesEntry(XmlConfigSource.java:211)
at android.security.net.config.XmlConfigSource.parseTrustAnchors(XmlConfigSource.java:226)
at android.security.net.config.XmlConfigSource.parseConfigEntry(XmlConfigSource.java:280)
at android.security.net.config.XmlConfigSource.parseNetworkSecurityConfig(XmlConfigSource.java:350)
at android.security.net.config.XmlConfigSource.ensureInitialized(XmlConfigSource.java:101)

systemuser虽然能运行,但Charles根本抓不到HTTPS包,完全达不到代理目的。

问题根源

AndroidTV/FireTV的系统XML解析逻辑比普通手机更严格,它要求资源引用必须带上正确的应用命名空间,或者使用完整的资源ID值,单纯的@raw/my_ca会被系统判定为无效格式。

解决步骤

1. 给配置文件添加应用命名空间并正确引用资源

这是最稳妥的长期解决方案,修改你的network_security_config.xml,在根节点声明命名空间,然后用命名空间前缀引用证书资源:

<network-security-config xmlns:app="http://schemas.android.com/apk/res-auto">
    <debug-overrides>
        <trust-anchors>
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="app:@raw/my_ca" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

之前IDE自动补全的appNs只是命名空间的默认别名,你可以改成app或者其他你喜欢的名字,只要和根节点声明的xmlns:xxx一致就行。

2. 临时测试:直接使用资源ID

如果你只是临时调试,不想改命名空间,可以直接用R.raw.my_ca对应的int值。你可以在Android Studio的R.java文件里找到这个值(或者通过Log打印出来),然后写成:

<certificates src="@2131230721" />

注意:这个ID会随着资源的修改而变化,所以只适合临时用,正式代码还是用命名空间的方法。

3. 验证证书资源本身的正确性

别忽略最基础的检查:

  • 证书文件必须放在res/raw目录下,文件名全小写,不能有空格或特殊字符(比如my_ca.crt是正确的,MyCA.crtmy ca.crt会出问题)。
  • 确保证书是PEM格式,Charles导出的证书默认就是这个格式,不用转换。

4. FireTV额外注意事项

FireTV设备对证书信任有额外限制,除了配置文件,你还需要:

  • 手动在设备上安装Charles证书到用户信任区:进入「设置」→「安全与限制」→「安装未知应用」,允许你的应用安装未知内容,然后通过浏览器或文件管理器打开Charles证书文件完成安装。
  • 确保你的AndroidManifest.xml里声明了<uses-permission android:name="android.permission.INTERNET" />,并且debug版本开启了android:debuggable="true"(在application节点里设置)。

验证方法

修改配置后,执行「Clean Project」→「Rebuild Project」,然后运行应用。打开Charles设置好代理,访问应用里的HTTPS接口,就能看到抓包内容了。

内容的提问来源于stack exchange,提问作者Blaze Gawlik

火山引擎 最新活动