上两篇的地址
安装配置
http://www.cnblogs.com/uncle2000/p/4276833.html
简单实战
http://www.cnblogs.com/uncle2000/p/4277476.html
我之所以以前用ant现在用gradle是因为 ant打包给 加入第三方依赖工程非常非常非常麻烦,而网上关于两者的对比就数不胜数了,大家可以去查,充分的说明了 gradle的优势
而且还有一点就是gradle的中文资料是要多于ant的,想当初ant中加入for-each 和 switch-case 可是让我操碎了心,关于我的ant代码我也会在后面的android打包中给出源码。
而关于gradle来打包我学一天就已经掌握了,而ant 用个循环还要装支持的插件我擦!并且我很讨厌标签化的语言
好了废话少说 开门见山 此篇的内容要少于上篇,如果gradle此篇的这些功能,eclipse可不能简单批量的完成哟
一 签名
//签名的配置 我后面配上完整代码 这里关于域就不细写了 signingConfigs { myConfig{ //签名文件,放到工程根目录哟 storeFile file("xxxx.keystore") //签名文件的密码 storePassword "xxxxx" //工程的Alias名 keyAlias "xxxx" //签名的密码 keyPassword "xxxx" } } //构建的时候要做的事情都在这里,比如签名或者混淆 buildTypes{ release { //注意网上有些是错的,这个是对应新的2.2.1的gradle中的方法 //这个的意思是 执行签名 执行的方法是signingConfigs下的myConfig内的配置 就是上面那个域 signingConfig signingConfigs.myConfig } }
二混淆
关于混淆文件(proguard-properties.txt)内容我就不给出了哈
刚刚说了混淆也是在那个执行方法里
buildTypes{ release { //执行混淆 混淆配置在根目录下的proguard-properties.txt文件内 proguardFile getDefaultProguardFile(‘proguard-properties.txt‘)//指定混淆文件 } }
三批量打包的两种方法
第一种:
批量打包的部分代码我上一篇都有提过
defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { //渠道一的配置 channelname1{ //把manifest中的“CHANNEL”变量名(key)的变量值(value)替换成xxx1 //这里也可以把“"xxx1"” 换成name=> [CHANNEL:name] 这个的意思就是把value换成 channelname1 //由于网上的乱七八糟的粘贴复制 所有网上的那些根本没说清楚,这里的CHANNEL必须要再manifest中有且对应 具体我写在下面代码块 manifestPlaceholders = [CHANNEL:"xxx1"] } //渠道二的配置 channelname2{ manifestPlaceholders = [CHANNEL:"xxx2" ] }....渠道n...... }
注意manifest中加入这么一段 属于那个域都可以,但是你要会取,我写在了<application>
//这里的$对于android编译器来说就是个char 但是对于gradle来说就是变量的意思,可以替换,用什么替换?当然是我上个代码块中的productFlavors域中的值了。切忌这个CHANNEL要和上个代码块中的CHANNEL对应 如果改变其中一个记得改变另一个 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL}" />
这样就可以了,这种配置适合在每一个里面都单独配置,比如不同渠道不同的版本号,不同的各种各样的配置,但是如果不需要那么多花哨,就可以用第二种方法
第二种:
defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { channelname1{ } channelname2{ } //执行all方法,循环把 channelname*赋值给manifest中的变量 all { flavor -> flavor.manifestPlaceholders = [CHANNEL:name ] } }
四依赖工程/依赖第三方工程/依赖外部工程
什么是依赖工程?
其实很简单的只要在原来代码上加入几行代码几个文件就可以实现,所以不要想那么难
我举个例子就是我的xxx工程依赖appcompat_v7_6这个工程的情况
如上图 两个工程 两个文件 这是最上级目录
目录结构是这样
/appcompat_v7_6/1~n个子文件
/xxx/1~n个子文件
/local.properties
/settings.gradle
除此以外
两个工程中各有一个 build.gradle
一个一个说。
1 local.properties文件内的内容是你sdk的根目录 很简单吧
2settings.gradle文件内的内容是所有有联系的工程名
结构是 include ‘:x1‘,‘:x2‘,‘:x3‘,.........注意不要用中文
":"相当于文件夹系统的“\xx\”中的“\”
3 然后看我appcompat_v7_6中的build.gradle的内容 标配哈
buildscript{ repositories{ mavenCentral(); } dependencies{ //你可能需要改动的地方 classpath ‘com.android.tools.build:gradle:1.0.0‘ } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } } apply plugin:‘android-library‘ dependencies{ compile fileTree(dir:‘libs‘,include:"*.jar") } android{ //你可能需要改动的地方 compileSdkVersion 19 //你可能需要改动的地方 buildToolsVersion "19.1.0" enforceUniquePackageName=false lintOptions{ abortOnError false } sourceSets{ main{ manifest.srcFile ‘AndroidManifest.xml‘ java.srcDirs = [‘src‘] resources.srcDirs = [‘src‘] aidl.srcDirs = [‘src‘] renderscript.srcDirs = [‘src‘] res.srcDirs = [‘res‘] assets.srcDirs = [‘assets‘] } } lintOptions{ abortOnError false } }
以上出了注释可能需要改动的地方 其他地方一律不变,除非你用的gradle是很老的版本 有些方法不能用
4最后看我xxx中的文件内容
import java.util.regex.Pattern//用到的一些java的包 import com.android.builder.core.DefaultManifestParser buildscript { repositories { mavenCentral() } dependencies { //你可能需要改动的地方 classpath ‘com.android.tools.build:gradle:1.0.0‘ } } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } apply plugin: ‘android‘ dependencies { compile fileTree(dir: ‘libs‘, include: ‘*.jar‘) //你可能需要改动的地方 //这里 project就是编译一个工程的意思 注意名字要和settings中的对其 这个方法会自动去工程外找settings文件 compile project(‘:appcompat_v7_6‘) } android { //你可能需要改动的地方 compileSdkVersion 19 //你可能需要改动的地方 buildToolsVersion "19.1.0" enforceUniquePackageName=false defaultConfig { //你可能需要改动的地方 targetSdkVersion 19 } lintOptions{ abortOnError false } dexOptions { preDexLibraries = false } //简化编译过程 packagingOptions { exclude ‘META-INF/DEPENDENCIES.txt‘ exclude ‘META-INF/LICENSE.txt‘ exclude ‘META-INF/NOTICE.txt‘ exclude ‘META-INF/NOTICE‘ exclude ‘META-INF/LICENSE‘ exclude ‘META-INF/DEPENDENCIES‘ exclude ‘META-INF/notice.txt‘ exclude ‘META-INF/license.txt‘ exclude ‘META-INF/dependencies.txt‘ exclude ‘META-INF/LGPL2.1‘ exclude ‘META-INF/ASL2.0‘ } signingConfigs { myConfig{ storeFile file("android.keystore") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } } buildTypes{ release { signingConfig signingConfigs.myConfig proguardFile getDefaultProguardFile(‘proguard-properties.txt‘) } } defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } sourceSets { main { manifest.srcFile ‘AndroidManifest.xml‘ java.srcDirs = [‘src‘] resources.srcDirs = [‘src‘] aidl.srcDirs = [‘src‘] renderscript.srcDirs = [‘src‘] res.srcDirs = [‘res‘] assets.srcDirs = [‘assets‘] } //把工程都搞过来一起编译包括所有的.so文件 task copyNativeLibs(type: Copy) { //你可能需要改动的地方 from(new File(project(‘:appcompat_v7_6‘).getProjectDir(), ‘libs‘)) { include ‘**/*.so‘ } into new File(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(new File(buildDir,‘native-libs‘)) } productFlavors { xxx1{ } xxx2{ } all { flavor -> flavor.manifestPlaceholders = [CHANNEL:name ] } } } }