Подтвердить что ты не робот

Использование ${applicationId} в манифесте библиотеки

Я работаю над SDK, который использует внутренний ContentProvider, я хотел бы использовать этот SDK в нескольких проектах и ​​объявить его в манифесте библиотеки, поэтому я пробовал это:

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

Случается, что ${applicationId} заменяется на имя пакета библиотеки, а не связанное с apk app app...

Есть ли способ убедиться, что запуск applicationId будет помещен в значение android: authority?

4b9b3361

Ответ 1

Выполнялась одна и та же проблема с несколькими разными вариантами и уникальными идентификаторами, и в итоге она заменила ключ-заполнитель, когда 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"/>

Это пригодится довольно много раз