简单描述下场景。
有个Core library Module作为公用库,里面也集成了其他第三方 比如高德地图,比如拍照时候需要的FileProvider配置。
有多个app module在同一个工程,都调用core module。为了会打包成不同的app。这样问题就来了。实际是每个app的applicationid与第三方的key都是不同的因为包名就不同。
一.对于类似FileProvider的配置
正常来说app的AndroidManifest.xml中使用 ${applicationId}就能获取到当前的applicationId
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中设置占位符。
android:authorities="RPLACE_APPLICATION_ID.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加段脚本
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的
<meta-data android:name="com.amap.api.v2.apikey" android:value="123123123123123"/>
1.首先在Core library Module的AndroidManifest.xml中设置占位符。
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="RPLACE_AMAP_KEY"/>
2.各app的build.gradle加段脚本
replaceInManifest(manifestPath,'RPLACE_AMAP_KEY','242423424243');san
三.最后
对于需要区分debug等模式使用不同可以的场景
可以加些判断达到目的
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}