wiki:gradle

参考

gradle中英文  http://gradle.org/  http://doc.gradle.cn/wiki/gradle-main?hl=main

项目转换为gradle  http://tools.android.com/tech-docs/new-build-system/intellij_to_gradle
gradle android 详细说明  http://tools.android.com/tech-docs/new-build-system/user-guide
多渠道打包  http://www.cnblogs.com/youxilua/archive/2013/05/20/3087935.html

常用配置

apply plugin: 'java': 指定项目为java项目
apply plugin: 'android' 指定为android项目 apply plugin: 'android-library':增加android库项目

常用命令

gradle -q quite模式,出错才输出

gradle tasks --all 列出所有任务

gradle projects 列出当前目录下所以项目

gradle :app:tasks 例如 gradle test:assemble 运行test项目assemble任务,相关前置任务会检查一次

例子

以聚超值为例子,因为要多个项目构成,需要settings.gradle 这个文件 , 参考

settings.gradle

include ':pcgCommon', ':Juchaozhi'

local.properties ,用于配置sdk.dir

sdk.dir=/Volumes/DATA/tools/android-sdk-macosx

root项目下有两个项目 pcgCommon和Juchaozhi
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: 'com.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']
            jniLibs.srcDirs    = ["${rootDir}/pcgCommon/libs"]
        }

        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 flase
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }

    def markets = new File("${rootDir}/keystore/market.config").readLines()
    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 这个参数
  • 检查的时候有问题也跳过
    lintOptions {
    abortOnError false
    }
  • runProguard true 代码混淆的选项  参考
  • 市场列表文件每一行代表一个市场渠道
  • 市场替换的代码 line.replaceAll("MOFANG_CHANNEL_VALUE", "$market"),设置manifestFile文件 variant.processResources.manifestFile
  • 只编译release 可以采用 gradle assembleRelease
  • 调过lint
    tasks.whenTaskAdded { task ->
    if (task.name.equals("lint")) {
    task.enabled = false
    }
    }
  • 复制so文件到安装包要怎加这个,只有在app模块生效在lib模块不生效 jniLibs.srcDirs = ${rootDir}/pcgCommon/libs?

lint 和 Proguard

 proguard官方说明
打开注释 runProguard true ,修改proguard.txt可以打开混淆选项,如果内存不够,修改gradle.properties增加java运行内存
混淆的时候要注意JAVA_HOME版本和proguard支持的java版本相符

参考例子  http://www.eoeandroid.com/blog-1287430-48429.html

    buildTypes{
        release {
            signingConfig  signingConfigs.myConfig
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "${rootDir}/proguard.txt"
        }
    }

sdk里面提供的proguard-android-optimize.txt大致为

-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 <methods>;
}
-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 <fields>;
}
-dontwarn android.support.**

proguard.txt内容

-keep public class * extends android.app.Activity  
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
 
-libraryjars <user.dir>/pcgCommon/libs/android-support-v13.jar
-libraryjars <user.dir>/pcgCommon/libs/framework.jar
-libraryjars <user.dir>/pcgCommon/libs/httpmime-4.1.1.jar
-libraryjars <user.dir>/pcgCommon/libs/imofan-ext.jar
-libraryjars <user.dir>/pcgCommon/libs/imofan.jar
-libraryjars <user.dir>/pcgCommon/libs/jpush-sdk-release1.5.2.jar
-libraryjars <user.dir>/pcgCommon/libs/libammsdk.jar
-libraryjars <user.dir>/pcgCommon/libs/mta-sdk-1.0.0.jar
-libraryjars <user.dir>/pcgCommon/libs/open_sdk.jar
-libraryjars <user.dir>/pcgCommon/libs/pinyin4j-2.5.0.jar
-libraryjars <user.dir>/pcgCommon/libs/weibosdkcore.jar
-libraryjars <java.home>/lib/rt.jar

-dontwarn com.imofan.**
-dontwarn cn.com.pcgroup.**

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

lint常见问题
主要是api版本和部分资源没使用的问题
InlinedApi?: Using inlined constants on older versions
NewApi?: Calling new methods on older versions
UnusedResources?: Unused resources