Android Studio AndroidManifest.xml vs build.gradle

pub*_*dge 12 java xml eclipse android 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'
}
Run Code Online (Sandbox Code Playgroud)

另一方面,下面是迁移的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')
    }
}
Run Code Online (Sandbox Code Playgroud)

在阅读中我采取的一些假设是否正确?

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

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

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

关于manifest vs gradle,我现在提出问题:

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

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

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

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

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

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

很抱歉,这些问题可能很长,也许很棘手,但这对我来说真的很混乱.

提前致谢.

更新:

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

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

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

  2. compile和buildtools版本不必相同但是buildtools必须始终高于compileSdkVersion.

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

shr*_*der 8

我将尝试尽可能多地解决问题,但我将首先建议您不要使用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并且你有构建工具版本24,那么构建工具的版本24很能够构建版本23.

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

希望以上对此有所回答,但答案是肯定的,它们可能不同,但构建工具主要版本必须始终大于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文件?)

(如果没有,那么有2个文件来控制应用程序是多余的,也许他们应该只是坚持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中仍然需要两个,对吗?

正确.你仍然需要两者.

compile和buildtools版本不必相同但是buildtools必须始终高于compileSdkVersion.

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

也正确!