簡體   English   中英

Android Studio AndroidManifest.xml 與 build.gradle

[英]Android Studio AndroidManifest.xml vs build.gradle

如果有人可以幫助我了解有關 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 - 我讀到這必須始終使用最新版本。 有人可以解釋為什么嗎?

現在我關於 manifest 與 gradle 的問題:

  1. 編譯和構建工具版本必須相同嗎? 它們可以不同嗎?

  2. 如果我同時擁有 AndroidManifest.xml 和 build.gradle,Android Studio 怎么知道要用於 compile,min,targeted,buildtools 版本?

  3. 作為問題 1 的擴展,當 2 個文件之間存在差異時會發生什么(如果有人出於某種原因忘記並決定在其中一個文件中添加內容?)

  4. 由於兩者之間存在重復屬性,這是否意味着從 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 而相反的情況並非如此,對嗎?

我將嘗試解決盡可能多的問題,但我將首先建議您不要使用 Eclipse 遷移中生成的 build.gradle。 在 Android Studio 中創建一個新項目並使用它生成的 build.gradle 作為您應該使用的模板,即將其內容復制到您的真實項目並更改有意義的值。 花時間理解並正確使用 build.gradle,它會在未來節省您的時間。 還要盡可能模仿新項目的文件結構。 gradle 的偉大之處在於它(通常)給你有意義的錯誤。

compileSdkVersion - 必須始終使用最高版本才能最大程度地兼容較新的手機嗎?

targetedSdkVersion - 我自己對應用程序最佳運行條件的偏好?

在大多數情況下,compile 和target 應該是相同的。 compile 值顯然告訴編譯器要針對哪個版本進行編譯,而目標版本則告訴運行時要使用哪些兼容性功能。 例如,如果您的目標是 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 的擴展,當 2 個文件之間存在差異時會發生什么(如果有人出於某種原因忘記並決定在其中一個文件中添加內容?)

build.gradle 將覆蓋 AndroidManifest.xml 文件中的值,但為了避免混淆,我會將上述所有值放入 build.gradle,並將它們從清單中刪除。 那是他們所屬的地方。 build.gradle 可以做一些非常酷的事情,它可以覆蓋清單中的值,甚至可以合並兩個清單文件。

由於兩者之間存在重復屬性,這是否意味着從 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 而相反的情況並非如此,對嗎?

也沒錯!

Android 清單文件對 Android 應用程序中的活動、所需權限和聲明服務很有用,但 build.gradle 對庫聲明等很有用。

Gradle VS Menifest 如下... Gradle 覆蓋清單值,我更喜歡更新 Android studio 中的 build.gradle 文件和 android eclipse 中的 menifest 文件。 Gradle 支持可通過 Android Studio 框架控制的應用程序。 版本代碼、版本名稱、目標 SDK 和許多其他庫參考。 在Android Studio中一鍵更改或更新,之后我們就可以構建項目並生成新的apk。

對於安卓工作室:

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" >

AndroidManifest.xml是 Android 生態系統的一部分,描述了 AndroidOS 將使用的組件、權限和一些元數據

build.gradle是開發工具包的一部分,它允許您構建二進制文件

當兩者都定義相同的屬性時(例如uses-sdk )- build.gradle具有更大的優先級並覆蓋它們

[minSdkVersion, targetSdkVersion, compileSdkVersion]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM