gradle 编译android项目 Eclipse

原创 2015年07月10日 14:05:34

gradle下载地址

gradle环境配置


1.工程目录结构


说明:如果项目有多个library工程并且有可能重复引用了相同的jar包,如support-4等,需要将这些jar单独拎出来作为一个BaseLibray,其他library引用这个BaseLibrary,如果不这样做很有可能在编译的时候遇到下面这样的错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.IllegalArgumentException: already added: Landroid/support/v4


2.Eclipse下自动生成相关文件

File -> Export -> Android -> Generate Gradle build files


如果没有Generate这个选项,可以尝试升级到高版本的ADT 笔者使用的ADT-23

选中主工程



然后finish即可。完成之后会自动在工程目录中生成一些build文件


说明:在目录下添加local.properties文件,内容如:

sdk.dir=D:\\dev\\adt-bundle-windows-x86_64-20140702\\sdk



即指定Android SDK的目录,gradle在编译工程的时候会调用该目录下的打包工具,由于我已经把SDK目录配置在了环境变量中,这里可以不需要local.properties文件了。

打开build.gradle我们可以看到:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.+'
    }
}

修改这个文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories{
		mavenCentral()
	}
	dependencies{
		//笔者使用的gradle版本为2.4
		classpath 'com.android.tools.build:gradle:1.1.3'
	}

	/***
	tasks.withType(Compile){
		options.encoding = "UTF-8"
	}
	**/

	tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
}

由于使用了ADT自动生成build files的功能,库工程和主工程下都会有build.gradle文件

主工程下build.gradle

apply plugin: 'com.android.application'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':appcompat_v7')
    compile project(':AndroidSupportLibrary')
    compile project(':AndroidSupportLibrary2')
}

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}


直接命令行切换到主工程目录:执行gradle clean

执行gradle build


至此这个基本流程就算完成了。

3.打多个不同包名,使用不同资源不同渠道定制包。

 以umeng多渠道为例,修改android:value

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${CHANNEL_NAME}" > </meta-data>
build.gradle中添加

 productFlavors {

        aa {
            applicationId 'com.example.testgradle.aa'
			manifestPlaceholders = [ CHANNEL_NAME:"aa"]
        }

        bb {
            applicationId 'com.example.testgradle.bb'
			manifestPlaceholders = [ CHANNEL_NAME:"bb"]
        }
    }

applicationId为包名,manifestPlaceholders会在打包时替换AndroidManifest.xml中<meta-data/>节点下的CHANNEL_NAME,

在src目录下新增目录 src/aa/res  src/bb/res


如想重新命名应用名称,只需修改对应路径下的string.xml就行了,换应用的icon或其他资源也同理,保证资源名和主工程下的一致,同时放到对应路径,gradle在打包的时候就会替换为新的资源文件。【这儿有个问题需要注意,就是如果主工程下有自定义的attr,在使用自定义属性的xml中的schemas中使用xmlns:app="http://schemas.android.com/apk/res-auto" 否则在打其他包名的时候提示找不到attribute】


贴上一份还算完整的build.gradle

apply plugin: 'com.android.application'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':appcompat_v7')
    compile project(':AndroidSupportLibrary')
    compile project(':AndroidSupportLibrary2')
}

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
	
	
	defaultConfig {
		applicationId 'com.example.testgradle'
 
		minSdkVersion 9
		targetSdkVersion 20
		versionCode 1
			versionName '1.0'
	}
	productFlavors {

		aa {
			applicationId 'com.example.testgradle.aa'
			manifestPlaceholders = [ CHANNEL_NAME:"aa"]
		}

		bb {
			applicationId 'com.example.testgradle.bb'
			manifestPlaceholders = [ CHANNEL_NAME:"bb"]
		}
	
	signingConfigs{
		myConfig{
			storeFile file("test.keystore")//指定keystore的路径 这儿为当前工程目录下
			storePassword "123321"
			keyAlias "alias_name"
			keyPassword "123321"
		}
	}
	buildTypes{
		release{
			//runProguard true  //打开混淆开关
			//proguardFile 'proguard.txt.txt'  //配置单个文件这样
			signingConfig signingConfigs.myConfig
		}
	}

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
		

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

相关技术文章

http://tech.meituan.com/mt-apk-adaptation.html

http://stackoverflow.com/questions/17571427/gradle-no-resource-identifier-found-for-attribute-when-using-flavors-and-packag

图文来教你在eclipse下用gradle 来打包Android

gradle其他好处就不多说,在android应用发布的时候,如果要统计多个渠道,gradle 批量打包的好处就显示出来了;下面介绍图文来介绍 按eclipse的导出时 选择Android;如下图 然...
  • x605940745
  • x605940745
  • 2014年11月18日 11:28
  • 29884

eclipse中如何用gradle构建android项目

1、准备工作:首先下载gradle,地址://www.gradle.org/,这里我用的是gradle1.10,
  • u010373460
  • u010373460
  • 2014年11月25日 10:10
  • 2747

终端下使用gradle编译android应用

一、编译环境配置 1.安装jdk,并要配置JAVA_HOME环境变量,配置完成后,通过java -v来查看是否安装成功(jdk版本最好使用1.7以上) 2.下载gradle完整包,下载地址http:/...
  • Helloguoke
  • Helloguoke
  • 2016年08月02日 16:36
  • 2298

Eclipse环境下 使用Gradle进行编译实现自动分包

Eclipse环境下 使用Gradle进行编译实现自动分包标签(空格分隔): MultiDexgradle安装 到Gradle官网下载最新版本的Gradle,安装; 将bin目录所在位置添加到环境...
  • wangsai_silence
  • wangsai_silence
  • 2015年07月08日 22:51
  • 6881

图文来教你在eclipse下用gradle 来打包Android

gradle其他好处就不多说,在Android应用发布的时候,如果要统计多个渠道,gradle 批量打包的好处就显示出来了;下面介绍图文来介绍 按eclipse的导出时 选择Android;如下图 ...
  • u013164293
  • u013164293
  • 2016年05月18日 11:16
  • 941

嘿!让我们来手动编译安卓项目吧

本文有点像是在呼应我的文章放弃现代的ide, 拥抱命令行 。不过这次我是认真的。 对那些所谓魔法般的功能,我已经怕了。神秘的后台进程执行着我不知道也不晓得原理的任务。IDE就像知道我头脑里的想法似...
  • fdd11119
  • fdd11119
  • 2016年06月06日 11:45
  • 1600

一个使用命令行编译Android项目的工具类

一个使用命令行编译Android项目的工具类简介编译apk项目需要使用的几个工具,基本都在sdk中,它们分别是(Windows系统): 1.aapt.exe 资源打包工具 2.android.jar...
  • NUPTboyZHB
  • NUPTboyZHB
  • 2016年01月10日 22:37
  • 2855

自己动手编译最新Android源码及SDK(Ubuntu)

在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Andr...
  • dd864140130
  • dd864140130
  • 2016年06月20日 01:54
  • 33769

Gradle编译java,Eclipse项目以及遇到的问题

使用Gradle创建一个简单java项目 步骤: 1、 首先创建一个空的文件夹(名字随便起),我起名加gradlework 2、 进入空文件夹,在命令行使用gradle init 初始化gradle结...
  • u012808234
  • u012808234
  • 2017年02月10日 16:54
  • 2030

Eclipse 下利用 gradle 构建系统

https://my.oschina.net/baochanghong/blog/415305 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为...
  • Paulmin
  • Paulmin
  • 2017年07月29日 16:36
  • 465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gradle 编译android项目 Eclipse
举报原因:
原因补充:

(最多只允许输入30个字)