編輯:關於Android編程
當傳統的手工打包方式遇上同一應用,多渠道/多包名及多種引導頁/icon等等差異時,就變成了苦不堪言的純體力活了。 但有了Gradle這一切不再是問題了,Gradle使得這一切變的so easy。
本遍主要介紹eclipse中使用Gradle打包解決多渠道問題,其它的問題基本差不多。在eclipse中使用Gradle只需要以下三板斧:
1.1 選中相應的項目,鼠標右鍵Export-GenerateGradle build files,然後一路next下去。
1.2 一路next下去後,finish後,即可生成以下目錄及文件
在生成的文件中,有兩個需要後續配置修改gradle-wrapper.properties及build.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 FilesAndroidgradle-2.1
Path指到bin目錄中,這裡為D:Program FilesAndroidgradle-2.1in
另外還需要配置ANDROID_HOME環境,在eclipse-preferences-Android中,找到SDK LOCATION
在環境配置中添加ANDROID_HOME的變量名,並指向與eclipse中的SDK LOCATION的路徑一樣即可.
配置好了,cmd檢查下grade是否配置成了,輸入gradle -w命令檢查下。
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
buildToolsVersion21.1.2
defaultConfig {
applicationIdcom.test.drawdemo
minSdkVersion10
targetSdkVersion 12
versionCode200
versionNamev2.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
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簡單的介紹下。
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庫,直接復制下,不用改,拿好,不謝。
知識點目錄 10.1 布局優化 10.1.1 Android UI渲染機制 10.1.2 避免Overdraw 10.1.3 優化布局層級 10.1.4 避免嵌套過多無用
先給大家展示下效果圖:package com.lixu.circlemenu; import android.app.Activity; import android.o
StepView(步驟流程的view)效果圖如下:該控件可以支持這種步驟的操作view展示,像快遞app的流程。1.首先有在xml布局: 2 .一個自定義的Hori
Understanding AsyncTaskAsyncTask是Android 1.5 Cubake加入的用於實現異步操作的一個類,在此之前只能用Java SE庫中的T