在库清单中使用 ${applicationId}

Using ${applicationId} in library manifest

我正在开发一个使用内部 ContentProvider 的 SDK,我想在几个项目中使用这个 SDK,并在库清单中声明它,所以我尝试了这个:

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

发生的事情是 ${applicationId} 被替换为库的 packageName 而不是顶级 apk 相关的 applicationId...

有没有办法确保 launching 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 < 3

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')
}

然后在清单中:

<provider
    android:name=".core.MyContentProvider"
    android:authorities="P_AUTHORITY"
    android:exported="false"/>

这已经派上用场好几次了

您可以在清单文件下使用 ${applicationId}。只需确保该库的 gradle 文件中没有“applicationId”。如果您在 gradle 文件中的“defaultConfig”下声明了它,请将其删除。

//So your gradle file of library(SDK) module looks like..

defaultConfig {
minSdkVersion Version.minSdk
targetSdkVersion Version.targetSdk
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} 


//And your application gradle file looks like..

defaultConfig {
    applicationId "com.example.android"
    minSdkVersion Version.minSdk
    targetSdkVersion Version.targetSdk
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 }

只需将其设为 gradle 风味变量,它将加载不同风味的动态值。我为 FacebookContenProvider 做了这个,但同样的原则适用

清单:

<provider android:authorities="@strings/authority"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>

Gradle:

productFlavors {
    flavorName {
        ...
        resValue "string", "authority", "com.facebook.app.FacebookContentProvider'YOUAPPID'"
    }
}