【问题标题】:Android Studio AndroidManifest.xml vs build.gradleAndroid Studio AndroidManifest.xml 与 build.gradle
【发布时间】:2015-10-03 23:48:28
【问题描述】:

如果有人可以帮助我了解有关 Android Studio 的一些事情,那将是最有启发性的。

所以,大约一个月前,我从 Eclipse 切换到了 Android Studio,到目前为止,我只在处理我迁移的应用程序。因此,我一直在修改 Eclipse 中惯用的 AndroidManifest.xml 文件。

但是,最近,我开始创建一个新项目,以便从头开始学习 Android Studio 与 Eclipse 的区别。除了我遇到的非常恼人的 appcompat_v7 问题之外,我还对一些关于 build.gradle 的事情感到困惑。

以下是从 Android Studio 创建的应用的 gradle 代码块:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        applicationId "com.myapp"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.android.support:mediarouter-v7:22.2.0'
}

另一方面,下面是来自迁移的 Eclipse 项目的 build.gradle 的代码块:

apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':google-play-services_lib')
}

android {
    compileSdkVersion 21
    buildToolsVersion '22.0.1'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

我在阅读中做出的一些假设是否正确?

  1. compileSdkVersion - 必须始终使用最高版本才能最大程度地兼容新手机?

  2. targetedSdkVersion - 我自己对应用程序最佳运行条件的偏好?

  3. buildToolsVersion - 我读到这个必须始终使用最新版本。有人能解释一下原因吗?

现在我的问题是关于 manifest vs gradle:

  1. 编译和构建工具的版本必须相同吗?它们可以不同吗?

  2. 如果我同时拥有 AndroidManifest.xml 和 build.gradle,Android Studio 怎么知道 compile、min、targeted、buildtools 版本使用哪个?

  3. 作为问题 1 的扩展,当两个文件之间存在差异时会发生什么(如果有人出于某种原因忘记并决定在其中一个文件中添加内容?)

  4. 由于两者之间有重复的属性,这是否意味着从Android Studio生成的应用程序开始,我根本不需要触摸AndroidManifest.xml?

    &lt;activity&gt;&lt;/activity&gt; 怎么样,这样应用程序在找不到活动时不会强制关闭? build.gradle 会自动处理吗?或者控制方向和其他更精细的功能(我是否坚持只修改 Android Studio 上的 java 文件?)

    (如果没有,那么有 2 个文件来控制应用程序有点多余,也许他们应该坚持使用 AndroidManifest.xml?)

对不起,很长,也许是曲折的问题,但这真的让我很困惑。

提前致谢。

更新:

看完What is Gradle in Android Studio?http://developer.android.com/tools/studio/index.html,我的新问题:

  1. AndroidManifest.xml 仍然需要,如果 build.gradle 具有相同的属性,它只会覆盖设置。

    问题:所以在 Android Studio 中仍然需要 BOTH,对吗?

  2. compile & buildtools 版本不必相同,但 buildtools 必须始终高于 compileSdkVersion。

    问题:这是因为 Google 会为每个新的 Sdk 创建一个新的 buildtools 版本,并且更高版本是向后兼容的吗?因此,更高的 buildtools 会构建更低的 compileSdkVersion,而反过来则不然,对吗?

【问题讨论】:

  • gradle : stackoverflow.com/questions/16754643/… studio : developer.android.com/tools/studio/index.html 首先参考这两个然后如果你有疑问发表你的评论
  • 感谢您的 2 篇文章,我发现 developer.android.com/tools/building/configuring-gradle.html 最有帮助,并在更新部分重新表述了我的问题。
  • 我可以回答 1:是的,您确实需要 Manifest 和 build.gradle。您需要在清单中声明应用程序的活动、接收器等组件以及权限。 versionName 和 versionCode 进入 build.gradle,清单中不需要它们。如果将它们放在清单中,它很可能会被 build.gradle 中的值覆盖。不过我还没有测试过。
  • 补充一下,我自己也有一个迁移的Eclipse项目和一个新的AndroidStudio项目。他们的 build.gradle 文件看起来和你的一样。我不知道为什么它们如此不同,但它们工作得很好。

标签: java android xml eclipse android-studio


【解决方案1】:

AndroidManifest.xml 是 Android 生态系统的一部分,描述了 AndroidOS 将使用的组件、权限和一些元数据

build.gradle 是开发工具包的一部分,可让您构建二进制文件

当两者都定义相同的属性时(例如uses-sdk) - build.gradle 具有更高的优先级并覆盖它们

[minSdkVersion, targetSdkVersion, compileSdkVersion]

【讨论】:

    【解决方案2】:

    Gradle VS Menifest 如下... Gradle 会覆盖清单值,我更喜欢更新 Android Studio 中的 build.gradle 文件和 android eclipse 中的 menifest 文件。 Gradle 支持可以通过 Android Studio 框架控制的应用程序。版本代码、版本名称、目标 SDK 和许多其他库参考。在 Android Studio 中一键更改或更新,然后我们可以构建项目并生成新的 apk。

    对于 Android Studio:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.3"
    
        defaultConfig {
            applicationId "com.android.demo"
            minSdkVersion 18
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
        compile 'com.android.support:design:23.4.0'
        compile 'com.google.firebase:firebase-core:9.4.0'
        compile 'com.google.firebase:firebase-messaging:9.4.0'
        compile 'com.android.volley:volley:1.0.0'
        compile 'com.google.code.gson:gson:2.6.1'
    
    }
    apply plugin: 'com.google.gms.google-services'
    

    对于 Android Eclipse:

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app"
    
    android:versionCode="1"
    
    android:versionName="1.0" >
    

    【讨论】:

      【解决方案3】:

      Android Manifest 文件可用于 Android 应用程序中的 Activity、所需权限和声明服务,但 build.gradle 可用于库声明等。

      【讨论】:

        【解决方案4】:

        我将尝试解决尽可能多的问题,但我会首先建议您不要使用 eclipse 迁移中生成的 build.gradle。在 Android Studio 中创建一个新项目并使用它生成的 build.gradle 作为您应该使用的模板,即将其内容复制到您的真实项目并更改有意义的值。花时间理解并正确构建 build.gradle,它将为您节省未来的时间。还要尽可能地模仿新项目的文件结构。 gradle 的伟大之处在于它(通常)会给你带来有意义的错误。

        compileSdkVersion - 必须始终使用最高的 兼容新手机?

        targetedSdkVersion - 我自己对最佳运行条件的偏好 我的应用程序?

        在大多数情况下,编译和目标应该是相同的。 compile 值显然告诉编译器要针对哪个版本进行编译,而目标版本告诉运行时要使用哪些兼容性功能。例如,如果您的目标是 v21,并且应用在运行 v23 的手机上运行,​​它将启用一些兼容性功能,使您的应用运行得更好。

        buildToolsVersion - 我读到这个必须总是使用最新的 版本。谁能解释一下原因?

        您可以将其视为编译器的构建工具。如果您设置了 compileSdkVersion 23,那么您将需要 23.+ 版本的构建工具。但是,为了回答您的问题,假设 23.0 版的构建工具存在错误(例如,它没有正确构建本机代码),那么 Google 将发布 23.1 版的构建工具。现在,如果您的代码不编译本机代码,那么更新并不真正适用于您 - 您不需要它,但是,如果您这样做,更新总是好的。此外,如果您的 compileSdkVersion 是 23 并且您拥有 24 版的构建工具,那么 24 版的构建工具完全能够构建 23 版。

        编译和构建工具版本必须相同吗?他们可以吗 不一样?

        希望上面已经回答了这个问题,但答案是肯定的,它们可以不同,但​​构建工具的主要版本必须始终大于 compileSdkVersion。

        如果我有一个 AndroidManifest.xml 和一个 build.gradle,如何 Android Studio 知道使用哪个 compile,min,targeted,buildtools 版本?

        作为问题 1 的扩展,当存在 两个文件之间的差异(如果有人出于某种原因忘记了 决定在其中一个中添加东西?)

        build.gradle 将覆盖 AndroidManifest.xml 文件中的值,但为避免混淆,我会将上述所有值放入 build.gradle 中,并将它们从清单中删除。那是他们所属的地方。 build.gradle 可以做一些非常酷的事情,它可以覆盖清单中的值,甚至可以合并两个清单文件。

        由于两者之间有重复的属性,这是否意味着 从 Android Studio 生成的应用程序开始,我不需要 完全触摸 AndroidManifest.xml?

        那么应用程序不会强制关闭怎么办 什么时候找不到活动? build.gradle 是否会解决这个问题 自动地?或控制方向和其他更精细的功能(我 我坚持只修改 Android Studio 上的 java 文件?)

        (如果没有,那么有 2 个文件来控制应用程序有点 多余的,也许他们应该坚持 AndroidManifest.xml?)

        绝对不是。这只是意味着您必须在 build.gradle 和 AndroidManifest.xml 中做一些事情。例如,如果您添加一个活动,您必须像往常一样编辑 AndroidManifest.xml。如果您想更改活动的属性(旋转、主题等),这仍然在 AndroidManifest.xml 中完成。如果您想开始使用 Maven Central 中的新库,则必须将其添加到 build.gradle。如果您想在发布版本时更改用于签署应用程序的密钥,或更改应用程序的版本名称:build.gradle。基本上 build.gradle 可以让你对构建有更高程度的控制,我真的建议你看看你可以在这里做什么: http://developer.android.com/tools/building/configuring-gradle.html

        AndroidManifest.xml 仍然需要,build.gradle 只是覆盖 设置是否具有相同的属性。

        问题:Android Studio 中仍然需要 BOTH,对吗?

        正确。你仍然需要两者。

        编译和构建工具版本不必相同,但构建工具 必须始终高于 compileSdkVersion。

        问题:这是因为 Google 创建了一个新的 buildtools 版本 每个新的 SDK 和更高版本都向后兼容? 因此,较高的构建工具将构建较低的 compileSdkVersion,而 反过来不正确,对吗?

        也正确!

        【讨论】:

        • 好消息!从那以后,我对各种项目进行了更多修改,并且可以确认两个文件都需要。这个答案给出了最多的解释,我认为它证实了我迄今为止测试过的所有内容。
        猜你喜欢
        • 2013-11-28
        • 2017-08-19
        • 2016-01-01
        • 1970-01-01
        • 2016-12-28
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多