我正在开发一个使用内部ContentProvider的SDK,我想在一些项目中使用此SDK,并在库 list 中声明它,因此我尝试了以下操作:

    <provider
        android:name=".core.MyContentProvider"
        android:authorities="${applicationId}"
        android:exported="false"/>

会发生什么情况,将 $ {applicationId} 替换为库的packageName,而不是与顶部apk相关的applicationId ...

有没有一种方法可以确保将启动 applicationId放置在 android:authorities 值中?

最佳答案

在使用几个不同的变体和唯一ID时遇到了相同的问题,最终在Gradle构建应用程序时替换了一个占位符,例如:

Gradle 3+

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.processManifest.doLast {
            File manifestFile = file("$manifestOutputDirectory/AndroidManifest.xml")

            replaceInFile(manifestFile, 'P_AUTHORITY', variant.applicationId)
        }
    }
}

def replaceInFile(file, fromString, toString) {
    def updatedContent = file.getText('UTF-8')
            .replaceAll(fromString, toString)

    file.write(updatedContent, 'UTF-8')
}

Gradle
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.processManifest.doLast{
            replaceInManifest(output, 'P_AUTHORITY', variant.applicationId)
        }
    }
}

def replaceInManifest(output, fromString, toString) {
    def manifestOutFile = output.processManifest.manifestOutputFile
    def updatedContent = manifestOutFile.getText('UTF-8').replaceAll(fromString, toString)
    manifestOutFile.write(updatedContent, 'UTF-8')
}

然后在 list 中:
<provider
    android:name=".core.MyContentProvider"
    android:authorities="P_AUTHORITY"
    android:exported="false"/>

方便了好几次

10-08 17:09