Android Gradle 構建工具(Android Gradle Build Tools)是什么?


轉載地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/

譯者地址:【翻】一覽新的 Android Gradle 構建工具:新的 DSL 結構 和 Gradle 2.5

原文:First Look at New Android Gradle Build Tools: The new DSL structure and Gradle 2.5

雙語對照地址: 【翻-雙語】一覽新的 Android Gradle 構建工具:新的 DSL 結構 和 Gradle 2.5

Android Studio 1.3 的平台已經接近於穩定的發布版,新的功能不斷推出,包括對NDK 的完美支持。它看起來有一些重大的改變也正在等待合適的孵化時機,如:新的 Gradle 構建工具以及新設計的 DSL (gradle 腳本代碼結構)

在我把玩了一個小時之后,我發現它是非常有趣的,所以,我決定去寫下這篇博客來向你們這些家伙介紹這個構建工具即將帶來的改變,好讓你們做好准備。

Android Gradle 構建工具(Android Gradle Build Tools)是什么?

萬一你還不知道它呢!Android Gradle 構建工具是一個運行時用於處理 module 下的 build.gradle 文件的,在這個文件傳遞到 Gradle 去做進一步操作之前進行的。

Gradle Build Tools 在項目中的 build.gradle 聲明就像下面這樣:

dependencies {
    classpath 'com.android.tools.build:gradle:1.2.3'
}

每個版本的 Gradle Build Tools 可以與下面列出的受支持的 Gradle 版本協同工作。

Android Gradle Plugin Gradle
1.0.0 - 1.1.3 2.2.1 - 2.3
1.2+ 2.2.1+

在 Android Gradle Build Tools 中定義了語法規則,和我們使用的語法規則在 build.gradle 文件中來寫 Gradle 腳本(And the syntax we use these days to write Gradle Script in build.gradle file is defined in Android Gradle Build Tools.). 我們稱它為 DSL(Domain-Specific Language).

新的 Android Gradle 構建工具

從 Gradle Build Tools 1.0 問世以來, DSL 還沒有被動過, Android Studio 團隊決定對新的 Gradle Build Tools 做出重大的改變。它仍然在試驗階段,通過改變其基礎的 Gradle 的新組件模型機制使其顯著的減少在配置上花費的時間。然而開發團隊正在努力嘗試去移除這些通用的變化,以盡量減少從傳統的插件在未來的遷移過程。(However development teams are working hard trying to remove these current changes to minimize the migration process from the traditional plugin in the future.)

不管怎么樣,坦白的說,新的 DSL 看起來相當不錯。我必須說我對這些改變非常信服,因為這個新的 DSL 結構以及命名比現在的這個更加有意義。

嘗試新的 Gradle Build Tools 只需要簡單的在項目的 build.gradle 文件中更改 build tools 的版本:

dependencies {
    classpath 'com.android.tools.build:gradle-experimental:0.1.0'
}

請注意, 新版本的 build tools 要與剛剛發布的 Gradle 2.5 一起使用才行,所以你需要首先安裝 Gradle2.5,在你的項目的 gradle/gradle-wrapper.properties 文件下修改 distributionUrl 這一行:

distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-bin.zip

進入設置頁面( Windows 系統在 File -> Settings 或 Mac OS X 在 Android Studio -> Preferences 下),並且,確保你選擇使用的是默認配置的 gradle wrapper.

defaultwrapper

然后修改 module 的 build.gradle 文件從這樣:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0 rc3"

    defaultConfig {
        applicationId "com.inthecheesefactory.hellojni25"
        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:appcompat-v7:22.2.0'
}

改成這樣:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 22
        buildToolsVersion = "23.0.0 rc3"

        defaultConfig.with {
            applicationId = "com.inthecheesefactory.hellojni25"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 22
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

你可以注意到結構有很大的不同。com.android.application 現在改為 com.android.model.application. 大多數屬性要求有 = 操作符,以及 += 操作符被用於添加元素(也許是多個)到集合中。以前一些屬性的名字定義的不是非常的清晰的,現在也有所調整,舉個例子:minSdkVersion 現在變成了minSdkVersion.apiLevel

好了,讓我們用 gradle 文件同步項目去應用這些改變。

syncgradle

然后只需要運行它。在使用更有意義的語法規則后,一切按預期的那樣工作。使用新鮮出爐的 Gradle 2.5 構建!

run

試試 NDK 的支持

Android Studio 1.3 嘚瑟的宣布了完全支持 NDK。所以,讓我們用一個非常簡單的 native 代碼例子來做嘗試。首先,你需要在項目的 local.properties 文件里定義一個 NDK 的目錄。請注意你可以在 Android NDK Downloads Page 中顯示的 NDK r10e 和在 SDK Manager 中顯示的 NDK Bundle 都是可以使用的。

ndk.dir=PATH_TO_NDK_ROOT

創建 HelloJni.java 放在你的 Java 包下。

public class HelloJni { public native String stringFromJNI(); } 

在 src/main 目錄里面創建一個 jni 文件夾,並且創建一個 hello-jni.c 文件里面寫如下的內容:

hello-jni.c

#include <string.h> #include <jni.h> jstring Java_com_inthecheesefactory_hellojni25_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { #if defined(__arm__) #if defined(__ARM_ARCH_7A__) #if defined(__ARM_NEON__) #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a/NEON (hard-float)" #else #define ABI "armeabi-v7a/NEON" #endif #else #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a (hard-float)" #else #define ABI "armeabi-v7a" #endif #endif #else #define ABI "armeabi" #endif #elif defined(__i386__) #define ABI "x86" #elif defined(__x86_64__) #define ABI "x86_64" #elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ #define ABI "mips64" #elif defined(__mips__) #define ABI "mips" #elif defined(__aarch64__) #define ABI "arm64-v8a" #else #define ABI "unknown" #endif return (*env)->NewStringUTF(env, "Hello from JNI !! Compiled with ABI " ABI "."); } 

請不要忘記將 com_inthecheesefactory_hellojni25 改變成對應的 HelloJni.java 的包名,否則它是不工作的。

對於那些熟悉 NDK 的人,你可能注意到了 Makefiles 已經不再需要了。

這是最終的文件目錄:

files

現在,讓我們在 MainActivity.java 中測試這段 JNI 代碼,把下面這段代碼放到 MainActivity 類的最后一行:

public class MainActivity extends AppCompatActivity { ... static { System.loadLibrary("hello-jni"); } } 

修改 onCreate 就像這樣:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this, new HelloJni().stringFromJNI(), Toast.LENGTH_LONG) .show(); } 

duang~完成!現在,你可以通過 Java 代碼來使用 native 代碼了,運行試試吧

screenshot18

隨着在 Android Studio 上令人驚嘆的完全支持 NDK,Java 代碼現和 Native 代碼現在可以配合更加天衣無縫。如果你在 Java 中調試代碼,它將會跳轉到 native 代碼的正確位置。(譯者:這點還真是令人驚嘆喔!)

linkjni

不管怎么說,它仍然處於實驗階段,某些功能仍在開發中。對於嚴肅的用戶來說,最好等到它最終發布吧。

結論

我必須說新的 Gradle Build Tools 是非常有趣的。主要改變的 DSL 看起來非常有前途,並且對於現在的來說具有更深遠的意義。優秀的代碼應該能告訴我們它能做什么(譯者:能從字面意思理解這段代碼的意思),對吧?

然后它仍然還處於實驗階段。這個 DSL 還不是最終的版本,我們最好只是學習和了解他的存在,而不是現在立刻就切換到這個新的版本。不管怎么說,我相信距離它發布可供實際使用的穩定版本不會很久了。做好准備吧!

 

引用原文:http://blog.csdn.net/lijinhua7602/article/details/48596955

 

寫博客是為了記住自己容易忘記的東西,另外也是對自己工作的總結,文章可以轉載,無需版權。希望盡自己的努力,做到更好,大家一起努力進步!

如果有什么問題,歡迎大家一起探討,代碼如有問題,歡迎各位大神指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM