Android Studio中的AndroidManifest.xml与build.gradle有何区别?

15

如果有人能够帮助我理解一些关于Android Studio的问题,那将是最具启发性的。

因此,一个月前,我已经从Eclipse转换到Android Studio,迄今为止只是在我的已迁移应用上工作。因此,我一直在尝试调整只有在Eclipse中惯用的AndroidManifest.xml文件。

然而,最近,我开始创建一个新项目,以了解Android Studio与Eclipse的差异。除了我遇到的非常烦人的appcompat_v7问题外,我还对构建.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 - 我阅读过这必须始终使用最新版本。有人能解释一下为什么吗?

现在针对清单与 Gradle 的问题:

  1. 编译和 buildtools 版本必须相同吗?它们可以不同吗?

  2. 如果我同时拥有 AndroidManifest.xml 和 build.gradle,Android Studio 如何知道要使用哪个版本进行编译、min、targeted、buildtools?

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

  4. 由于两个文件之间存在重复的属性,这是否意味着从 Android Studio 生成的应用程序起,我根本不需要触及 AndroidManifest.xml?

    <activity></activity> 呢?这样的话应用程序不会因为找不到活动而强制关闭。build.gradle 是否会自动处理它?或控制方向和其他细微的功能(我是否只能修改 Android Studio 上的 Java 文件)?

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

抱歉问题比较长,可能有些啰嗦,但它确实对我很困惑。

提前谢谢。

更新:

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

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

    问题:在 Android Studio 中两个都还需要,对吗?

  2. 编译和 buildtools 版本不必相同,但 buildtools 必须始终高于 compileSdkVersion。

    问题:这是因为 Google 为每个新的 SDK 创建新的 buildtools 版本,更高版本向后兼容?因此,较高的 buildtools 将创建较低的 compileSdkVersion,反之则不成立,对吗?


2
Gradle是一个基于Apache Maven和Apache Ant概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,而不是传统的XML。Android Studio是一个由Google开发的集成开发环境(IDE),用于开发Android应用程序。首先参考这两个链接,如果您有疑问,请在评论中发表。 - NovusMobile
感谢提供这两篇文章,我发现http://developer.android.com/tools/building/configuring-gradle.html非常有帮助,并已经在更新部分重新表述了我的问题。 - publicknowledge
1
我可以回答1:是的,您确实需要清单文件和build.gradle两者都有。 您需要在清单文件中声明应用程序的活动、接收器等组件以及权限。 versionName和versionCode放在build.gradle中,您不需要在清单文件中添加它们。如果您将它们放在清单文件中,很可能会被build.gradle中的值覆盖。虽然我没有测试过这一点。 - Lev
另外,我自己也有一个迁移的Eclipse项目和一个新的AndroidStudio项目。它们的build.gradle文件看起来就像你的一样。我不知道为什么它们会如此不同,但它们运行得很好。 - Lev
4个回答

9
我将尽可能回答您的问题,但我首先建议您不要使用从Eclipse迁移生成的build.gradle文件。在Android Studio中创建一个新项目,并将它生成的build.gradle作为模板复制到您的实际项目中并更改有意义的值。花时间理解和正确处理build.gradle文件,在将来可以节省您的时间。同时,请尽量模仿新项目的文件结构。Gradle的好处是它(通常)会给出有意义的错误信息。
compileSdkVersion - 必须始终使用最高版本以获得对新手机最大的兼容性?
targetedSdkVersion - 我个人偏好于我的应用程序的最佳运行条件?
在大多数情况下,编译和目标应该是相同的。编译值明显告诉编译器使用哪个版本进行编译,而目标版本则告诉运行时使用哪些兼容性特性。例如,如果您的目标版本是v21,并且应用程序在运行v23的手机上运行,则会启用一些兼容性特性,以使您的应用程序运行更加流畅。
buildToolsVersion - 我看到必须始终使用最新版本。有人可以解释一下吗?
您可以将构建工具视为编译器。如果您设置了compileSdkVersion 23,则需要构建工具版本23.+。但是,为了回答您的问题,假设版本23.0的构建工具存在错误(例如,它不能正确地构建本机代码),那么Google将发布版本23.1的构建工具。现在,如果您的代码不编译本机代码,则无需更新-您不需要它,但嘿,更新总是好的,以防万一。此外,如果您的compileSdkVersion为23且您使用的是buildTools版本24,则buildTools版本24完全能够构建版本23。
compile和buildtools版本必须相同吗?它们可以不同吗?
希望上面已经回答了这个问题,但答案是是,它们可以不同,但是buildtools主版本必须始终大于compileSdkVersion。
如果我同时有一个AndroidManifest.xml文件和一个build.gradle文件,Android Studio如何知道要使用哪个文件中的compile、min、targeted和buildtools版本?
作为问题1的扩展,如果两个文件之间存在差异(如果某人因某种原因忘记了并决定在其中一个文件中添加内容),会发生什么?
build.gradle将覆盖AndroidManifest.xml文件中的值,但为避免混淆,我建议将上述所有值放入build.gradle中,并从manifest中删除它们。这就是它们所属的地方。build.gradle可以做一些真正酷炫的事情,它可以覆盖manifest中的值,甚至合并两个manifest文件。
由于两者之间存在重复属性,这是否意味着从Android Studio生成的应用程序,我根本不需要触及AndroidManifest.xml文件?
控制方向和其他更细微的功能(我只能修改Android Studio上的java文件吗?)那么构建.gradle是否会自动处理,使得应用程序在无法找到活动时不会强制关闭?(如果没有,则拥有两个控制应用程序的文件有些冗余,也许他们应该坚持使用AndroidManifest.xml文件?)
当然不是。这仅意味着您必须在build.gradle和AndroidManifest.xml中进行一些操作。例如,如果添加了某个activity,则必须像往常一样编辑AndroidManifest.xml文件。如果要更改activity的属性(旋转,主题等),仍然要在AndroidManifest.xml文件中完成。如果要开始使用来自Maven Central的新库,则必须将其添加到build.gradle文件中。如果要更改发布版本的应用程序签名密钥或更改应用程序的versionName:则在build.gradle文件中进行。总的来说,build.gradle文件为您的构建提供了更高级别的控制,我真的建议你查看在这里可以做什么:http://developer.android.com/tools/building/configuring-gradle.html AndroidManifest.xml仍然需要,如果build.gradle具有相同的属性,则它只是覆盖设置。
问题:因此,在Android Studio中两个文件都仍然需要,对吗?
正确。你仍然需要两者。
编译和buildtools版本不必相同,但是buildtools必须始终高于compileSdkVersion。
问题:这是因为Google为每个新的SDK创建一个新的buildtools版本,并且较高版本是向后兼容的?因此,较高版本的buildtools将构建较低的compileSdkVersion,而反之则不成立,对吗?
也正确!

好的信息!我已经在各种项目中进行了更多的调试,可以确认两个文件都是必需的。这个答案给出了最详细的解释,我认为它证实了我迄今为止所测试的所有内容。 - publicknowledge

3

Android清单文件对于在Android应用程序中的Activity、所需权限和声明服务非常有用,而build.gradle则对库的声明等非常有用。


1
Gradle与Menifest的对比如下... Gradle会覆盖manifest中的值,我更喜欢在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" >

0

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

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

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

[minSdkVersion, targetSdkVersion, compileSdkVersion]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接