gradle模範解答メモ
エントリ分割)
元 Android Studio を build.gradle に task追加の方向性で弄ってみる - exception think
android gradle plugin に関する翻訳Doc
あんまり更新がかかってないけど、こちらに関しては挙動安定してるんだよなー
(たまに
UTF8で動かしてない=>ASやコンソールでエラーでハマってる
人を見たことあるけど‥‥‥‥)
でもandroid gradle pluginのテストコード見てると
buildscript { repositories { maven { url '../../../../out/host/gradle/repo' } } dependencies { classpath 'com.android.tools.build:gradle:0.5.0-SNAPSHOT' } }
な記述があるようなので、今後どうなんだろう?(gradle java pluginベースで書換えるかも?な話もあるようですし)
模範解答を書いてくださってる他方々がいるので考察してみる
1)
ブログ書いた. Androidアプリをgradleでビルドする時必要になるbuild.gradleのひな形http://t.co/qBlITh0vH7
— fkm (@fkm) 2013年5月22日
で「jenkinsで名前が変えられる」という言及があるけど
jenkins Jobで
- デフォルトの作業ディレクトリってworkspaceだから
- workspace-release.apk ってなってるのは気のせいかなー
workspace/yutoru_history って構成でDLしてコンパイルしてれば
とか出来そうな気がする‥‥‥*1
yutoru_history-debug-unaligned.apk
それでも出来てない場合は、作業フォルダの指定とかなんだろうな。。。
あと この gradle.properties って
$HOME/.gradle/gradle.properties
に置くってイメージだろうか??
カレントがworkspaceフォルダとして見れていれば、同じ位置であれば問題ないと思うけど
- 上記の想定だと下記?
- workspace/gradle.properties
でもこれだとレポに設定置くことになるので、書いてる記述とはちと違うかなー*2
あと defaultConfig等の記述は
- AndroidManifest.xml
- local.properties
- project.properties
等の記述をチェック => エラーにしてる
って感じなので、かえって書くと可搬性が悪いかもとは思った(ただこれは個人的感想)
defaultConfig { minSdkVersion 8 targetSdkVersion 16 versionCode <ここにVersionCode> versionName "<ここにVersionName>" }
あとfkmさんのproguard設定のままだと
proguard-project.txtの参照設定が出来ないので
の末尾に検証状況を追記した
追記)
後日にproguard対応版の話有
2)
はてなブログに投稿しました
— Koji Hasegawa (@nowsprinting) 2013年5月22日
Gradle+Androidプラグインで証明書情報をgradle.propertiesに移す - やらなイカ?
http://t.co/71sXbm3JqX
上記の言及したbuild.gradleのバージョンアップ情報
if (project.hasProperty('storeFile')) { android.signingConfigs. myConfig.storeFile = file(storeFile) }
な書き方は秀逸だと思った。たしかにこう書けますね
3)
はてなブログに投稿しました
— Koji Hasegawa (@nowsprinting) 2013年5月23日
Gradle+Androidプラグインでプロダクトフレーバーを試してみた - やらなイカ?
http://t.co/m0rsh8bHhJ
はてなブログに投稿しました
— Nobuoka Yu (@nobuoka) 2013年6月22日
Build Variants を使って別バージョンの Android アプリを同じプロジェクトからビルドする (Gradle 使用) - ひだまりソケットは壊れない
http://t.co/OZ5VAEX18R
githubのコードを見ると
- res/string.xml
- packageName
を上書きという流れのよう
gradlew build
ls ./GradleAndroidFlavorExample/build/apk
出力結果>
GradleAndroidFlavorExample-cuttlefish-debug-unaligned.apk
GradleAndroidFlavorExample-cuttlefish-release-unsigned.apk
GradleAndroidFlavorExample-squid-debug-unaligned.apk
GradleAndroidFlavorExample-squid-release-unsigned.apk
productFlavors 宣言をした時点で普通のノーマルのやつに上書きしない という構成は厳しそう
http://t.co/KHrWQmPloY の記事試してるんだけど
— close_yutori (@kimukou2628) 2013年5月24日
productFlavors 宣言した時点で、Flavors宣言名のapkしか出来ないのと
release: 普通
debug : AndroidManifest/res含めた情報のみ上書き
っての難しい?
ls ./GradleAndroidFlavorExample/src main cuttlefish -res/string.xml squid -res/string.xml
なのも関係あるのかしら。。。?
./GradleAndroidFlavorExample/build.gradle
println "[productFlavors]${productFlavors.dump()}"
に上記追加してDSLをdumpしてみると
store=[ GroupableProductFlavorDsl_Decorated{name=cuttlefish, minSdkVersion=-1, targetSdkVersion=-1, renderscriptTargetApi=-1, versionCode=-1, versionName=null, packageName=com.nowsprinting.gradleandroidflavorexample.cuttlefish, testPackageName=null, testInstrumentationRunner=null, signingConfig=null}, GroupableProductFlavorDsl_Decorated{name=squid, minSdkVersion=-1, targetSdkVersion=-1, renderscriptTargetApi=-1, versionCode=-1, versionName=null, packageName=com.nowsprinting.gradleandroidflavorexample.squid, testPackageName=null, testInstrumentationRunner=null, signingConfig=null} ]
な感じ
4)
[gradle][android]How to fix the error "ERROR: The default configuration has an indirect... http://t.co/eKcj3OdLdl
— Sosuke Masui (@esmasui) 2013年5月27日
このエラーって致命的なエラーが出た時によく出るんだけど
ASレベルじゃ分かんないですよね。。
今回はAndroid系のライブラリの依存関係がぶつかるって記載だったけど
- gradle自体も沢山ライブラリ使ってる
=>
- gradle自体の依存jarとぶつかる
って話はあるのでexclude記述は覚えておいたほうがいいかも。
ただこれGUI素人レベルの人に説明するの無理やろ−
絶対。。。(苦笑
5)@vvakameさんの記事
eclipseタスクのDSLをちゃんと書くべき って記載例が載ってた。。。(サボってましたごめんなさい><)
IDEA版もちゃんと書けばimport後の負担減ると思う(汗
でもこれ書かせる前提だとますます嫌がられそう。。。
でもここのbuild.gradleをコピペしてみてもなんか予想通り動かない
.classpathは
<classpath> <classpathentry kind="output" path="bin"/> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" exported="true"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES" exported="true"/> </classpath>
と生成されてしまいます*3
androidLibs ってなんぞ?と言われる。
- [、] => [,]に置き換える必要があります*4
ここも記事読んで試しただだけの人は嵌りそうだよなー
本当にリアルにするなら
ぐらいの記述は必要なんでしょうし‥‥‥
IDEAのせってゴリゴリな話は
に一応あります
勿論ASベースだとますます動かせませんので実際にリアルに近い形で弄ってみましょう
- build.gradle
repositories { mavenCentral() } apply plugin: "java" apply plugin: 'eclipse' //[NOTE]sourceSetsの指定のためのjava pluginが必要 sourceSets { //eclipse export構成ならこれでもOK /* main { java.srcDirs "src","gen" output.classesDir = "bin/classes" } */ main { //projectDir = rootProject.name println "projectDir=$projectDir" java.srcDirs = [ "$projectDir/src", "$buildDir/source/r/debug" , "$buildDir/source/rs/debug", "$buildDir/source/buildConfig/debug", "$buildDir/source/aidl/debug" ] //output.classesDir = "$buildDir/classes" //☆ } } eclipse { projectNames= rootProject.name println "projectNames=$projectNames" project { //name = 'AndroidProject' name = projectNames //☆こっちのほうがベターだと思う(Settings内で定義されてるプロジェクト名) natures 'com.android.ide.eclipse.adt.AndroidNature' buildCommand 'com.android.ide.eclipse.adt.ResourceManagerBuilder' buildCommand 'com.android.ide.eclipse.adt.PreCompilerBuilder' buildCommand 'com.android.ide.eclipse.adt.ApkBuilder' } classpath { defaultOutputDir=file("$buildDir/classes") //☆☆ containers.clear(); containers = [ "com.android.ide.eclipse.adt.ANDROID_FRAMEWORK", "com.android.ide.eclipse.adt.LIBRARIES" ] downloadSources = true downloadJavadoc = true } }
.project に関しては問題ないようなのですが
.classpath はうまく生成されません
sourceSetsのところがうまく動いていないようなので
試しに
☆の箇所とは別に
☆☆を追加してみます
- タスク実行時に生成されるプロジェクト設定ファイル
.project (vvakameさんができると提示した未来予想図とほぼ同じ)
<projectDescription> <name>AndroidProject</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.ApkBuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>com.android.ide.eclipse.adt.AndroidNature</nature> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription>
.classpath (実際出来たもの)
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="output" path="build/classes"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" exported="true"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES" exported="true"/> </classpath>
.classpath (vvakameさんができると提示した未来予想図)
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry kind="output" path="bin/classes"/> </classpath>
なんだろうな。。(汗
eclipse {
pathVariables 'GRADLE_USER_HOME': gradle.gradleUserHomeDir
}
とか出来るのは知ってるんですけどね・・・・
6)
adt-dev で Xavier さんが投稿してる Google Play Services のサンプルプロジェクトが Gradle でのマルチプロジェクト構成にすごく参考になる http://t.co/d8B7TEfION
— zaki50 (@zaki50) 2013年5月29日
ちょっと書き方は雑*5かなとおもったけど・・。
自分的感想としては
@alterakeyさんや @sos_jp のほうが書き方精錬されてるかも。
まああえて言及されているってことは
かなりAndroid系でかなり有名な開発者の方がサンプル出してくれたんだろうしな。。。
それはそれでありがたいのかも‥‥‥
1個だけ build.gradle等読んでて 確かに納得したのは
一番最上位にのところだけに
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
な記載に留めてる処。確かに無駄なNWアクセスだよね(一度読みこめばずっとclasspath内には存在するので)
7)
gradleベースのプロジェクトテンプレート(Android Studioで開発する前提のもの) を作ったので github に置いた https://t.co/cUhoAi6gt0 現状では ABS、AndroidAnnotations、okhttp、volleyを組み込んでる
— zaki50 (@zaki50) 2013年6月6日
aptタスクの書き方がわからなかったのですごく勉強になった
- MyTemplate/build.gradle
configurations { apt } dependencies { // http://stackoverflow.com/questions/16683944/androidannotations-nothing-generated-empty-activity/16802216#16802216 apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}" compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}" }
と書けば認識すると。ココらへん公式サイトに書いてなかった気もするんだよな‥‥(汗。
困ったときのstackoverflow頼み。
aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}") println "****************************" println "variant: ${variant.name}" println "manifest: ${variant.processResources.manifestFile}" println "aptOutput: ${aptOutput}" println "****************************" variant.javaCompile.doFirst { println "*** compile doFirst ${variant.name}" aptOutput.mkdirs() variant.javaCompile.options.compilerArgs += [ '-processorpath', configurations.apt.getAsPath(), '-AandroidManifestFile=' + variant.processResources.manifestFile, '-s', aptOutput ] }
のところはaptOutputのところをgenに出力してたんだけど、
android maven projectだとそれ何処い当たるのかいまいちわからんな。。。(汗
- MyTemplate プロジェクトを選択し、 File > Project Structure を開く
- Modules >MyTemplate を選択し
- Sources タブを選んで build/source/apt_generated/debug を選択し
- 上にある Sourcesボタン を押して Sourceフォルダとする。
と記載して頂いてるけど。。。
- mike、mikeなるままに…: Gradle + Groovy + Ideaをやってみよう
- mike、mikeなるままに…: json-pull-parserをIntelliJ IDEAに適用するためのbuild.gradle
のほう読みなおしたほうがベストかも。。。
8)
[android][gradle]Android Gradle PluginでJsonPullParserを使う http://t.co/DioL6mBN3r
— Sosuke Masui (@esmasui) 2013年6月7日
- Android Gradle PluginでJsonPullParserを使う - _development,
- GitHub - esmasui/android-cancellation-signal-support: android-cancellation-signal-support is a compatibility library of android.os.CancellationSignal
gradle(Android Studio) の雛形プロジェクトに JPP を追加した https://t.co/cUhoAi6gt0
— zaki50 (@zaki50) 2013年6月7日
上記のaptのをJPPでやったお話らしい
等の記載がないと駄目って
書いてるんだけど、普通にコンパイルしてAPKで来てるんだよな‥‥‥
apt_generated とかの設定ってあくまでGUIの設定だと思ってるんだけど
違うんだろうか??
これ勘違い><。でもなんでapkできるんだろう?
逆に有効にするとエラーになるので改めて追わないと・・・(汗
一応 zakiさんプロジェクト微改版 は動いてるので
何か設定足りないのかも。pluginのソース読み込まないと駄目かな。。。
追記)
一応これに関しては
で解決。@zaki50 さんの環境 https://github.com/zaki50/android_gradle_template/blob/master/MyTemplate/src/main/AndroidManifest.xml
の環境で[_]が付いてるの見落としてただけだった。
androidannotationsの引数オプションは調べたほうがいいかも(汗
でも自分の環境だと再度試しても
ASから実行時に「そんなActivityはありません」とエラーになるんだけどな‥‥。環境依存?
@zaki50 android_gradle_template 使ってみたのですが、aptOutputが見つからないってエラーが出てStudio(0.1.9)でビルド出来ませんでした。ただ、aptOutputを設定している行の1つ上にprintln ""入れるだけでビルド成功。
— Yoshiaki NAKANISHI (@chun_ryo) 2013年7月2日
“Android Studio 0.1.9 にアップデートしてみた。 - Dlog 隔離館” http://t.co/MH3mijilMd
— Nobuhiro Sue (@nobusue) 2013年7月2日
な話もあるようなので環境依存はあるっぽいかも。。。
<変にgradleやIDEAのローカルのファイルが残っちゃってるとか?
後者の話は、自分も再現できなかった・・・うーん。
9)
ブログを書きました/Androidのテスト実行も含めてEclipseとGradleを共存させてみる http://t.co/diWUu7y8tX
— TOYAMA Sumio (@sumio_tym) 2013年6月23日
この構成はちょっと調べてみたいかな。
setRootが相対パス指定出来れば多分eclipseの構成のまま
gradleで使えるかもな夢が広がるかも((ただしASとしてはダメな可能性は高いけど。。。))
10)
はてなブログに投稿しました
— Nobuoka Yu (@nobuoka) 2013年6月17日
Gradle による Android アプリのビルド - ひだまりソケットは壊れない
http://t.co/wwuK4BHOZN
アプリを起動する あたりの話は 後で検証してみたいかも<実際はUSBにつながってる全端末に送れないと微妙な気がしますよね。。
(installDebug等は単一モードしか対応してないし
gradle pluginを作るとしたら、マルチOSはサポートしないと厳しいんだろうなとは思いつつ
[Gradle] 『Gradle | Gradle カスタムPluginの作成方法』 http://t.co/jPVg1quIaJ
— 🍊🍀 (@orange_clover) 2013年6月25日[Gradle] 『Gradle | Javaのpackage-info.javaを自動生成するGradleカスタムPluginを作成』 http://t.co/5ZZs9GsQ5w
— 🍊🍀 (@orange_clover) 2013年6月25日
あたりを読み返そうと思ってる
11)
[android][gradle]mockito-allとdexmakerをinstrumentTestのdependencyに追加する http://t.co/5xFpO4QURe
— Sosuke Masui (@esmasui) 2013年7月3日