Переопределить applicationatoinID внутри манифеста библиотечного проекта с помощью Gradle
У меня есть основной проект, который ссылается на проект библиотеки. Они оба составлены с Gradle.
Это defaultConfig для основного файла проекта:
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"
}
Как видите, я не объявляю ни одного applicationId внутри библиотеки.
У меня есть разрешение, определенное внутри моего библиотечного проекта, как показано ниже:
<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} в файл манифеста приложения, все будет работать.
Кто-нибудь знает, можно ли это сделать и как?
4 ответа
Я вижу следующее решение:
Проект build.gradle
ext {
applicationId = "com.yourproject"
}
Приложение build.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" />
В вашем приложении.
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" />
Здесь вы можете увидеть, как изменить значения в манифесте http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger
В разделе Поддержка местозаполнителей вы увидите более подробную информацию.
Установить идентификатор приложения библиотеки в библиотеке Gradle
buildTypes {
release {
applicationId "com.example.library"}}