Android Gradle 占位符使用

占位符,其实是一个可以被替换的临时标记,比如${name},我们就可以使用真实的name变量的值替换这个占位符,达到可以动态的修改这个占位符的目的。所以AndroidManifest文件的占位符,其实是帮助我们动态修改AndroidManifest文件里的内容,这样的例子非常多,比如我们使用友盟等第三方分析统计的时候,会要求我们在AndroidManifest文件中指定渠道名称。

<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

示例中的Channel ID我们要替换成不同渠道的名称,比如google,baidu,miui等等。

对于这种情况我们不可能定义很多个AndroidManifest文件,因为这种工作繁琐,而且维护麻烦,所以我们就需要在构建的时候,根据我们正在生成的不同渠道包来为其指定不同的渠道名,对于这种情况Android Gradle为我们提供了非常便捷的方法让我们来替换AndroidManifest文件中的内容,它就是ManifestPlaceholder,Manitest占位符。

manifestPlaceholders是ProductFlavor的一个属性,他是一个Map<String, Object>类型,所以我们可以同时配置很多个占位符。下面我们就通过这个配置渠道号的例子来演示manifestPlaceholders的用法。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    productFlavors {
        google {
            manifestPlaceholders.put("UMENG_CHANNEL","google")
        }
        baidu {
            manifestPlaceholders.put("UMENG_CHANNEL","baidu")
        }
    }
}

例子中我们定义了两个渠道google和baidu,并且配置了他们的manifestPlaceholders。留意我们的使用方式,他们的Key都是一样的,是UMENG_CHANNEL,这个key就是我们在AndroidManifest文件中的占位符变量,在构建的时候,它会把AndroidManifest文件文件中所有占位符变量为UMENG_CHANNEL的内容替换为我们manifestPlaceholders中对应的value值。我们看AndroidManifest文件中具体的使用:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.flysnow.app"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.Black">
        <meta-data android:value="${UMENG_CHANNEL}" android:name="UMENG_CHANNEL"/>
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

看到以上示例中的meta-data标签了吗?其中${UMENG_CHANNEL}就是一个占位符,它的变量名是UMENG_CHANNEL。构建的时候${UMENG_CHANNEL}将会被替换为google或者baidu。

现在我们运行./gradlew app:assembleBaiduRelease,打一个百度渠道的包,然后通过apktool反编译,可以看到AndroidManifest文件中的${UMENG_CHANNEL}已经被替换为了baidu。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.flysnow.app" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415">
    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@android:style/Theme.Black">
        <meta-data android:name="UMENG_CHANNEL" android:value="baidu"/>
        <activity android:label="@string/title_activity_main" android:name="org.flysnow.app.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

通过以上方式我们就可以动态的配置我们的渠道,非常方便,但是这里也有一个问题,就是我们渠道非常多的时候呢?在中国,你们懂的,一个App很随意的就有几十个渠道需要发布,我们总不能一个个的配置吧,太多也太累,维护也麻烦。假如我们的友盟的渠道名和我们在Android Gradle中配置的ProductFlavor一样的话就简单了,我们可以通过迭代productFlavors批量的方式进行修改。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    productFlavors {
        google {
        }
        baidu {
        }
    }

    productFlavors.all { flavor ->
        manifestPlaceholders.put("UMENG_CHANNEL",name)
    }
}

我们通过all函数遍历每一个ProductFlavor,然后把他们的name作为我们友盟中渠道的名字,非常方便,这里不止可以做这一个事情,在遍历ProductFlavor的时候,你可以做很多你想做的事情,这就是Gradle的灵活之处,把脚本当成程序写。

Android Gradle为我们提供的manifestPlaceholders占位符的方式,让我们可以替换AndroidManifest文件中任何${Var}格式的占位符,所以它的使用场景不限于渠道名这一个,比如还有ContentProvider的auth的授权,或者其他动态想配置meta信息等等,灵活的运用它能帮助我们做很多事情,让我们的构建更灵活,更方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Glide 是一种常用的 Android 图片加载库,使用 Glide 可以方便地加载、缓存和显示图片。 以下是使用 Glide 加载图片的基本步骤: 1. 添加依赖 在 app 模块的 build.gradle 文件中添加以下依赖: ``` dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' } ``` 2. 加载图片 使用 Glide 加载图片需要在代码中调用 Glide.with() 方法并传入一个 Context 对象,然后链式调用一系列方法来配置图片的加载和显示方式,最后调用 into() 方法来显示图片。 以下是一个简单的示例: ``` Glide.with(context) .load(url) .placeholder(R.drawable.placeholder) .error(R.drawable.error) .fitCenter() .into(imageView); ``` 其中,load() 方法用于指定要加载的图片的 URL 或资源 ID;placeholder() 方法用于在图片加载完成前显示的占位符;error() 方法用于在图片加载失败时显示的图片;fitCenter() 方法用于调整图片的缩放方式,使得图片能够完全显示在 ImageView 中;into() 方法用于指定要显示图片的 ImageView 对象。 3. 其他配置选项 除了上述基本配置选项外,Glide 还支持许多其他配置选项,例如: - centerCrop():将图片剪裁为 ImageView 的中心区域,然后缩放到 ImageView 的大小。 - circleCrop():将图片剪裁为圆形,然后缩放到 ImageView 的大小。 - transform():对图片进行自定义变换,例如旋转、裁剪等操作。 - diskCacheStrategy():指定图片的缓存方式,例如只缓存原始图片、只缓存转换后的图片、缓存所有图像等。 - priority():指定图片加载的优先级。 - 等等。 以上是使用 Glide 加载图片的基本步骤和一些常用配置选项,具体使用可以参考 Glide 的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值