Android Studio AndroidManifest.xml vs build.gradle

时间:2015-07-15 05:06:18

标签: java android xml eclipse android-studio

如果有人能帮我理解有关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 - 我读过这必须始终使用最新版本。有人可以解释原因吗?

  4. 现在关于manifest vs gradle的问题:

    1. 编译&amp; buildtools版必须一样吗?他们可以不同吗?

    2. 如果我同时拥有AndroidManifest.xml和build.gradle,Android Studio如何知道哪个版本用于编译,最小,目标,构建工具版本?

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

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

      <activity></activity>怎么样,以便应用无法在找不到活动时强行关闭? build.gradle会自动处理吗?或者控制方向和其他更精细的功能(我是不是只修改了Android Studio上的java文件?)

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

    5. 对不起那些冗长的,可能是缠绕的问题,但这对我来说真的很混乱。

      提前致谢。

      更新

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

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

        问题:Android Studio中仍然需要这样做,对吗?

      2. 编译&amp; buildtools版本DON必须是相同的但是buildtools必须始终高于compileSdkVersion。

        问题:这是因为Google为每个新的Sdk创建了一个新的buildtools版本,而更高版本是向后兼容的吗?因此,较高的buildtools会构建较低的compileSdkVersion而反之则不正确,是吗?

4 个答案:

答案 0 :(得分:8)

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

  

compileSdkVersion - 必须始终使用最高值才能达到最大值   与新手机的兼容性?

     

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

在大多数情况下,

编译和定位应该是相同的。编译值显然告诉编译器要编译哪个版本,目标版本告诉运行时要使用哪些兼容性功能。例如,如果您的目标是v21并且该应用程序在运行v23的手机上运行,​​则会启用一些兼容性功能,以使您的应用运行得更好。

  

buildToolsVersion - 我读过这必须始终使用最新版本   版。有人可以解释原因吗?

您可以将构建工具视为编译器。如果您已设置compileSdkVersion 23,那么您将需要23. +版本的构建工具。但是,为了回答你的问题,让我们说版本23.0的构建工具存在一个错误(例如,它没有正确构建本机代码),然后谷歌将发布23.1版本的构建工具。现在,如果你的代码没有编译本机代码,那么更新并不适用于你 - 你不需要它,但是嘿,总是很好的更新你做的事情。此外,如果你的compileSdkVersion是23并且你有构建工具版本24,那么构建工具的第24版就能够构建版本23.

  

编译&amp; buildtools版必须一样吗?他们可以吗?   不同?

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

  

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

     

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

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

  

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

     

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

     

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

绝对不是。这只意味着你必须在build.gradle中做一些事情,在AndroidManifest.xml中做一些事情。例如,如果添加活动,则必须照常编辑AndroidManifest.xml。如果要更改活动的属性(旋转,主题等),这仍然在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中仍然需要两个,对吗?

正确。你仍然需要两者。

  

编译&amp; buildtools版本DON&T; T必须与BUT构建工具相同   必须始终高于compileSdkVersion。

     

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

也正确!

答案 1 :(得分:3)

Android Manifest文件对于Android应用程序中的Activity,Permissions required和Declaring Services非常有用,但build.gradle对于库声明等很有用。

答案 2 :(得分:1)

Gradle VS Menifest如下...... Gradle覆盖清单值,我更喜欢更新Android工作室中的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'
    }
}

}

依赖{     编译fileTree(包括:['* .jar'],dir:'libs')     testCompile'junit:junit:4.12'     编译'com.android.support:appcompat-v7:23.4.0'     编译'com.android.support:design:23.4.0'     编译'com.google.firebase:firebase-core:9.4.0'     编译'com.google.firebase:firebase-messaging:9.4.0'     编译'com.android.volley:volley:1.0.0'     编译'com.google.code.gson:gson:2.6.1'

} 申请插件:'com.google.gms.google-services'

对于Android Eclipse:

`

的xmlns:机器人= “http://schemas.android.com/apk/res/android”

   package="com.android.app"

   android:versionCode="1"

   android:versionName="1.0" >`

答案 3 :(得分:0)

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

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

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

[minSdkVersion, targetSdkVersion, compileSdkVersion]