【问题标题】:Android Studio 1.0 and error "Library projects cannot set applicationId"Android Studio 1.0 和错误“库项目无法设置 applicationId”
【发布时间】:2015-02-07 02:36:06
【问题描述】:

将 Android Studio 更新到 1.0 后,我看到此错误:

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

我按照建议更新了 Gradle 插件,但我不明白如何解决这个问题。

【问题讨论】:

    标签: android android-studio android-gradle-plugin android-library


    【解决方案1】:

    库无法设置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 中,我们定义了一个自定义 myApplicationIdSuffix 属性。我们不能简单地使用 applicationIdSuffix,因为无法在库模块中使用它(如果这样做,构建将失败)。
    • 在 3 中,如果我们检测到它只是一个应用程序模块,我们会迭代创建的风味并设置 applicationIdSuffix。
    • 4 是一种检查在何处使用此闭包的方法。

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

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

    如果不清楚,您可以查看this article 以获得更好的理解。

    【讨论】:

      【解决方案2】:

      您不能为您的库定义 applicationId。 但是,如果您想在构建文件中使用标识符,它将为您提供库包名称,您可以为模块定义一个变量,然后根据需要使用该值。

      eg : 库的 build.gradle

      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"
       }
      }
      

      【讨论】:

        【解决方案3】:

        万一它对某人有帮助:

        当我将一个 eclipse 项目导入到 android studio 时,我得到了一个错误::

        “错误:应用程序和测试应用程序 id 不能相同”

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

        我按照本文中的建议从中删除了 testApplicationId,这帮助我解决了问题。

        注意:此说明与此问题中发布的错误无关,但可能会对遇到类似错误的人有所帮助。

        【讨论】:

          【解决方案4】:

          感谢 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">
          ...
          

          如果您不需要重命名应用的包名称,这是正确的解决方案。要重命名它,您需要使用“flavors”:

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

          【讨论】:

          • 太糟糕了,无法检查两个答案,因为您包含了 Joel 应该有的示例。
          • 如果我删除 applicationID 行,我可以在 Play 商店中发布吗?(我的意思是更新)因为不会有 google play 的应用程序 ID。
          • @gurkanstack 如果删除 Gradle 文件中的这一行,AndroidManifest.xml "package" 中定义的命名空间将用于发布。
          【解决方案5】:

          基于此info

          图书馆项目中的ApplicationId

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

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

          【讨论】:

          • 谢谢,你把我带到了正确的方向。我添加了一个答案来解释我遇到的“风味”问题。
          • @Joel:我将模块转换为库,但找不到要删除的 ApplicationId。 ApplicationId 在 build.gradle 文件中不是 dr。你能告诉我在哪里可以找到 Android Studio 1.0.1
          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
          猜你喜欢
          • 2015-02-07
          • 2016-01-24
          • 2019-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多