zoukankan      html  css  js  c++  java
  • Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)

    一、前言

    Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自己主动化构建工具。

    上面这句话我认为写得非常官方,大家仅仅需知道Gradle能够用来android开发中进行多个项目依赖的自己主动化编译脚本。知道这点也就知道我们使用它的目的;

    为什么不使用Ant做自己主动化编译脚本,由于ant上手快,可是维护起来太不方便了。有了Gradle你能够跟项目组的同事说,用Ant的孩子们别苦逼的维护了,赶紧换成gradle吧。


    本文面向gradle新手或者曾经使用过gradle低版本号的朋友,由于我感觉每次gradle升级那个脚本也有些坑爹,有些api就废弃掉了,只是整体感觉每次升级都让这个工具更加严谨话,易用话了。


    二、Demo描写叙述

    以下我就简单写一个demo。通过这个demo程序让大家怎样高速上手,比較有用的一个实例:

    demo程序分为2个project,你能够直接有用eclipse新建一个androidproject,事实上我也是这么干的,这样一来大家细致看下图



    这里顺便强调一下demoproject的环境配置:(非常重要,否则以下被我坑了别怪我提起没跟你说)

    jdk:C:Program FilesJavajdk1.8.0_20(注意:不要使用jre,gradle会提示你使用jdk的)

    否则脚本会提示以下错误:

    * What went wrong:
    Execution failed for task ':appcompat_v7:compileReleaseJava'.
    > Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME
    system variable to point to the according directory.
    android-sdk:D:devadt-bundle-windows-x86-20140702 

    android-api: 20, android4.4W(注意:做android开发你每次都是用最新的api编译是一个好习惯

    gradle:2.1。(使用最新的版本号2.2,no zuo no die,被坑不断。欢乐不断)

      gradle的下载地址:http://www.gradle.org/documentation ,大家能够看看文档,当然你的E文好的话。会easy上手,只是没关系,看了我写的文章你gradle的文档你能够不看了。由于非常多东西你用不上。除非你项目中使用了特别复杂的功能

      gradle2.1的api文档:http://www.gradle.org/docs/current/javadoc/org/gradle/api/Project.html ,这个须要你偶尔翻翻。由于简单功能会用上的


    环境变量配置

    JAVA_HOME。GRADLE_HOME都要加入到环境变量里

    当然了path变量里你也要加上 JAVA_HOME/bin,和GRADLE_HOME/bin,这样以下你开一个CMD命令行,才干够方面使用gradle build命令


    好了准备工作完毕后。我们就開始正式讲讲这个demoproject了


    TestDemoproject就写了一个activity。显示hello world!

    Appcompatv7project大家懂得一个library。非常有代表性。我们实际项目中会用到多个library,你能够举一反三了。


    以下看看文件夹文件:


    你想运行编译脚本,须要2个配置文件。local.properties和settings.gradle

    settings.gradle里的代码内容:

    include ':appcompat_v7', ':TestDemo'
    这里面能够看到是project的描写叙述。假设你有多个project如论主project还是引用的库project。都须要在这里面声明。否则gradle找不到


    local.properties里的代码内容:

    sdk.dir=D:\dev\adt-bundle-windows-x86-20140702\sdk
    这里面能够看到是android sdk的文件夹,自己填好,否则也会报错。



          好了以下讲讲每一个project里面都须要配置一个build.gradle 文件

    appcompat_v7project的build.gradle:

    buildscript{
    	repositories{
    		mavenCentral();
    	}
    	
    	dependencies{
    		classpath 'com.android.tools.build:gradle:0.13.+' //假设使用gradle2.2版本号。请改为gradle:0.14.+
    	}
    	
    	tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
    }
    
    
    apply plugin:'android-library'
    
    
    dependencies{
    	compile fileTree(dir:'libs',include:"*.jar")
    }
    
    
    android{
    	compileSdkVersion 20
    	buildToolsVersion "20"
    	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
    	}
    }



    对于这个文件我须要强调几点:

    1、classpath 'com.android.tools.build:gradle:0.13.+'  。非常多人用了低版本号出了问题写什么0.11+,我无论,你要使用gradle2.1版本号。这里就写成0.13.+包你没错。假设使用gradle2.2版本号,这里就要写成0.14.+

    2、apply plugin:'android-library'。说明这个一个库project,具体自己找资料脑补

    3、tasks.withType(JavaCompile) { options.encoding = "UTF-8" }   ,task是个啥自己查去,这里编译encoding配成UTF-8。另一点在低版本号脚本有的人写成tasks.withType(Compile) 。这样子报错了,改成JavaCompile吧,我是一点一点排错的

    4、android{
    compileSdkVersion 20
    buildToolsVersion "20"

    这里面version写20。为啥?上面你看看我的android-sdk api的版本号就知道了,写成别的也能够,你要保证你本地androidsdk都有。





    TestDemoproject里的几个文件:


    build文件夹:是gradle运行编译时候生成的。里面好多内容。有兴趣自己翻翻看

    output文件夹:我写得脚本,最后把build里的apk自己主动copy到这个文件夹,这个能够具体看脚本

    blue_key:apk签名文件

    build.gradle:你懂得

    TestDemoproject里面的build.gradle



    import java.util.regex.Pattern
    //import com.android.builder.DefaultManifestParser
    import com.android.builder.core.DefaultManifestParser
    
    
    buildscript{
    	repositories{
    		mavenCentral()
    	}
    	dependencies{
    		classpath 'com.android.tools.build:gradle:0.13.+'
    
    	}
    
    	/***
    	tasks.withType(Compile){
    		options.encoding = "UTF-8"
    	}
    	**/
    
    	tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
    }
    
    apply plugin:'android'
    
    dependencies{
    	compile fileTree(dir:"libs",include:'*.jar')
    	compile project(':appcompat_v7')
    }
    
    android{
    	compileSdkVersion 20
    	buildToolsVersion "20"
    	enforceUniquePackageName=false
    	
    	defaultConfig{
    		targetSdkVersion 17;
    	}
    	
    	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("bluekey")
    			storePassword "blue"
    			keyAlias "blue"
    			keyPassword "blue"
    		}
    	}
    
    	buildTypes{
    		release{
    			
    
    			//runProguard true  //打开混淆开关 这样的写法不能够了
    			//proguardFile 'proguard.txt.txt'  //配置单个文件这样,这样的写法不能够了
    			minifyEnabled true
                            proguardFile getDefaultProguardFile('proguard-android.txt')//指定混淆文件
    
    			signingConfigs.myConfig
    		}
    	}
    
    	sourceSets{
    		main{
    			manifest.srcFile 'AndroidManifest.xml'
    			java.srcDirs = ['src']
    			resources.srcDirs = ['src']
    			aidl.srcDirs = ['src']
    			//rendersrcDirs = ['src']
    			res.srcDirs = ['res']
    			assets.srcDirs = ['assets']
    		}
    	}
    
    	task copyNativeLibs(type: Copy) {
            from(new File(project(':appcompat_v7').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'))
    	}
    	
    	
    	
    }
    
    build.doLast {
    		def today = new Date().format('yyMMdd');
    		copy{
    			//from('build/apk')
    			from('build/outputs/apk')
    			into('output')
    			include('TestDemo-debug.apk')
    			rename('TestDemo-debug.apk','blue-'+today+'-'+readVersion()+'-demo.apk')
    		}
    }
    	
    /**
    	*从Manifest.xml中读取版本号号
    	**/
    	def readVersion(){
    		def manifestParser = new DefaultManifestParser()
    		return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile);
    	}
    





    对于这个文件我须要强调几点(非常重要):

    1、//import com.android.builder.DefaultManifestParser
    import com.android.builder.core.DefaultManifestParser

    //凝视掉的代码是低版本号的写法,眼下使用最新api

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

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

    //凝视掉的代码是低版本号的写法。眼下使用最新api

    3、

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

    编译依赖。我们能够看到依赖的库 appcompat_v7要写在这里,注意":"(冒号一定要写)


    4、

    signingConfigs{
    myConfig{
    storeFile file("bluekey")
    storePassword "blue"
    keyAlias "blue"
    keyPassword "blue"
    }
    }


    buildTypes{
    release{
    signingConfigs.myConfig
    }
    }

    编译时候签名文件配置。当然你也能够编译出debug和没有签名的apk,自行查资料去

    5、

    task copyNativeLibs(type: Copy) {
            from(new File(project(':appcompat_v7').getProjectDir(), 'libs')) { include '**/*.so' }
            into new File(buildDir, 'native-libs')
        }



    tasks.withType(JavaCompile){
    compileTask -> compileTask.dependsOn copyNativeLibs
    }

    关于依赖的so文件和jar文件。在编译之前copy依赖到主project的native-libs文件夹

    6、build.doLast {
    def today = new Date().format('yyMMdd');
    copy{
    //from('build/apk')
    from('build/outputs/apk')
    into('output')
    include('TestDemo-debug.apk')
    rename('TestDemo-debug.apk','blue-'+today+'-'+readVersion()+'-demo.apk')
    }
    }

    /**
    *从Manifest.xml中读取版本号号
    **/
    def readVersion(){
    def manifestParser = new DefaultManifestParser()
    return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile);
    }

    build.doLast,就是最后运行的意思。关于gradle task大家须要简单查资料掌握就可以。


    这里面须要注意的:

      def today = new Date().format('yyMMdd');

    def manifestParser = new DefaultManifestParser()

    都须要def声明变量,低版本号不用写的,可是眼下不写就要报错了。

    这个代码的功能:就是从Manifest文件中读出versioncode然后结合当前日期又一次命名output里的apk文件。



    方便吧,非常有用的一点。

    7、apply plugin:'android'

    这说明这个脚本须要编译的是一个 androidproject,跟上面的library是不是有所不同呢? gradle还支持java project的编译。大家自行查资料。


    三、编译运行:

    以下我们打开cmd命令窗体进行编译操作



    在TestDemo文件夹运行gradle build。由于这里是local.properties和settings.gradle 所在的根文件夹。

    第一次运行时候,gradle依据依赖去下载所须要的jar包,会在你每一个project里创建一个.gradle文件夹

    dependencies{
    classpath 'com.android.tools.build:gradle:0.13.+'
    }

    下载成功后



    ok,那我们開始运行编译操作了。gradle build



    编译正常的话会提示 BUILD SUCCESSFUL,然后自己去output文件夹找apk去。


    这里提醒大家一个jar冲突会引起编译中断的问题:


    由于非常多朋友的project的libs文件夹有多个android-support-v4.jar导致的。


    最后啰嗦

    今天先写到这。我们实际运用中有非常多需求,比如:自己主动依据多渠道打包。依据不同的资源和不同的pkg进行apk打包,gradle都能帮你搞定。这块demo兴许有时间我贴上来。
    有什么问题,大家能够跟我交流(QQ群:221057495)。


    四、參考资料:

    After upgrading to Gradle 2.0: Could not find property 'Compile' on root project
    Unable to resolve class in build.gradle using Android Studio 0.60/Gradle 0.11
           
    How to configure build.gradle files of an existing project with actionbarsherlock lib?
    Multiple settings gradle files for multiple projects building

    Android Tools Project Site


    五、扩展阅读:

    引用配置文件中的变量,比如:我们能够引用gradle.properties

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

    在我们的build.gradle文件中假设要想引用sdk.dir

    能够例如以下操作:

            使用 project.hasProperty('sdk.dir') 推断key值是否存在
     使用project.properties['sdk.dir']进行key值的value引用


    demo下载地址:

    gradle2.1demo过程(哈评论)

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    KNN 与 K
    k 近邻算法(k-Nearest Neighbor,简称kNN)
    ANN神经网络——Sigmoid 激活函数编程练习 (Python实现)
    ANN神经网络——实现异或XOR (Python实现)
    Logistic Regression 之错误翻译
    浅谈回归(二)——Regression 之历史错误翻译
    浅谈回归Regression(一)
    交叉验证 Cross validation
    Git学习-Git时光机之版本回退(二)
    ubuntu16.04安装网易云音乐
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4799086.html
Copyright © 2011-2022 走看看