Android打包利器Gradle之三板斧

来源:互联网 发布:如何重新设置网络账号 编辑:程序博客网 时间:2024/05/22 01:49

    当传统的手工打包方式遇上同一应用,多渠道/多包名及多种引导页/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库,直接复制下,不用改,拿好,不谢。


 

1 0