Android Studio 1.0和错误“ Library project can not set applicationId”

在将 Android Studio 升级到1.0之后,我看到了这个错误:

错误: 库项目无法设置 applicationId 到默认配置中的“ com.super.app”。

I updated the Gradle plugin as suggested but I did not understand how to fix this.

57503 次浏览

基于此 info:

图书馆项目中的 ApplicationId

不能使用 applicationId 自定义库项目的包。包名称必须在库项目中固定(并在清单中指定为 packageName)。Gradle 插件之前没有强制执行这个限制。

从库的 build.gradle文件中删除 applicationId 变量应该可以解决这个问题。

感谢 Joel 的正确回答: 我只需要从 te.gradle文件中删除1行:

defaultConfig {
applicationId "com.super.app"   <---- remove this line
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}

变成了

defaultConfig {
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}

和我的 AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.super.app">
...

如果您不需要重命名应用程序的包名,那么这就是正确的解决方案。为了重新命名它,你需要使用“风味”:

android {
...
productFlavors {
flavor1 {
applicationId 'com.super.superapp'
}
}

以防对某人有帮助:

当我将 Eclipse 项目导入到 android 工作室时,我得到了一个错误:

"Error:Application and test application id cannot be the same"

虽然很奇怪,但是我查看了 build.gradle 并找到了两个占位符,一个用于应用程序,另一个用于 testapplication。

我删除了 testApplicationId,正如本文中建议的那样,这帮助我解决了这个问题。

注意: 这个解释与这个问题中的错误无关,但是可能会帮助那些得到类似错误的人。

不能为库定义 applicationId。 但是,如果您希望在生成文件中使用标识符(这将为您提供库包名称) ,则可以为模块定义一个变量,然后根据需要使用该值。

图书馆的建筑

apply plugin: 'com.android.library'


def libraryGroupId = 'com.google.example'
def libraryArtifactId = project.getName()
def libraryVersion = '1.1'

另外,您可以根据需要在 lib 中的构建文件本身中使用下面的值。

android {
compileSdkVersion 28


defaultConfig {
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "$libraryVersion"
resValue "string", "Library", libraryGroupId"
}
}

库不能设置 applicationId,如果您在一个多模块项目中工作,并从一个单独的文件中获取 flavors,那么以上所有答案都不起作用。对于一个模块化的应用程序,您需要以下步骤-

在项目根目录中创建 flavors.gradle文件

 ext.flavorConfig = { // 1
    

flavorDimensions "pricing"
productFlavors {
free {
dimension "pricing"
ext.myApplicationIdSuffix = '.free' // 2
}
paid {
dimension "pricing"
ext.myApplicationIdSuffix = '.paid'
}
}
    

productFlavors.all { flavor -> // 3
if (flavor.hasProperty('myApplicationIdSuffix') && isApplicationProject()) {
flavor.applicationIdSuffix = flavor.myApplicationIdSuffix
}
}
    

}
    

def isApplicationProject() { // 4
return project.android.class.simpleName.startsWith('BaseAppModuleExtension')
     

}
  • 在1中,我们导出了一个闭包,这样我们就可以在模块的 build.gradle 文件中使用它。
  • 在2中,我们定义了一个自定义 myApplicationIdAffix 属性。我们不能简单地使用 applicationIdAffix,因为它不可能在库模块中使用(如果使用了 build 将会失败)。
  • 在3中,我们遍历创建的风格,如果我们检测到它只是一个应用程序模块,则设置 applicationIdAffix。
  • 4 is a way to check where this closure is being used.

剩下的就是在我们的模块的 build.gradle文件中使用这个闭包。例如,在应用程序模块中,这看起来是这样的:

apply plugin: 'com.android.application'
apply from: "${rootProject.projectDir}/flavors.gradle"


android {
// other config...


with flavorConfig
}

如果这还不清楚,您可以查看 这篇文章以便更好地理解。