Переопределить applicatoinID внутри манифеста проекта библиотеки с помощью Gradle

У меня есть основной проект, который ссылается на проект библиотеки. Оба они скомпилированы с помощью Gradle.

Это конфигурация по умолчанию для основного файла градиента проекта:

defaultConfig {
    applicationId "com.example.app"
    minSdkVersion 15
    targetSdkVersion 21
    versionCode 2
    versionName "1.0"
}

И это defaultConfig для файла gradle проекта библиотеки:

defaultConfig {
    minSdkVersion 11
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}

Как видите, я не объявляю идентификатор приложения внутри библиотеки.

У меня есть разрешение, определенное в моем проекте library, как показано ниже:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.library">

<permission android:name="${applicationId}.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />

Когда я создаю проект, applicationId заменяется на com.example.library (имя пакета библиотеки). И это не то, чего я хочу. Я хочу заменить его на com.example.app, так как это applicationId моего приложения.

Если я помещу заполнитель ${applicationID} в файл манифеста приложения, все будет работать.

Кто-нибудь знает, можно ли это реализовать и как?


person edoardotognoni    schedule 16.01.2015    source источник
comment
В соответствии с этим stackoverflow.com/a/55429286/1916449 я думаю, что это должно просто работать?   -  person arekolek    schedule 28.07.2021


Ответы (4)


Я вижу следующее решение:

Проект build.gradle

ext {
   applicationId = "com.yourproject"
}

Сборка приложения.gradle

defaultConfig {
        applicationId rootProject.applicationId
}

Библиотека build.gradle

buildTypes {
        release {
            buildConfigField 'String', 'ROOT_APPLICATION_ID', rootProject.applicationId
        }
        debug {
            buildConfigField 'String', 'ROOT_APPLICATION_ID', "\"" + rootProject.applicationId + ".dev\""
        }
}

Кроме того, если вы хотите использовать переменную в манифесте, используйте следующий способ:

Библиотека build.gradle

android {

    defaultConfig {        
        manifestPlaceholders = [ROOT_APPLICATION_ID:rootProject.applicationId]
    }

 buildTypes {
            release {
                buildConfigField 'String', 'ROOT_APPLICATION_ID', "\"" + manifestPlaceholders.get("ROOT_APPLICATION_ID")+ "\""
            }
            debug {
               manifestPlaceholders.put("ROOT_APPLICATION_ID", rootProject.applicationId + ".dev");
               buildConfigField 'String', 'ROOT_APPLICATION_ID', "\"" + manifestPlaceholders.get("ROOT_APPLICATION_ID")+ "\""
            }
    }

}

Переменная из defaultConfig будет доступна в mainfest, а переменные из buildTypes будут доступны в коде.

Манифест

<provide android:name="com.lazada.core.storage.db.LazadaContentProvider"
            android:authorities="${ROOT_APPLICATION_ID}.authority"
            android:exported="false" />
person Alexey Glukharev    schedule 11.05.2017

Здесь вы можете увидеть, как изменить значения в манифесте http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

В разделе Поддержка заполнителей вы увидите более подробную информацию.

person mromer    schedule 16.01.2015
comment
Кажется, по вашей ссылке нет решения. В документе слияния манифеста они относятся только к основному файлу градиента модуля приложения. По крайней мере, я ничего не видел о своей проблеме. - person edoardotognoni; 16.01.2015

в вашем приложении.градле

    def packagename = "com.packagename";
    android {
        defaultConfig {
        applicationId packagename
    }

    buildTypes {
        debug {
            applicationIdSuffix ".dev"
            manifestPlaceholders = [finalApplicationId: packagename + applicationIdSuffix]
        }
        release {
            applicationIdSuffix ""
            manifestPlaceholders = [finalApplicationId: packagename + applicationIdSuffix]
        }

В манифесте вашей библиотеки

<provider android:name="an.example"
                  android:authorities="${finalApplicationId}.recommendation" />
person Pauland    schedule 24.06.2015
comment
Этот вид работает, но не работает для таких задач, как :lib:processDebugAndroidTestManifest - person arekolek; 28.07.2021

Установить идентификатор приложения библиотеки в градации библиотеки

buildTypes {

release { 
applicationId "com.example.library"}}
person QArea    schedule 16.01.2015
comment
Вы имеете в виду, что если я установлю applicationId внутри библиотеки, он будет заменен на основной проект? Я попробую, и я дам вам знать - person edoardotognoni; 16.01.2015
comment
К сожалению, вы не можете установить applicationId внутри проекта библиотеки. Так что это не правильный ответ, извините - person edoardotognoni; 19.01.2015