Android Gradle实用技巧(五) | 善用AndroidManifest占位符

综合编程 2017-03-28

Android Gradle必备使用技巧,未完待续,欢迎关注公众号 flysnow_org ,第一时间看后续技巧。

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

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

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

manifestPlaceholders是ProductFlavor的一个属性,他是一个Map

类型,所以我们可以同时配置很多个占位符。下面我们就通过这个配置渠道号的例子来演示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文件中具体的使用:



    
        
        
            
                

                
            
        
    


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

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


    
        
        
            
                
                
            
        
    

通过以上方式我们就可以动态的配置我们的渠道,非常方便,但是这里也有一个问题,就是我们渠道非常多的时候呢?在中国,你们懂的,一个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信息等等,灵活的运用它能帮助我们做很多事情,让我们的构建更灵活,更方便。

Android Gradle必备使用技巧,未完待续, 欢迎关注公众号 flysnow_org ,第一时间看后续技巧。

您可能感兴趣的

xhook 1.1.8 发布,通用的 Android PLT hook 库... xhook 1.1.8 发布了,更新内容如下: 支持x86 和 x86_64。 增加xhook_ignore接口,用于忽略部分已注册的hook点。 修复偶发的地址边界计算bug。 x...
Android高德之旅(8)绘制线 废话 绘制线会比绘制点稍微复杂点,抛开一些复杂的属性不谈,主要分为三类:实线、虚线、纹理。绘制线在自定义地图中是非常重要的一个环节。 简单的api 看下api你会发现,绘制实线、虚线、纹理都是调用一个api:AMap.addPolyline(PolylineOptions);只是opti...
Change color to gradient as ScreenSaver? hello friends i want to change color of gradient like below image. m trying from so many days but no luck. can you help me? Thanks in advance! ...
Error: Trying to request a cursor alread... I'm running into an error but I can't seem to find a solution. My application is working on ICS 4.0.3 but it returns the error on Android 3.2. Her...
Android内存溢出OOM:常见内存泄漏 在上一篇文章中我们对Android中内存有了一个基本的了解,在本文继续介绍有关内存溢出的相关点。当内存泄漏超过一定的界限,必然会引起内存溢出,有些内存泄漏在开发中是比较常见的,接下来通过介绍几种常见额内存泄漏情形,以便在开发过程中采取必要的措施以此防止内存泄漏。 如下是Android开发者...
0
飞雪无情的博客

责编内容来自:飞雪无情的博客 (本文源链)
阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。