標籤:gradle打包 proguard混淆 多渠道apk 多包名apk eclipse gradle打包
當傳統的手工打包方式遇上同一應用,多渠道/多包名及多種引導頁/icon等等差異時,就變成了苦不堪言的純體力活了。 但有了Gradle這一切不再是問題了,Gradle使得這一切變的so easy。
本遍主要介紹eclipse中使用Gradle打包解決多渠道問題,其它的問題基本差不多。在eclipse中使用Gradle只需要以下三板斧:
第一斧、產生Gradle相應檔案
1.1 選中相應的項目,滑鼠右鍵Export-GenerateGradle build files,然後一路next下去。
1.2 一路next下去後,finish後,即可產生以下目錄及檔案
在產生的檔案中,有兩個需要後續配置修改gradle-wrapper.properties及build.gradle檔案,其它檔案可以不動即可。
第二斧、下載gradle及配置相應的環境變數
2.1 雙擊開啟gradle-wrapper.properties,複製出http://services.gradle.org/distributions的地址,訪問此網站
2.2 下載相應的gradle版本,個人下載了2.1版本,找到且下載gradle-2.1-all.zip,修改上面的distributionUrl為
distributionUrl=http\://services.gradle.org/distributions/gradle-2.1-all.zip
2.3 配置gradle環境變化,將剛下載的zip包解壓出gradle-2.1,分別配置GRADLE_HOME及在Path後追加路徑
GRADLE_HOME配,指到gradle-2.1目錄即可,這裡為D:\Program Files\Android\gradle-2.1
Path指到bin目錄中,這裡為D:\Program Files\Android\gradle-2.1\bin
另外還需要配置ANDROID_HOME環境,在eclipse-preferences-Android中,找到SDK LOCATION
在環境配置中添加ANDROID_HOME的變數名,並指向與eclipse中的SDK LOCATION的路徑一樣即可.
配置好了,cmd檢查下grade是否配置成了,輸入gradle -w命令檢查下。
第三斧、Gradle配置及打包命令產生
3.1 Gradle打包過程是比較慢,且比較耗記憶體特別是多版本多N渠道一起打包時也許可能出現OOM。可以通過在gradle-wrapper.properties檔案中,添加org.gradle.jvmargs=-Xmx2048m-XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError
3.2 修改build.gradle------比較關鍵的設定檔,對多渠道/多包名及各種差異下的配置都在build.gradle檔案下配置。
這裡先上下個人demo項目中的配置,最後再對關鍵的地方進行解釋。
----------------------------------------build.gradle檔案開始-----------------------------------------
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath‘com.android.tools.build:gradle:0.14.+‘
}
tasks.withType(JavaCompile){ options.encoding = "UTF-8" }
}
apply plugin: ‘android‘
dependencies {
compile fileTree(dir:‘libs‘, include: ‘*.jar‘)
}
android {
compileSdkVersion 21
buildToolsVersion"21.1.2"
defaultConfig {
applicationId"com.test.drawdemo"
minSdkVersion10
targetSdkVersion 12
versionCode200
versionName"v2.0.5"
testApplicationId "com.test.drawdemo"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
// 預設是offical的渠道,即官方的版本
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "offical"]
}
//app 簽名檔案
signingConfigs {
release {
storeFile file("demo.keystore")
storePassword "123456"
keyAlias "demo.keystore"
keyPassword "123456"
}
}
buildTypes {
release {
signingConfigsigningConfigs.release
// 不顯示Log
buildConfigField "boolean", "LOG_DEBUG","false"
minifyEnabled true
proguardFiles ‘proguard-project.txt‘
}
}
// 移除lint檢查的error
lintOptions {
abortOnError false
ignoreWarnings true
}
// 友盟多渠道打包
productFlavors {
offical {}
appchina {}
anzhi {}
mumayi {}
lenovo {}
qq {}
huawei {}
xiaomi {}
baidu {}
meizu {}
taobao {}
huijia360 {}
hiapk {}
}
productFlavors.all { flavor->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
//------------載入 so庫開始------------
task copyNativeLibs(type:Copy) {
from(new File(‘libs‘)){ include ‘**/*.so‘ }
into newFile(buildDir, ‘native-libs‘)
}
tasks.withType(JavaCompile) {compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn‘cleanCopyNativeLibs‘
tasks.withType(com.android.build.gradle.tasks.PackageApplication){
pkgTask -> pkgTask.jniFolders =new HashSet<File>()
pkgTask.jniFolders.add(newFile(buildDir,‘native-libs‘))
}
//---------------載入 so庫結束---------
sourceSets {
main {
manifest.srcFile ‘AndroidManifest.xml‘
java.srcDirs = [‘src‘]
resources.srcDirs = [‘src‘]
aidl.srcDirs = [‘src‘]
renderscript.srcDirs = [‘src‘]
res.srcDirs = [‘res‘]
assets.srcDirs = [‘assets‘]
}
}
}
----------------------------------------build.gradle檔案結束-----------------------------------------
3.3 執行gradlewclean。開啟cmd,cd到項目目錄中,先輸入gradlew clean。 這裡的gradlew 是對gradle命令的封裝,gradlew clean後可以使gradle會自成同步下載Gradle相應的依賴,並可以把上次打包的清掉重新打,會刪除掉build目錄及build目錄下所有檔案。
3.4 執行gradlew build命令,即可完成整個打包過程了。
接下來可以看到項目下產生了build目錄,在這裡的build-->outputs-->apk裡就產生了各渠道的包了.
可以看到產生了一堆的包,有release及debug版本,簽名版的及未簽名。若不想要debugt版本的apk,可以在打包時輸入 gradlew aR命令即可。aR是assembleRelease的簡寫。當然也可以只產生debug版本的(gradlew assembleDebug)
大功造成,怎麼樣是不是很easy啊,呵呵了。。。下面對build.gradle簡單的介紹下。
補充說明--關於build.gradle配置
1. buildscript元素
除了dependencies-classpath中的gradle版本需要改下,基本上不需要修改。
1.1 dependencies {
classpath‘com.android.tools.build:gradle:0.12.+‘
}
gradle:0.12.+修改成gradle:0.14.+,對應的gradle 2.1 採用新的gradle版本,比較關鍵。
1.2 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } ,這裡老版本gradle是Compile,需要修改成JavaCompile
2、applyplugin: ‘android‘
-----不做修改
3、dependencies元素
dependencies{
compilefileTree(dir: ‘libs‘, include: ‘*.jar‘)
} 指定項目中相應的jar包依賴,注意 :
3.1 這裡配置指令了,會和proguard混淆配置中-libraryjars libs/xxxx.jar衝突重新設定了依賴jar包。可以將proguard混淆檔案中的-libraryjars 配置注釋掉 加#-libraryjars ...
3.2 dependencies只指令了jar包依賴了,並沒有指令so庫依賴,so庫的依賴得單獨配置...,後面有介紹。。但有個變態的方法就是可以把所的so庫檔案,全部用zip壓縮到一個檔案中比如so.zip,再把so.zip改名成so.jar這樣就不需要指令so庫了,比較變態吧。呵呵....
4. android元素
這裡是重重之重,配置比較繁瑣,
4.1 defaultConfig元素
applicationId 指令包名,老版本是packageName指令
其它可配置版本資訊
4.2 signingConfigs 元素
可以配置簽名檔案資訊,檔案位置別名命令等
4.3 buildTypes 元素
產生的apk有兩種type類型,debug與release版本,可以分別對其配置,配置使用哪個簽名配置(signingConfigs)、是否混淆等等
minifyEnabled 是新版本的元素,老版本runProguard已經廢棄了。
proguardFiles ‘proguard-project.txt‘ 指令使用與build.gradle同一目錄中的proguard-project.txt混淆檔案.
4.4 lintOptions元素
配置下,忽略lint相應的警告...
4.5 Flavors機制,,
主要是靠,這個機制進行 多渠道,多包名的打包....,
剩下的載入 so庫,直接複製下,不用改,拿好,不謝。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android打包利器Gradle之三板斧