web-dev-qa-db-ja.com

ライブラリマニフェストで$ {applicationId}を使用する

内部ContentProviderを使用するSDKに取り組んでいます。このSDKをいくつかのプロジェクトで使用し、ライブラリマニフェストで宣言したいので、これを試しました。

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

$ {applicationId}は、ライブラリのpackageNameに置き換えられ、apk関連の最上位のapplicationIdではありません...

launching applicationIdがAndroid:authorities値に配置されることを確認する方法はありますか?

21
TacB0sS

いくつかの異なるバリアントと一意の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')
}

そしてマニフェストで:

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

それはかなり何度も重宝しています

8
Cruceo

マニフェストファイルの下で$ {applicationId}を使用できます。そのライブラリのgradleファイルに「applicationId」がないことを確認してください。 「defaultConfig」の下のgradleファイルで宣言した場合は、削除してください。

//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"
 }
2
Sagar Patel