Những thú vị khi bạn sử dụng Jack compiler
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, ...
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
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 .
Nếu enable ProGuard quá trình transforms như này .
Jack được cải tiến như sau :
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.
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.