Android Studio AndroidManifest.xml vs build.gradle

2022-09-03 15:03:42

如果有人能帮助我了解一些关于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. 编译SdkVersion - 必须始终使用最高的版本才能与较新的手机实现最大的兼容性?

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

  3. buildToolsVersion - 我读到这个必须总是使用最新版本。有人能解释一下为什么吗?

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

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

  2. 如果我同时拥有 AndroidManifest.xml 和 build.gradle,Android Studio 如何知道要使用哪个版本进行编译、最小、定向、构建工具版本?

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

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

    那么,当应用找不到活动时,它不会强制关闭呢?build.gradle会自动处理这个问题吗?或者控制方向和其他更精细的功能(我是否坚持只修改Android Studio上的java文件?<activity></activity>

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

很抱歉冗长,也许是蜿蜒曲折的问题,但这对我来说真的很困惑。

提前致谢。

更新:

在阅读了 Android Studio 中的 Gradle 是什么?http://developer.android.com/tools/studio/index.html 之后,我的新问题:

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

    :所以在Android Studio中仍然需要两者,对吗?

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

    :这是因为Google为每个新的Sdk创建了一个新的buildtools版本,并且更高版本是向后兼容的吗?因此,更高的构建工具将构建较低的编译SdkVersion,而相反的情况则不然,对吗?


答案 1

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

编译SdkVersion - 必须始终使用最高的版本才能与较新的手机实现最大的兼容性?

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

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

buildToolsVersion - 我读到这个必须总是使用最新版本。有人能解释一下为什么吗?

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

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

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

如果我同时拥有 AndroidManifest.xml 和 build.gradle,Android Studio 如何知道要使用哪个版本进行编译、最小、定向、构建工具版本?

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

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

由于2之间存在重复的属性,这是否意味着从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中仍然需要两者,对吗?

正确。您仍然需要两者。

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

问:这是因为Google为每个新的Sdk创建了一个新的buildtools版本,并且更高版本是向后兼容的吗?因此,更高的构建工具将构建较低的编译SdkVersion,而相反的情况则不然,对吗?

也正确!


答案 2

Android 清单文件对于 Android 应用程序中的活动、所需权限和声明服务很有用,但 build.gradle 对于库声明等很有用。


推荐