+1

Những thú vị khi bạn sử dụng Jack compiler

cover_jack.jpg

GOOGLE đã release toolchain mới - Jack vào năm trước điều mang mục tiêu thay thế javac + dx . Sự thay đổi này mang lại những cải tiến khác biệt nào ở trong article này mình sẽ điểm qua một số nội dung sau :

  • Completely open source
  • Speeds compilation time
  • Handles shrinking, obfuscation, repackaging and multidex

Để khám phá những nội dung trên cần setup Jack vào IDE Android Studio của bạn. Làm điều này đơn giản như sau: Go to build.gradle thêm code sau :


android {
    ...
    buildToolsVersion ‘21.1.2’
    defaultConfig {
      // Enable the experimental Jack build tools.
       jackOptions {
         enabled true
       }
    }
    ...
}
  • Note:
  • buildToolsVersion ‘21.1.2’ Từ Android SDK 21.1 mới support Jack compiler nếu như IDE của bạn đang có version thấp hơn, bạn cần update lên và tốt hơn là update mới version mới nhất. Bạn thực hiện 1 số bước nhỏ như sau:

How to update new build tool version

Settings (Ctrl+Alt+S) >> Android SDK >> Launch SDK Manager >> Choose Install

build_tool.png

Completely open source

Điều này chúng ta dường như không còn xa lạ gì nữa nó được avaiable trong AOSP (Android Open Source Project), bạn có thể đóng góp và cải tiến nó. Nhân tiện mình share 1 website khá hay về Android, click detail

Speeds compilation time

Nếu nói về sự khác biệt với compiler trước đó thì Jack nổi bật nhất ở sự cải tiến này. Dễ quan sát nhất thì mình mô tả ở hình phía dưới.

Mô hình transforms hiện tại mà Android đang làm .

transforms_current.png

Nếu enable ProGuard quá trình transforms như này .

javac_proguard_dex.png

Jack được cải tiến như sau :

jack.png

Quá trình này nhanh hơn nhiều lần so với javac + dex làm việc đúng không ? Như thế khi build apk file trong quá trình release và test sẽ nhanh hơn nhiều. Đặc biệt với cấu hình laptop chúng ta đang dùng chưa được cao lắm thì sự giảm thiểu thời gian chờ nhức nhối cũng được thay đổi đáng kể đó. Câu hỏi đặt ra làm thế nào Jack lại biên dịch nhanh hơn ? (?) Câu trả lời nằm ở library format của Jack.

jack-library-file.png

Trong cấu trúc trên có tầng Pre-dex : làm cho quá trình biên dịch nhanh hơn.

Handles shrinking, obfuscation, repackaging and multidex

Jack cũng được support shrinking & obfuscation, để thực thi bạn cũng làm tương tự như setup ProGuard. Open file proguard-rules.pro và có thể dùng options dưới đây:

Common options:

@
-include
-basedirectory
-injars
-outjars // only 1 output jar supported
-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds

Shrinking options

-dontshrink

Obfuscation options

-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings

Ignored options:

-dontoptimize // Jack does not optimize
-dontpreverify // Jack does not preverify
-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump

Repackaging

Jack dùng jarjar để repackaging bạn có thể custom như sau :

android {
    compileSdkVersion 24
    buildToolsVersion '24.0.3'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    packagingOptions {
        // removed because of conflict in creating package
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        // unused files, removed to minimize APK file
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'org/apache/http/version.properties'
        exclude 'templates/release-notes.vm'
    }

    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
            proguardFile 'proguard.cfg'
        }
    }
}

// JarJar stuffs start here

configurations {
    // create new configuration for JarJar
    jarjar
}

dependencies {
    // add dependecies to jarjar configuration
    jarjar 'com.googlecode.jarjar:jarjar:1.3'
}

// for all variants
android.applicationVariants.all { variant ->
    // only for release
    if (variant.name != 'release')
        return;

    // only when proguard is enabled
    if (!variant.buildType.runProguard)
        return;

    // create task name
    String jarJarTaskName = "jarJar${variant.name.capitalize()}";

    // prepare variables
    def workingDir = new File('build/intermediates/jarjar');
    // proguard generate one jar file. This jar file is in Dex.inputFiles
    // (see sources com/android/build/gradle/BasePlugin.groovy)
    def inputLibrary = variant.dex.inputFiles[0];
    def outputLibrary = new File(workingDir, 'classes.jar').getCanonicalFile()
    .................

Multidex support

Since dex files are limited to 65K methods, apps with over 65K methods must be split into multiple dex files. (See ‘Building Apps with Over 65K Methods’ for more information about multidex.) Jack offers native and legacy multidex support.

Nội dung nói về chủ đề Jack compiler khép lại ở đây mong rằng những thông tin trên hữu ích với các bạn yêu thích lập trình Android. (seeyou)

----- Happy Code-----


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí