gradle多渠道打包及友盟统计-eclipse版本

在进行渠道打包的之前,先看看准备篇,知道打包为了什么。
参见1.0android批量打包认知。
批量打包认知
eclipse中使用gradle多渠道打包全部流程

一.生成gradle文件,配置本地的gradle环境
1.选中需要打包的项目右键选择expert->生成gradle文件,如下图所示
gradle多渠道打包及友盟统计-eclipse版本_第1张图片
2.完成第一步后,刷新项目可以得到如下图所示的文件
gradle多渠道打包及友盟统计-eclipse版本_第2张图片

显然项目中多出了gradle.build文件,gradle文件夹。如果没有出现,点击项目右键-refresh
刷新过后看到已经生成的gradle文件夹,如下图:
gradle多渠道打包及友盟统计-eclipse版本_第3张图片
3.打开上述gradle-wrapper.properties文件

红色表示部分:使用gradle打包的时候,所需要使用的文件。

4.复制上述的url,或者直接到官网下载相应的gradle-1.12-all.zip.
为什么要下载对应的,可能是由于版本之间的差异,导致打包失败。应该也可以尝试升级adt或者eclipse中的gradle插件的版本。

以上是官网下载的截图,在红色标志部分,可以选择想要下载的对应版本。在初期我下载最高版本,最终打包没有成功。下载了匹配版本打包成功。
可是测试高版本,如果不行,就使用匹配的对应版本。这里面选择了匹配的对应版本。
5.配置gradle的本地环境。
gradle-1.12-all的解压路径

  GRADLE_HOME      
  D:\Gradle\gradle-1.12-all\gradle-1.12
gradle多渠道打包及友盟统计-eclipse版本_第4张图片
配置一下path(GRADLE_HOME只是作为一个根路径而已)
gradle多渠道打包及友盟统计-eclipse版本_第5张图片

新建一个 gradle-repo文件夹配置环境变量

  GRADLE_USER_HOME

  D:\Gradle\gradle-repo

gradle多渠道打包及友盟统计-eclipse版本_第6张图片

测试gradle环境是否配置成功。

在命令提示符中输入:gradle -version

gradle多渠道打包及友盟统计-eclipse版本_第7张图片

出现如上图结果,表示gradle配置成功。

二.使用gradle进行打包

1.查看需要打包的项目中的gradle.build文件(默认生成的文件)并添加相关脚本代码

[html]  view plain copy print ?
  1. buildscript {  
  2.  //buildscript中的声明是gradle脚本自身需要使用的资源。  
  3.  //可以声明的资源包括依赖项、第三方插件、maven仓库地址等  
  4.     repositories {  
  5.         mavenCentral()  
  6.     }  
  7.     dependencies {  
  8.         classpath 'com.android.tools.build:gradle:0.12.+'  
  9.     }  
  10. }  
  11. apply plugin: 'android'  
  12. //在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源  
  13. dependencies {  
  14.     compile fileTree(dir: 'libs', include: '*.jar')  
  15. }  
  16. android {  
  17.     compileSdkVersion 19  
  18.     buildToolsVersion "19.1.0"  
  19.     sourceSets {  
  20.         main {  
  21.             manifest.srcFile 'AndroidManifest.xml'  
  22.             java.srcDirs = ['src']  
  23.             resources.srcDirs = ['src']  
  24.             aidl.srcDirs = ['src']  
  25.             renderscript.srcDirs = ['src']  
  26.             res.srcDirs = ['res']  
  27.             assets.srcDirs = ['assets']  
  28.         }  
  29.         // Move the tests to tests/java, tests/res, etc...  
  30.         instrumentTest.setRoot('tests')  
  31.         // Move the build types to build-types/<type>  
  32.         // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...  
  33.         // This moves them out of them default location under src/<type>/... which would  
  34.         // conflict with src/ being used by the main source set.  
  35.         // Adding new build types or product flavors should be accompanied  
  36.         // by a similar customization.  
  37.         debug.setRoot('build-types/debug')  
  38.         release.setRoot('build-types/release')  
  39.     }  
  40.      
  41.     lintOptions {  
  42.      abortOnError false  
  43.    }  
  44.    
  45.  ////////////////////以上代码打出了最简单的包,一般情况下生成了两个包////////////////////  
  46.  //*-debug-unaligned.apk:未进行zipAlign优化的apk包  
  47.  //*-release-unsigned.apk:未签名的apk包  
  48.  //以上两种包都不是正式所需要的包,添加下面代码打出签名包  
  49.    
  50.     signingConfigs {  
  51.    myConfig {  
  52.         //绝对路径和相对路径都可以  
  53.          storeFile file("E:\\sjjywork\\key\\key4VipOneToOne\\JyVipKey.keystore")  
  54.         storePassword ""  
  55.         keyAlias ""  
  56.         keyPassword ""  
  57.    }  
  58.   }  
  59.  buildTypes{  
  60.       release {  
  61.       //1.添加签名  
  62.       signingConfig  signingConfigs.myConfig  
  63.       //2.runProguard 执行混淆代码  
  64.       runProguard true  
  65.       //混淆规则文件  
  66.        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'  
  67.       }  
  68.  }  
  69.      
  70.    //添加了上述代码之后,打出了已经签名的apk:其中xxx-release-unaligned.apk是签名为进行zipAligned优化的包  
  71.    //xxx-release.apk是签名和zipAlign优化过的包  
  72.    //添加混淆代码的执行代码如上第二步,就可以实现打出混淆包  
  73.      
  74.    //下面的代码开始打批量包  
  75.      
  76.    productFlavors {  
  77.      GooglePlay{  
  78.       //替换manifest文件中的占位符(placeHolder)  
  79.         manifestPlaceholders = [UMENG_CHANNEL_VALUE:"GooglePlay"]  
  80.      }  
  81.      Store360{  
  82.         manifestPlaceholders = [UMENG_CHANNEL_VALUE:"Store360" ]    
  83.      }  
  84.      //在下面继续添加不同渠道的渠道代码  
  85.  }  
  86.  //通过以下方式是批量的设置  
  87. // productFlavors.all { flavor ->  
  88.   //  flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]  
  89.   //}  
  90. }  
  91. tasks.withType(Compile) { options.encoding = "UTF-8" }  

在这个文件中手动添加的代码都已经做了详细的注释。

2.manifest中添加友盟统计的key和渠道代码(关于友盟统计的key的获取和添加,直接参考友盟统计的文档,不多做解释)
打渠道包的目的是什么?为什么要打渠道包?这个可以见<<1.0apk批量打包认知>>
得到的结论,是要做统计。上面的文件中,使用了友盟统计。
此时需要在manifest.xml添加如下代码:
[html]  view plain copy print ?
  1. <!-- 渠道id,key直接使用umeng的,方便接入umeng sdk -->  
  2.         <meta-data android:name="UMENG_APPKEY" android:value="YOUR_APP_KEY" ></meta-data>  
  3.         <!--配置placeHolder(占位符),用于多渠道打包的时候替换-->  
  4.         <meta-data  
  5.             android:name="UMENG_CHANNEL"  
  6.             android:value="${UMENG_CHANNEL_VALUE}" />  

打批量包的时候,主要使用到的placeHolder: ${UMENG_CHANNEL_VALUE} 清单文件中的一个占位符。
在批量打包的过程批量替换这个UMENG_CHANNEL_VALUE这个字段生成不同的apk包。

3.正式执行批量打包
在控制台中,进入项目所在的目录,执行gradle clean,gradle  build。如果没有报错,将打包成功
如下图:gradle clean
gradle多渠道打包及友盟统计-eclipse版本_第8张图片
报错的原因:注释和代码之间添加空行。因为对这个脚本语言不太熟悉,所以不明具体原因。
执行gradle build
gradle多渠道打包及友盟统计-eclipse版本_第9张图片

到此整个批量打包的过程就完美结束。
刷新项目文件夹看看打出的包:
其中-项目名称-渠道-release.apk就是最终我们所需的渠道apk。
整个批量打包的过程大概十几分钟就搞定了。但是如果对这里面的打包过程是不是还存在很多疑惑。
推荐看如下几篇文章.

①自动生成的gradle.build文件 直接进行打包会生成那些包?各种不同的包,有什么区别?
参见2.1 gradle打包blog
Gradle分步构建android应用
②zipAlign优化是什么意思?
参见2.4
zipAlign优化
③lint工具是做什么用的?
参见2.5
lint工具-张兴业
④配置和打包的全过程大概十多分钟。但是如果出现报错,可就要耗费时间了。
常见的报错参考以下文章:
参见2.3gradle打包遇到的错误

gradle打包错误汇总

至此算是打包的所有流程真正的结束了。加入统计功能的代码,直接根据友盟统计的文档添加相应位置的代码就可以了。





gradle  build.gradle配置文件:

buildscript {
     repositories {
         mavenCentral ( )
     }
 
     dependencies {
         classpath 'com.android.tools.build:gradle:0.9.0'      / /最新版本
     }
}
 
/ /使用 android插件
apply plugin : 'android'
 
/ /各种依赖
dependencies {
     / /添加 libs文件夹下的所有 jar
     compile fileTree ( dir : 'libs' , include : '*.jar' )
     / /这里添加其他依赖,可以是本地、远程的库,例如本地 libraries / support _v7的库
     / / compile project ( ':libraries:support_v7' )
}
 
/ /下面一段是将 libs / * / * .so文件加入打包
/ /如果你的项目是使用 Eclipse + ADT建立的,则需要这段代码
task copyNativeLibs ( type : Copy ) {
     from ( new File ( 'libs' ) ) { include '**/*.so' }
     into new File ( buildDir , 'native-libs' )
}
 
tasks .withType ( Compile ) { compileTask -> compileTask .dependsOn copyNativeLibs }
clean .dependsOn 'cleanCopyNativeLibs'
tasks .withType ( com .android .build .gradle .tasks .PackageApplication ) { pkgTask ->
     pkgTask .jniFolders = new HashSet < File > ( )
     pkgTask .jniFolders .add ( new File ( buildDir , 'native-libs' ) )
}
 
/ /开始 android配置
android {
     / /编译版本,这里指定的是最新的 19
     compileSdkVersion 19
     buildToolsVersion "19.0.0"
 
     / /配置 source路径(如果使用的不是默认路径的话,必须配置)
     sourceSets {
         main {
             manifest {
                 srcFile 'AndroidManifest.xml'
             }
             / /下面的写法看起来比较简洁,当然你也可以用上面的写法
             java .srcDirs = [ 'src' ]
             resources .srcDirs = [ 'src' ]
             aidl .srcDirs = [ 'src' ]
             res .srcDirs = [ 'res' ]
             assets .srcDirs = [ 'assets' ]
         }
         / /测试所在的路径,这里假设是 tests文件夹,没有可以不写这一行
         / / androidTest .setRoot ( 'tests' )
     }
 
     / /签名
     signingConfigs {
         debug {
             storeFile file ( "~/.android/debug.keystore" )
         }
 
         / /你自己的 keystore信息
         release {
             storeFile file ( "your.keystore" )
             storePassword "yourPassword"
             keyAlias "yourAlias"
             keyPassword "yourPassword"
         }
     }
 
     buildTypes {
         debug {
             signingConfig signingConfigs .debug
         }
         release {
             signingConfig signingConfigs .release
         }
     }
 
     / /渠道 Flavors,我这里写了一些常用的,你们自己改
     productFlavors {
         GooglePlay { }
         / / Store360 { }
         / / QQ { }
         / / Taobao { }
         / / WanDouJia { }
         / / AnZhuo { }
         / / AnZhi { }
         / / BaiDu { }
         / / Store163 { }
         / / GFeng { }
         / / AppChina { }
         / / EoeMarket { }
         / / Store91 { }
         / / NDuo { }
     }
 
     / /这个是解决 lint报错的代码
     lintOptions {
           abortOnError false
     }
 
}
 
tasks .withType ( Compile ) {
     options .encoding = "UTF-8"
}
 
/ /替换 AndroidManifest .xmlUMENG_CHANNEL _VALUE字符串为渠道名称 By Remex Huang
android .applicationVariants .all { variant ->
     variant .processManifest .doLast {
    
         / /之前这里用的 copy { },我换成了文件操作,这样可以在 v1 . 11版本正常运行,并保持文件夹整洁
         / / $ { buildDir }是指 . / build文件夹
         / / $ { variant .dirName }flavor / buildtype,例如 GooglePlay / release,运行时会自动生成
         / /下面的路径是类似这样: . / build / manifests / GooglePlay / release / AndroidManifest .xml
         def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"
        
         / /将字符串 UMENG_CHANNEL _VALUE替换成 flavor的名字
         def updatedContent = new File ( manifestFile ) .getText ( 'UTF-8' ) .replaceAll ( "UMENG_CHANNEL_VALUE" , "${variant.productFlavors[0].name}" )
         new File ( manifestFile ) .write ( updatedContent , 'UTF-8' )
        
         / /将此次 flavorAndroidManifest .xml文件指定为我们修改过的这个文件
         variant .processResources .manifestFile = file ( "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml" )
     }     
}

你可能感兴趣的:(gradle多渠道打包及友盟统计-eclipse版本)