最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

Android开发之在library的manifest中使用 ${applicationId}

Android 天狐 16280浏览 0评论

简单描述下场景。

有个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}

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址