== 参考 == gradle中英文 http://gradle.org/ http://doc.gradle.cn/wiki/gradle-main?hl=main [[BR]] 项目转换为gradle http://tools.android.com/tech-docs/new-build-system/intellij_to_gradle [[BR]] gradle android 详细说明 http://tools.android.com/tech-docs/new-build-system/user-guide [[BR]] 多渠道打包 http://www.cnblogs.com/youxilua/archive/2013/05/20/3087935.html [[BR]] == 常用配置 == apply plugin: 'java': 指定项目为java项目[[BR]] apply plugin: 'android' 指定为android项目 apply plugin: 'android-library':增加android库项目[[BR]] == 常用命令 == gradle -q quite模式,出错才输出[[BR]] gradle tasks --all 列出所有任务[[BR]] gradle projects 列出当前目录下所以项目[[BR]] gradle :app:tasks 例如 gradle test:assemble 运行test项目assemble任务,相关前置任务会检查一次 == 例子 == 以聚超值为例子,因为要多个项目构成,需要settings.gradle 这个文件 ,[http://www.cnblogs.com/CloudTeng/p/3418425.html 参考][[BR]] settings.gradle {{{ include ':pcgCommon', ':Juchaozhi' }}} local.properties ,用于配置sdk.dir {{{ sdk.dir=/Volumes/DATA/tools/android-sdk-macosx }}} root项目下有两个项目 pcgCommon和Juchaozhi [[BR]] root 项目build.gradle {{{ buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.12.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } }}} pcgCommon build.gradle {{{ buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.12.+' } } apply plugin: 'android-library' android { compileSdkVersion 17 buildToolsVersion = 20 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } instrumentTest.setRoot('tests') debug.setRoot('build-types/debug') release.setRoot('build-types/release') } lintOptions { abortOnError false } } dependencies { compile fileTree(dir: 'libs', include: '*.jar') } }}} juchaozhi 项目build.gradle {{{ apply plugin: 'android' android { compileSdkVersion 17 buildToolsVersion = 20 useOldManifestMerger true sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } instrumentTest.setRoot('tests') debug.setRoot('build-types/debug') release.setRoot('build-types/release') lintOptions { abortOnError false } } signingConfigs { myConfig{ storeFile file("${rootDir}/keystore/xxxxx.keystore") storePassword "xxxxx" keyAlias "pcgroup" keyPassword "xxxxx" } } buildTypes{ release { signingConfig signingConfigs.myConfig // runProguard true // proguardFiles getDefaultProguardFile('proguard-android.txt') } } def markets = (new File("${rootDir}/keystore/market.config").text).split("\n") productFlavors { markets.each { name -> "$name" { } } } String fileContents = new File("${projectDir}/AndroidManifest.xml").text def m = fileContents =~ /android:versionName="(.*)"/ def version = m[0][1] //println version applicationVariants.all{ variant -> def market = variant.productFlavors[0].name; variant.processManifest.doLast{ copy{ from("${projectDir}/AndroidManifest.xml") into("${buildDir}/manifests/$variant.name") filter{ String line -> line.replaceAll("MOFANG_CHANNEL_VALUE", "$market") } variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/AndroidManifest.xml") } } def apk = variant.packageApplication.outputFile; def newName = apk.name.replace("-" + market, "_" + version + "_" + market); newName = newName.replace("-release", ""); variant.packageApplication.outputFile = new File(apk.parentFile, newName); if (variant.zipAlign) { newName = newName.replace("unaligned//", ""); variant.zipAlign.outputFile = new File(apk.parentFile, newName.replace("-unaligned", "")); } } } dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile project(':pcgCommon') } }}} ''注意事项'' * 要注意有些旧项目的AndroidManifest.xml不符合新的规范要加上 useOldManifestMerger true 这个参数 [[BR]] * 检查的时候有问题也跳过 [[BR]] lintOptions { [[BR]] abortOnError false [[BR]]} [[BR]] * runProguard true 代码混淆的选项 [http://www.cnblogs.com/blfshiye/p/3796384.html 参考] [[BR]] * 市场列表文件用Unix回车分割,用其他分割修改这里 split("\n")[[BR]] * 版本信息用正则匹配 AndroidManifest.xml 这个文件 [[BR]] * 市场替换的代码 line.replaceAll("MOFANG_CHANNEL_VALUE", "$market"),设置manifestFile文件 variant.processResources.manifestFile [[BR]] * 只编译release 可以采用 gradle assembleRelease [[BR]] * 调过lint[[BR]] tasks.whenTaskAdded { task -> [[BR]] if (task.name.equals("lint")) { [[BR]] task.enabled = false [[BR]] } [[BR]] }[[BR]] == lint 和 Proguard== [http://proguard.sourceforge.net/ proguard官方说明] [[BR]] 打开注释 runProguard true ,修改proguard.txt可以打开混淆选项 [[BR]] {{{ buildTypes{ release { signingConfig signingConfigs.myConfig runProguard true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "${rootDir}/proguard.txt" } } }}} sdk里面提供的proguard-android-optimize.txt大致为 [[BR]] {{{ -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* -optimizationpasses 5 -allowaccessmodification -dontpreverify -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static ; } -dontwarn android.support.** }}}