一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5

译者地址:【翻】一览新的 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 -> SettingsMac OS XAndroid Studio -> Preferences 下),并且,确保你选择使用的是默认配置的 gradle wrapper.

defaultwrapper
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
syncgradle

然后只需要运行它。在使用更有意义的语法规则后,一切按预期的那样工作。使用新鲜出炉的 Gradle 2.5 构建!

run
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
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
screenshot18

随着在 Android Studio 上令人惊叹的完全支持 NDK,Java 代码现和 Native 代码现在可以配合更加天衣无缝。如果你在 Java 中调试代码,它将会跳转到 native 代码的正确位置。(译者:这点还真是令人惊叹喔!)

linkjni
linkjni

不管怎么说,它仍然处于实验阶段,某些功能仍在开发中。对于严肃的用户来说,最好等到它最终发布吧。

结论

我必须说新的 Gradle Build Tools 是非常有趣的。主要改变的 DSL 看起来非常有前途,并且对于现在的来说具有更深远的意义。优秀的代码应该能告诉我们它能做什么(译者:能从字面意思理解这段代码的意思),对吧?

然后它仍然还处于实验阶段。这个 DSL 还不是最终的版本,我们最好只是学习和了解他的存在,而不是现在立刻就切换到这个新的版本。不管怎么说,我相信距离它发布可供实际使用的稳定版本不会很久了。做好准备吧!

可以在这里了解更多的信息 >>Experimental Plugin User Guide

=)

p11
p11

Author: nuuneoi (Android GDE, CTO & CEO at The Cheese Factory)
A full-stack developer with more than 6 years experience on Android Application Development and more than 12 years in Mobile Application Development industry. Also has skill in Infrastucture, Service Side, Design, UI&UX, Hardware, Optimization, Cooking, Photographing, Blogging, Training, Public Speaking and do love to share things to people in the world!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容