65.9K
CodeProject 正在变化。 阅读更多。
Home

X86 上的 Jack 和 Jill 入门

2015年10月30日

CPOL

4分钟阅读

viewsIcon

9259

Jack (Java Android Compiler Kit,Java Android 编译器工具包) 是 Google* 新推出的工具,它包含一个从 Java 源代码到 Android dex 文件格式的编译器。

英特尔® 开发者专区提供用于跨平台应用开发的工具和操作方法信息、平台和技术信息、代码示例以及同行专业知识,以帮助开发者创新并取得成功。加入我们的社区,了解 Android物联网英特尔® 实感™ 技术Windows,下载工具、访问开发套件、与志同道合的开发者分享想法,并参与黑客马拉松、竞赛、巡展和本地活动。

Jack (Java* Android* 编译器工具包) 是 Google* 新推出的工具,它包含一个从 Java 源代码到 Android dex 文件格式的编译器。 Jack 拥有自己的 .jack 库,并作为单个工具的一部分提供大部分工具链功能:重新打包、缩小、混淆和 multidex。 还有一个工具可以将现有的 .jar 文件转换为 .jack 库格式。 这就是 Jill (Jack 中间库链接器)。

概述

启用该工具后,Jill 会将您引用的任何库转换为新的 Jack 库文件 (.jack)。 这使得它们可以快速与其他 .jack 文件合并。 Jack 和 Android Gradle 插件会收集任何 .jack 库文件以及您的源代码,并将它们编译成一组 dex 文件。 在此过程中,Jack 还会处理任何请求的代码最小化(缩小和/或混淆)。 然后,输出会像往常一样组装成 apk 文件。

Jack and Jill App Build

如何将 Jack 与 Gradle 插件一起使用

通过 SDK 管理器(图 1),可以在 Build Tools 21.1.1 及更高版本中使用 Jack 和 Jill。 Android 1.0.0+ Gradle 插件中也已提供配套的 Gradle 和 Android Studio 支持。
Gradle 插件通过在您的构建配置中添加 useJack (useJack=true) 来启用实验性的 Jack 构建工具。

Jack and Jill App Build

图 1

使用命令行

要显示 Jack 和 Jill 的用法信息,请使用以下命令。 某些功能可能在通过 Android Gradle 插件提供之前就在命令行上可用。

  • Jack 用法(图 2
    • java –jar <SDK>/build-tools/< Build Tools version>/jack.jar –help
  • Jack 用法(图 3
    • java –jar <SDK>/build-tools/< Build Tools version>/jill.jar –help

Jack & Jill command lines

图 2

Jack & Jill command lines

图 3

编译支持

Java 编程语言 1.7。
支持重新打包、缩小、混淆和 multidex 功能。
不支持注解处理。

缩小和混淆支持

可以通过 "--config-proguard" 选项在命令行上指定 Proguard 配置文件。

  • 常用选项
    @
    -include
    -basedirectory
    -injars
    -outjars // only 1 output jar supported
    -libraryjars
    -dontoptimize // required: Jack does not optimize
    -dontpreverify // required: Jack does not preverify
    -dontskipnonpubliclibraryclasses
    -dontskipnonpubliclibraryclassmembers
    -forceprocessing
    -keep
    -keepclassmembers
    -keepclasseswithmembers
    -keepnames
    -keepclassmembernames
    -keepclasseswithmembernames
    -printseeds
  • 缩小选项
    -dontshrink
  • 混淆选项
    -dontobfuscate
    -printmapping
    -applymapping
    -obfuscationdictionary
    -classobfuscationdictionary
    -packageobfuscationdictionary
    -useuniqueclassmembernames
    -dontusemixedcaseclassnames
    -keeppackagenames
    -flattenpackagehierarchy
    -repackageclasses
    -keepattributes
    -adaptclassstrings

重新打包支持

Jack 与 "rule" 规则类型兼容,但不与 "zap""keep" 规则类型兼容。 可以通过 "—config-jarjar" 选项在命令行上指定规则文件。

使用 Gradle

Android Gradle 插件支持正在开发中,并且存在一些限制

  • 尚不支持 "-applymapping" 混淆指令
  • 未集成重新打包(类似于 jarjar 工具)
  • 不支持 Jacoco 插桩
  • 不支持字节码操作
  • 某些用户在构建非常大的应用程序时可能会收到内存不足异常。 您可以通过配置构建系统以使用 2G RAM(或更多)来解决此问题
dexOptions { javaMaxHeapSize "2048M" }

现在让我们进入 useJack 工具。 首先,我们必须在 Eclipse IDE 中导入现有的 Android 应用程序项目,如下所示。

使用 JACK

  1. 单击 File -> 单击 Import…(图 1)

    File import

    图 1
  2. 单击“Existing Android Code Into Workspace”(将现有 Android 代码导入工作区)(图 2)

    Existing file

    图 2
  3. 单击 Browse… 并从 NDK 示例目录中选择 Hello-jni 项目(图 3)

    Browse

    图 3
  4. 最后单击 Finish(完成)(图 4)

    Finish

    图 4

现在我们需要如下编辑 jni 目录中的 Application.mk 文件

APP_ABI := x86

然后我们必须如下为我们的 Android 项目创建文件 build.gradle。

  1. 右键单击该项目。 然后选择 New 并单击 File(图 5)

    New file

    图 5
  2. 在 File Name 字段中输入 build.gradle 并单击 Finish(完成)(图 6)

    build.gradle

    图 6

接下来,我们需要如下编辑 build.gradle 文件

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}
apply plugin: 'com.android.application'

android {
    lintOptions {
		abortOnError false
    }

    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
    	applicationId "com.example.hellojni"
        minSdkVersion 19
		targetSdkVersion 21
		ndk {
            moduleName "hello-jni"
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jni.srcDirs = []
    		jniLibs.srcDirs = ['libs']
        }
		
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
    
    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/com/example/hellojni').absolutePath,
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }

    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/com/example/hellojni').absolutePath,
                'clean'
    }

    clean.dependsOn 'cleanNative'

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }
}

请注意,该文件包含实验性的 Jack 构建工具,即 useJack = true

此外,为了编译示例的本机部分,我们必须在项目的根目录中创建一个 local.properties 文件,并编辑该文件以添加下一行

ndk.dir=<path_to_ndk>

最后,为了构建该项目,我们将使用以下命令

gradle build

在您在目录 <path_to_project>/build/outputs/apk/ 中看到消息“BUILD SUCCESSFUL”之后,我们可以看到 apk 文件。
运行 hello-jni-debug.apk(图 7)。

BUILD SUCCESSFUL

图 7

关于作者

Denis Smirnov 是一名软件实习生,曾在英特尔担任技术实习生。 Denis 正在下诺夫哥罗德国立技术大学应用数学系攻读计算机科学硕士学位。

© . All rights reserved.