如果有人能帮我理解有关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')
}
}
我对阅读中的一些假设是否正确?
compileSdkVersion - 必须始终使用最高版本才能最大程度地兼容新手机?
targetedSdkVersion - 我对自己应用的最佳运行条件的偏好?
buildToolsVersion - 我读过这必须始终使用最新版本。有人可以解释原因吗?
现在关于manifest vs gradle的问题:
编译&amp; buildtools版必须一样吗?他们可以不同吗?
如果我同时拥有AndroidManifest.xml和build.gradle,Android Studio如何知道哪个版本用于编译,最小,目标,构建工具版本?
作为问题1的扩展,当两个文件之间存在差异时会发生什么情况(如果有人因某种原因忘记并决定在其中一个文件中添加内容?)
由于2之间存在重复的属性,这是否意味着从Android Studio生成的应用开始,我根本不需要触摸AndroidManifest.xml?
<activity></activity>
怎么样,以便应用无法在找不到活动时强行关闭? build.gradle会自动处理吗?或者控制方向和其他更精细的功能(我是不是只修改了Android Studio上的java文件?)
(如果它没有,那么有2个文件来控制应用程序是多余的,也许他们应该只是坚持使用AndroidManifest.xml?)
对不起那些冗长的,可能是缠绕的问题,但这对我来说真的很混乱。
提前致谢。
更新
在阅读What is Gradle in Android Studio?和http://developer.android.com/tools/studio/index.html后,我的新问题:
仍需要AndroidManifest.xml,如果build.gradle具有相同的属性,则会覆盖设置。
问题:Android Studio中仍然需要这样做,对吗?
编译&amp; buildtools版本DON必须是相同的但是buildtools必须始终高于compileSdkVersion。
问题:这是因为Google为每个新的Sdk创建了一个新的buildtools版本,而更高版本是向后兼容的吗?因此,较高的buildtools会构建较低的compileSdkVersion而反之则不正确,是吗?
答案 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
具有更大的优先级并覆盖它们