Gradle Android最新自動化コンパイルスクリプトチュートリアル

14502 ワード

変換元:http://blog.csdn.net/changemyself/article/details/39927381
一、前言
GradleはGroovy言語をベースにJava向けアプリケーションがメイン.DSL(レルム固有言語)構文に基づく自動構築ツール.
Gradleがandroid開発で複数のプロジェクトに依存する自動化コンパイルスクリプトに使用できることを知っておくだけで、私たちがその目的を知っています.
なぜAntを使用して自動化コンパイルスクリプトを作成しないのか、antは手が速いためですが、メンテナンスが不便です.Gradleがあれば、プロジェクトチームの同僚に、Antを使用する子供たちは無理にメンテナンスしないで、急いでgradleに変えましょう.
 
本文はgradleの初心者あるいは以前gradleの低バージョンを使ったことがある友达に向かって、私はgradleがそのスクリプトをアップグレードするたびに少し穴が空いていると感じて、一部のapiは廃棄しましたが、全体的にアップグレードするたびにこのツールをもっと厳格にして、使いやすくなりました.
 
二、Demo説明
次は簡単にdemoを書きます.このdemoプログラムを通じて、どのように迅速に上手になるか、実用的な例を書きます.
demoプログラムは2つのプロジェクトに分かれています.eclipseでandroidプロジェクトを直接作成することができます.実は私もそうしています.そうすれば、下の図をよく見てください.
Gradle Android最新自动化编译脚本教程_第1张图片
 
ここでdemoプロジェクトの環境配置を強調します:(重要です.そうしないと、下に穴があいています.私があなたに言っていないのを責めないでください)
jdk:C:\Program Files\Java\jdk1.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:\dev\adt-bundle-windows-x86-20140702 
 
android-api: 20, android4.4 W(注意:android開発をするたびに最新のapiでコンパイルするのは良い習慣です)
gradle:2.1、(最新バージョンを使用して、no zuo no die、穴が絶えず、喜びが絶えない)
gradleのダウンロードアドレス:http://www.gradle.org/documentationああ、皆さんはドキュメントを見ることができます.もちろん、あなたのE文がよければ、上手になりますが、大丈夫です.私が書いた文章を見て、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コマンドを使用することができます.
 
準備が終わったら、このdemoプロジェクトについて正式に話し始めました.
 
TestDemoプロジェクトはactivityを書いて、hello worldを表示します!
Appcompatv 7プロジェクトはlibraryを知っていて、代表的で、私たちの実際のプロジェクトでは複数のlibraryを使うことができます.あなたは1対3を挙げることができます.
 
ディレクトリファイルを見てみましょう.
Gradle Android最新自动化编译脚本教程_第2张图片
コンパイルスクリプトを実行するには、2つのプロファイルが必要です.local.propertiesとsettings.gradle
settings.gradleのコードの内容:
 
include ':appcompat_v7', ':TestDemo'

ここにはprojectの説明が表示されます.主な工事か引用したライブラリ工事かなど、複数の工事がある場合は、gradleが見つからないと宣言する必要があります.
 
 
local.propertiesのコードの内容:
 
sdk.dir=D:\\dev\\adt-bundle-windows-x86-20140702\\sdk

この中にはandroid sdkのディレクトリが見えます.自分で記入してください.そうしないと、間違いを報告します.では、各工事にbuildを配置する必要があります.gradleファイル
 
appcompat_v 7工事のbuild.gradle:
 
buildscript{
	repositories{
		mavenCentral();
	}
	
	dependencies{
		classpath 'com.android.tools.build:gradle:0.13.+'
	}
	
	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+を書いたが、私は気にしないでgradle 2を使う.1バージョン、ここでは1.13+パッケージと書いてあります.あなたは間違いありません.
2、apply plugin:'android-library'は、このライブラリプロジェクトを説明し、詳細は自分で資料を探して脳を補う.
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のバージョンを見てみればわかりますが、他のものに書いてもいいです.地元のandroid sdkがあることを保証してください.
 
 
 
 
TestDemoプロジェクトのいくつかのファイル:
Gradle Android最新自动化编译脚本教程_第3张图片
buildディレクトリ:gradleがコンパイルを実行したときに生成されたもので、中にはたくさんの内容が入っていて、興味があったら自分でひっくり返してみましょう.
outputディレクトリ:私はスクリプトを書いて、最後にbuildの中のapkを自動的にこのディレクトリにcopyして、これは具体的にスクリプトを見ることができます
blue_key:apk署名ファイル
build.gradle:分かってる
TestDemo工事中の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'  //        

			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.DefaultManifestParserimport 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_を見ることができますv 7ここに書くには、「:」(コロンは必ず書く)に注意してください.
 
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がプライマリエンジニアリングのnative-libsディレクトリに依存する.
6、build.doLast{def today=new Date().format('yyMMdd');copy{//from('build/apk')from('build/output/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ファイルに名前を変更することです.
 
Gradle Android最新自动化编译脚本教程_第4张图片
便利でしょう.実用的な点です.
7、apply plugin:'android'
これは、このスクリプトがandroidエンジニアリングをコンパイルする必要があることを示しています.上のlibraryとは違いますか?gradleはjavaプロジェクトのコンパイルもサポートしており、自分で資料を調べます.
 
三、コンパイル実行:
次にcmdコマンドウィンドウを開いてコンパイル操作を行います
Gradle Android最新自动化编译脚本教程_第5张图片
 
TestDemoディレクトリでgradle buildを実行します.ここはlocalです.propertiesとsettings.gradleが存在するルートディレクトリ.
最初の実行時、gradleは依存に基づいて必要なjarパッケージをダウンロードし、プロジェクトごとに作成します.gradleディレクトリ
dependencies{ classpath 'com.android.tools.build:gradle:0.13.+' }
ダウンロード成功後
Gradle Android最新自动化编译脚本教程_第6张图片
 
OKコンパイルを始めましたgradle build
Gradle Android最新自动化编译脚本教程_第7张图片
 
コンパイルが正常であればBUILD SUCCESSFULを提示し、自分でoutputディレクトリに行ってapkを探します.
 
ここではjar競合がコンパイル中断を引き起こす問題について注意します.
Gradle Android最新自动化编译脚本教程_第8张图片
多くの友人のプロジェクトのlibsディレクトリにはandroid-support-v 4が複数あるからです.JArによる.
 
最後はうるさい
今日はまずこれを書きます.私たちの実際の運用には多くの需要があります.例えば、自動的にマルチチャネルによってパッケージ化され、異なる資源と異なるpkgによってapkパッケージ化され、gradleがあなたを助けることができます.このdemoは後で貼る時間があります.
何か問題があったら、私と交流してください(QQ群:
221057495).
 
四、参考資料:
 
After upgrading to Gradle 2.0: Could not find property 'Compile' on root projectUnable 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
 
 
demoダウンロードアドレス:
gradle2.1 demoチュートリアル(マルチコメントハ)