简单描述下场景。
有个Core library Module作为公用库,里面也集成了其他第三方 比如高德地图,比如拍照时候需要的FileProvider配置。
有多个app module在同一个工程,都调用core module。为了会打包成不同的app。这样问题就来了。实际是每个app的applicationid与第三方的key都是不同的因为包名就不同。
一.对于类似FileProvider的配置
正常来说app的AndroidManifest.xml中使用 ${applicationId}就能获取到当前的applicationId
1 2 3 4 5 6 |
android:authorities="${applicationId}.FileProvider" android:name="android.support.v4.content.FileProvider" android:grantUriPermissions="true" android:exported="false"> android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> |
但是,不管工程是一个app target还是多个,普通library module是无法获取到app的${applicationId}的。肿么办呢,借助强大的gradle,在AndroidManifest merge以后用脚本进行字符串替换,达到目的。
1.首先在Core library Module的AndroidManifest.xml中设置占位符。
1 2 3 4 5 6 |
android:authorities="<span style="color: #ff0000;"><strong>RPLACE_APPLICATION_ID</strong></span>.FileProvider" android:name="android.support.v4.content.FileProvider" android:grantUriPermissions="true" android:exported="false"> android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> |
2.各app的build.gradle加段脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
android.applicationVariants.all { variant -> variant.outputs.each { output -> output.processResources.doFirst { pm-> String manifestPath = output.processResources.manifestFile; print(manifestPath); replaceInManifest(manifestPath,'RPLACE_APPLICATION_ID',variant.applicationId); } } } def replaceInManifest(manifestPath, fromString, toString) { def manifestContent = file(manifestPath).getText('UTF-8') manifestContent = manifestContent.replace(fromString, toString) file(manifestPath).write(manifestContent, 'UTF-8') } |
解决!
二.对于类似高德需要配置某些key的
1 2 3 |
<meta-data android:name="com.amap.api.v2.apikey" android:value="123123123123123"/> |
1.首先在Core library Module的AndroidManifest.xml中设置占位符。
1 2 3 |
<meta-data android:name="com.amap.api.v2.apikey" android:value="<span style="color: #ff0000;">RPLACE_AMAP_KEY</span>"/> |
2.各app的build.gradle加段脚本
1 |
replaceInManifest(manifestPath,'RPLACE_AMAP_KEY','242423424243');san |
三.最后
对于需要区分debug等模式使用不同可以的场景
可以加些判断达到目的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
android.applicationVariants.all { variant -> def buildTypeName = variant.buildType.name def flavorName = variant.flavorName String AMAP_KEY = null; if ("debug".equalsIgnoreCase(buildTypeName)) { AMAP_KEY = '12313123' } else { AMAP_KEY ='332423424' } variant.outputs.each { output -> output.processResources.doFirst { pm-> String manifestPath = output.processResources.manifestFile; print(manifestPath); replaceInManifest(manifestPath,'RPLACE_AMAP_KEY',AMAP_KEY); } } } |
本文只是抛转引用,在gradle 3.4+测试通过。
四.参考链接
https://www.jianshu.com/p/1e69d25d97cc
https://stackoverflow.com/questions/30790768/using-applicationid-in-library-manifest
转载请注明:天狐博客 » Android开发之在library的manifest中使用 ${applicationId}