Android中BuildConfig类的那些事<二>

本文介绍如何在Android项目中自定义BuildConfig类中的字段,通过示例展示了如何为FLAVOR字段赋值以及如何添加自定义字段,例如BaseUrl和DATE。

上篇文章已经简单讲解了BuildConfig类,今天我们来学习怎么扩展一些我们自己的信息进去

给FLAVOR字段赋值

FLAVOR字段是在我们多渠道打包的时候会自动赋值的,value取的就是我们的渠道名<怎么利用AndroidStudio打多渠道,请大家自行找搜索引擎>。
下面我们直接来实操一下:

android {
    ......
    productFlavors{
        应用宝{

        }
    }
    ......
}
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.class

这时我们进入BuildConfig,就可以看到FLAVOR被赋值了。

添加自己的字段

BuildConfig自有的一些常量值可能并不是很厉害,但如果可以添加自己想要的一些值就好了,这样就可以把一些常量值放置在此类了,很庆幸,这样的需求完全可以实现。
我们假设有这么一个需求,一般我们app和服务端交互时,要请求服务端的Url,然而BaseUrl在开发时大家一般都是抽出来定义成常量,这里我们就把这个BaseUrl写到1BuildConfig中。

android {
    ......
    buildType {
        debug {
            buildConfigField "String","BASE_URL","\"http://www.test.com/\""
            buildConfigField "int","DATE","20160701"
        }
    }
}

我们在buildType中的任意type(包括自定义的)中输入buildConfigField语法来实现的,此方法有三个参数buildConfigField(String type,String name,String value),解释下:

String type要创建的字段类型,如上面的Stringint
String name要创建的字段名,如上面的BASE_URLDATE
String value创建此字段的值,如上面的\"http://www.test.com/\"20160701

但这里要注意一点就是,当创建的类型为String时,定义value的时候要注意加上字符串不能缺少的双引号"",由于参数本身要传入的类型也是String,所以我们在添加的时候加上转义字符。

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 static final String BASE_URL = "http://www.test.com/";
    public static final int DATE = 20160701;

    public BuildConfig() {
    }
}

Custom BuildConfig.class

<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、付费专栏及课程。

余额充值