Android中BuildConfig类的那些事<一>

本文详细介绍了Android开发中BuildConfig类的位置、作用及包含的内容。BuildConfig类位于应用包名下,其内容由构建过程自动生成,包括DEBUG标志、APPLICATION_ID、BUILD_TYPE等关键信息。

声明

本文章都只是在AndroidStudio基于Gradle构建项目开发的验证,所以不保证其它开发环境与构建项目方式也是这样

BuildConfig身在何处

了解一个东西前,至少先要知道这东西在哪里吧!而我们今天要了解的这个类又在哪里了,我相信应该还有一些安卓开发人员没见过此类的身影。那么这类在哪里了?
答案:一般情况是在applicationId<应用包名>.BuildConfig;如:我的应用ID为:com.jay.demo,那么此类的全类名就是com.jay.demo.BuildConfig

但这是一般情况,也就是说我们在创建工程时确定的应用包名,但这里答案准确的来说,此类是和R<resouce>类在同一个包里的,那么R<resouce>类的名路径是怎么确定的了?
答案:很明确,是由AndroidManifest.xml文件中的manifest标签中的package属性指定的包路径

BuildConfig有啥用

我们先从类名来试图理解这个类是做什么的,BuildConfig很明显是由BuildConfig组成,Build = 构建Config = 配置,那么直译过来就是BuildConfig = 构建配置,大致猜到了这个类可能会与一个配置相关的信息

BuildConfig的真面目

package com.jay.demo;

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.jay.demo";
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0";

    public BuildConfig() {
    }
}

这是创建一个项目后BuildConfig类,那这类中有些啥东西了?如果看过我之前的一篇文章,可能会更好的理解–Android Studio中Module的build.gradle详解,说之前科普下一个小知识,此类是不可修改的,严格来说不能通过我们之前正常编码那样对类一样修改

package com.jay.demo;

public final class BuildConfig {
    //这个常量是标识当前是否为`debug`环境,由`buildType`中的`debuggable`来确定的,这是修改此类值的一个方式
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    //application id
    public static final String APPLICATION_ID = "com.jay.demo";
    //当前编译方式
    public static final String BUILD_TYPE = "debug";
    //编译渠道,如果没有渠道,则为空
    public static final String FLAVOR = "";
    //版本号
    public static final int VERSION_CODE = 1;
    //版本名,所以获取当前应用的版本名可以直接 BuildConfig.VERSION_NAME
    public static final String VERSION_NAME = "1.0";

    public BuildConfig() {
    }
}
<think>我们正在处理个MAUI项目,需要配置允许特定域名的明文HTTP流量(cleartext traffic)。在Android原生开发中,我们通常通过`network_security_config.xml`文件来配置网络安全策略,然后在`AndroidManifest.xml`中引用。在MAUI项目中,由于它基于Xamarin的跨平台框架,我们同样需要配置Android特定的部分。 根据用户的问题,他们希望在MAUI项目中允许明文HTTP流量。在MAUI中,配置Android的网络安全策略的步骤与传统的Xamarin.Android似,但需要注意MAUI项目结构。 步骤: 1. 在`Platforms/Android`目录下创建(或修改)`Resources/xml/network_security_config.xml`文件。 2. 编辑该文件,添加允许明文流量的域名配置。 3. 在`Platforms/Android`目录下的`AndroidManifest.xml`文件中引用这个配置文件。 具体操作如下: ### 1. 创建或修改网络安全配置文件 在MAUI项目的`Platforms/Android/Resources/xml`目录中,创建`network_security_config.xml`文件(如果不存在则创建)。然后在该文件中配置允许明文流量的域名。 例如,允许`example.com`及其子域名的明文流量: ```xml <?xml version="1.0" encoding="utf-8"?> <network-security-config> <!-- 允许特定域名使用明文HTTP --> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">example.com</domain> <!-- 可以添加多个域名 --> </domain-config> <!-- 默认情况下禁止明文流量 --> <base-config cleartextTrafficPermitted="false" /> </network-security-config> ``` 注意:这里我们设置了个域名配置(domain-config)允许明文流量,同时设置了个基础配置(base-config)禁止明文流量。这样,除了我们明确允许的域名,其他都禁止明文流量。 ### 2.AndroidManifest.xml中引用配置文件 打开`Platforms/Android/AndroidManifest.xml`文件(通常在`Platforms/Android`目录下),在`<application>`标签中添加`android:networkSecurityConfig`属性,指向我们创建的配置文件: ```xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:networkSecurityConfig="@xml/network_security_config" ...> ... </application> </manifest> ``` 注意:如果`AndroidManifest.xml`中已经存在`<application>`标签,则只需添加`android:networkSecurityConfig`属性即可。 ### 3. 关于IP地址的注意项 如果允许的域名是IP地址(如开发测试时使用本地IP),则需要在`<domain>`标签中直接写IP地址,例如: ```xml <domain includeSubdomains="true">192.168.1.100</domain> ``` 但是注意,IP地址在`<domain>`标签中是允许的,但`includeSubdomains`对于IP地址没有实际意义,因为IP地址没有子域的概念。 ### 4. 动态配置(可选) 根据引用[4],我们还可以通过Gradle配置为不同构建型(debug/release)设置不同的网络安全配置文件。在MAUI项目中,我们通常不直接修改Gradle文件,但可以通过条件编译或文件替换来实现似效果。不过,在MAUI中更常见的做法是使用条件编译指令或维护不同的配置文件,然后通过构建过程替换。 但是,在MAUI中,我们通常直接修改`AndroidManifest.xml`和`network_security_config.xml`文件,因为MAUI的项目结构已经简化。如果需要为Debug和Release设置不同的配置,可以: - 在`Resources`目录下创建两个文件:`network_security_config_debug.xml`和`network_security_config_release.xml`。 - 然后通过修改`.csproj`文件,在构建时根据配置选择不同的文件。 不过,由于MAUI项目默认没有提供这样的钩子,个简单的方法是使用条件编译指令在代码中修改,但这样较为复杂。另种方法是,在Debug配置中允许所有明文流量(不推荐)或仅允许特定域名(如测试服务器),在Release中禁止。我们可以通过以下方式: 在`network_security_config.xml`中,我们也可以使用条件编译,但XML本身不支持条件编译。因此,我们可以在构建时替换文件。但考虑到复杂性,对于大多数情况,我们可以在Release配置中移除允许明文的配置,只保留Debug配置。但是,我们更推荐在Release中完全禁止明文流量。 如果确实需要,可以在`.csproj`文件中添加构建任务,根据配置替换文件。但这里不展开,因为大多数情况下,我们只需要在开发阶段允许特定域名(如本地测试IP),而在发布时移除这些配置。 ### 5. 验证配置生效 配置完成后,在应用启动时会应用这些安全配置。我们可以通过以下方式验证: - 尝试向配置允许明文流量的域名发起HTTP请求,应该能成功。 - 尝试向其他域名发起HTTP请求,应该失败(抛出`CLEARTEXT communication not permitted`异常)。 ### 6. 注意项 - **Android 9及以上版本**:默认禁止明文流量,因此必须进行此配置[^3]。 - **安全性**:允许明文流量会降低安全性,建议仅在开发测试阶段使用,生产环境应使用HTTPS。 如果遇到问题,请检查: - 配置文件路径是否正确(`Platforms/Android/Resources/xml/network_security_config.xml`)。 - `AndroidManifest.xml`中是否引用了该配置文件(属性`android:networkSecurityConfig`)。 - 域名是否拼写正确(不支持通配符,如`*.example.com`,但可以通过`includeSubdomains="true"`来包含子域名)。 通过以上步骤,MAUI项目就可以允许特定域名的明文HTTP流量了。 相关问题: 1. 在MAUI中如何为不同构建配置(Debug/Release)设置不同的网络安全策略? 2. 在MAUI中配置网络安全后,如何解决`CLEARTEXT communication not permitted`错误? 3. MAUI项目中的AndroidManifest.xml文件位置在哪里? 4. 除了允许明文流量,还有哪些方法可以安全地连接本地开发服务器? 5. 在MAUI中如何配置自定义证书或信任用户证书?</think>### MAUI 项目中配置允许明文 HTTP 流量的方法 在 .NET MAUI 项目中配置允许明文 HTTP 流量,需要通过 Android 原生配置实现。以下是详细步骤: #### 1. **添加网络安全配置文件** 在 `Platforms/Android/Resources/xml/` 目录下创建 `network_security_config.xml` 文件(若目录不存在请手动创建): ```xml <?xml version="1.0" encoding="utf-8"?> <network-security-config> <!-- 允许特定域名/IP使用明文HTTP --> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">example.com</domain> <domain includeSubdomains="true">192.168.1.100</domain> <!-- 本地测试IP --> </domain-config> <!-- 默认禁止所有明文流量 --> <base-config cleartextTrafficPermitted="false" /> </network-security-config> ``` #### 2. **修改 AndroidManifest.xml** 在 `Platforms/Android/AndroidManifest.xml` 的 `<application>` 标签中添加引用: ```xml <application android:networkSecurityConfig="@xml/network_security_config" ... > </application> ``` #### 3. **配置构建型(可选)** 在 `Platforms/Android/AndroidManifest.xml` 中动态配置不同环境的策略: ```xml <application android:networkSecurityConfig="@xml/network_security_config_${buildConfig}" ... > </application> ``` 在 `.csproj` 文件中添加配置: ```xml <PropertyGroup Condition="'$(Configuration)'=='Debug'"> <AndroidManifestPlaceholders>buildConfig=debug</AndroidManifestPlaceholders> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)'=='Release'"> <AndroidManifestPlaceholders>buildConfig=release</AndroidManifestPlaceholders> </PropertyGroup> ``` #### 4. **创建不同环境的配置文件** - **Debug 配置** (`Resources/xml/network_security_config_debug.xml`): ```xml <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.1.100</domain> </domain-config> </network-security-config> ``` - **Release 配置** (`Resources/xml/network_security_config_release.xml`): ```xml <network-security-config> <base-config cleartextTrafficPermitted="false" /> </network-security-config> ``` #### 关键注意项: 1. **Android 9+ 限制**:从 Android 9 (API 28) 开始,默认阻止所有明文流量[^3] 2. **IP 地址支持**:可直接在 `<domain>` 标签中使用 IP 地址[^3] 3. **子域名包含**:`includeSubdomains="true"` 包含所有子域名 4. **安全警告**:生产环境**必须使用 HTTPS**,明文配置仅限测试环境[^3] 5. **MAUI 特殊路径**:配置文件必须放在 `Platforms/Android/Resources/xml/` 目录下 #### 验证配置是否生效: 1. 发起 HTTP 请求到配置的域名/IP 2. 使用 Android Studio 的 Logcat 查看网络安全策略加载日志 3. 若出现 `CLEARTEXT communication not permitted` 错误,表示配置未生效[^3] > **最佳实践**:通过 `#if DEBUG` 条件编译在代码层面对明文请求进行额外控制,避免生产环境意外使用 HTTP。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值