android gradle plugin(v04) の構造のお話のメモ
情報整理エントリ
一応メモ途中)
自分が作った構成
- ASメイン構成
- ecメイン構成
@alterakey さんに検証してもらってできた構成
- ASメイン構成から
AOSP のソースの位置メモ>
- android gradle plugin
git clone https://android.googlesource.com/platform/tools/build
- android idea plugin
git clone https://android.googlesource.com/platform/tools/adt/idea
ただ読み解くにはIDEA Pluginの構造理解とかも必要かもしれない
- IntelliJ IDEAプラグインの開発 - 有用な情報とリンク集 - 砂漠の音楽
- IntelliJ IDEAのプラグイン開発 - North Ground
- http://hotchemi.hateblo.jp/entry/2013/01/07/013344
らへんぽいんだけど
ちょくに落とすにはどうすればいいんだろう?
git clone https://android.googlesource.com/platform/sdk/
だとデカそう(汗
自己検証メモ>
IDEA Plugin側)
git clone https://android.googlesource.com/platform/tools/adt/idea
AS 0.1 そうか。。gradle-wrapper で指定してあると 回線細いとNWアクセス発生 => 上手く参照できないとエラーがでて実行もできない つう話があるのね。。これローカルにzipおいて参照する形に直すのがベターだと・・。gradlewの盲点だな。。。
AS 0.1 gradlew ってキャッシュ有るとNWアクセスいかないと思ってたけど1)レポジトリアクセス 2)差分チェック 3)差分があればDL 4)実行 が現在の動きになるわけか。で 1)-3)でエラー出ると駄目だと。昔それ全然感じたこと無いのでAS負荷凄い?
@alterakey 以前はキャッシュ一つの筈なんで何か動きがおかしいかも(汗。コマンドライン実行とASからの実行比較してみます
2013-05-30 23:05:39 via hamoooooon to @alterakey
@alterakey 昨日調べてみた感じだと、asのandroid pluginレベルでv0.1だとPingCheckしてた挙動のようです。で0.1.1で直されたと。そうなると実はas内で直にbuild.gradleを実行してる疑惑が有りますね
2013-05-31 09:19:30 via hamoooooon to @alterakey
AS 0.1ローカルのgradlew 1.6 のキャッシュみてたらたくさん出来てるんだけど何で?前のバージョンとか1個位しか出来てないんだけど。この動きだと毎回DLしにいこうとしてる動き?挙動変わったのかな?
- これはAS v0.1だとDLに失敗したと判定すると繰り返すっぽい挙動
- 0.1.1では直ってる & ./gradlew レベルでは起きない
AS 0.1オフラインで実行した時cannot execute "URL" なエラーはASが出してるコンソール直実行ではキャッシュができてる場合はgradlewはそのまま正常実行 AS 0.1.1 でこの謎チェックはなくなってるよう
AS 0.1/0.1.1試しに別ディレクトリからXXX/gradlew -b XXX/build.gradle clean build は問題なく通るな。。で、直下あたりの gradlewに全部 --debugつけてもコンソールには出てこないと。
AS 0.1 のオフラインのエラーのやつはplugins/gradle/libs に.gradle/wrapper/dists/gradle-1.6-bin/ZZ/gradle-1.6/libs のjarコピーしてやると確かにでなくはなるのね(StackoverFlow記載有
AS 0.1=>0.1.1plugin/android/lib の方にパッチがあたってるよう plugin/gradle/libのほうは変化無 ここらへんはAOSPのソース見たほうが早いんだろうな。。(変更点
//git clone -b tools_r22 https://android.googlesource.com/platform/tools/build
git clone https://android.googlesource.com/platform/tools/build
v0.4.1差分
@sos_jp ちなみに URL でも書きましたが v0.4.1 からallprojects{ version = '1.0' } がなくても動くようです
2013-05-30 17:20:33 via YoruFukurou to @sos_jp
v0.4.2差分
一応どーでもいいてきなメモ知識)
- gradlew自体のランタイムは
に展開されます。閉鎖環境でもにょる場合はここらへんを他端末に持っていくのも手かも
$HOME/.gradle/wrapper/dists
- build.gradle
buildscript { repositories { maven { url 'http://repo1.maven.org/maven2' } } dependencies { classpath 'com.android.tools.build:gradle:0.4' } }
と宣言されたものは
- $HOME/.gradle/caches
- $HOME/.gradle/caches/artifacts-XX/filestore にダウンロードされます。
artifacts-XX は一番新しいものを参照してください
実体的に
- $HOME/.gradle/cache/com.android.tools.build/gradle/jars/gradle-0.4.jar
等を見ていく認識で今回は問題ないでしょう。
JD-GUI等でざっと見た感じ proguardはかかっていないようです
ハック系の手助けにはなるかもしれません
repositories { mavenRepo urls: 'http://twitter4j.org/maven2' //twitter4j のmaven Repo } dependencies { compile "org.twitter4j:twitter4j-core:3.0.4-SNAPSHOT" //mavenからDLする記述 }
と宣言されたものは
- $HOME/.ivy2/cache
にダウンロードされます
maven系はNWが不調だとjarが不完全な形で生成されますので
不調の場合は一度削除して再実行するか、動いている環境から対象jarを上書き等で
環境を修復することができます
備考)
gradle maven pluginでuploadした場合には
urlを指定しない場合 => $HOME/.m2 にuploadされます。
その場合は
mavenLocal()
で参照可能です。
urlを指定してuploadした場合には
maven{ url: "<<uploadしたローカルのパス>>" }
となります。
世界的には依存ライブラリの管理をmavenでやるのが流行っているので
( G系で最も普及しているGrailsでも
inline pluginのような相対パスを指定する方法は残っていますが、将来的には廃止される予定のようです*2
個人開発的には便利なんですけどねー
終了だ!
http://twitter.com/kimukou2628/status/337225573816487937:twitter:detail:right
@kimukou2628 なるほど。しかしものの15時間前にリードから「見てみないと」的なメッセージが飛んでいるとは… ^^; 行方が気になりますね。
2013-05-23 00:45:34 via web to @kimukou2628
http://twitter.com/kimukou2628/status/337330890910859265:twitter:detail:right
@kimukou2628 ざっと見た感じだとaarが思った名前でできていないような感じですね。例えば:abs-debug.aarというように、頭に:がついている感じなのですが、そうなる原因や総合的な対策などを探っています。
2013-05-23 16:41:41 via web to @kimukou2628
@kimukou2628 また、aarの名前だけ合わせてもクラスパスに入らないようなので、このあたりを見ながら調査を進めたいと思います。 URL
2013-05-23 16:44:15 via web to @kimukou2628
http://twitter.com/kimukou2628/status/337479011821305857:twitter:detail:right
@kimukou2628 あとローカルjarを見る方法はありそうですね。 URL
2013-05-23 17:11:49 via web to @kimukou2628
http://twitter.com/kimukou2628/status/337487920753692672:twitter:detail:right
@kimukou2628 うーむ、aarはapklibではないようですよ?どうも改善形と言った感じのようですが… URL
2013-05-23 23:30:30 via web to @kimukou2628
http://twitter.com/kimukou2628/status/337579179954565122:twitter:detail:right
@kimukou2628 詳しく調べていくつもりですが、先程ちょっと見たところだと、ローカルライブラリを参照したい場合ローカルivyリポジトリを手っ取り早く作ってしまうという方法もあるとかなんとか。まあAndroid Libraryに通用するかどうかは未知数なので検証対象かと。
2013-05-23 23:45:36 via web to @kimukou2628
gradle-1.6/samples/ivypublish
辺りを読めば良さそう。@u1aryz さんのはmaven形式なだけで
上げ方が違うだけ
@kimukou2628 あと、テストケースにAndroidLibraryに関係するものがあるのですよ。それ見るとまあ多分Dependency経由で何かすれば良いのかな、と思うのですがgradle的にどう書けばいいのか探索中ですね。 URL
2013-05-23 23:49:31 via web to @kimukou2628
@kimukou2628 ディレクトリ構成を変えてなんとかできました。
2013-05-24 02:15:28 via web to @kimukou2628
@kimukou2628 とりあえずテストケースにならって:の使用を省いたこととバージョンを強制したくらいですが、AARの解析はartifactベースでやっているようなのでバージョンの強制が肝なのかな?と。 URL
2013-05-24 02:23:47 via web to @kimukou2628
詳細な仕組み的にはこういうお話らしい)
メモ。android-gradle-plugin 0.4はAARをartifactベースでしか見ないようだ。
2013-05-24 02:26:54 via web
続き。公式ドキュメントではappの下にlibraries/...とあるが、並列的に置きたければroot/{app,lib1,lib2}としてrootにsettings.*とbuild.*、各ディレクトリにbuild.*を置けば良い。0.4のmultiprojectのテストがそう。
2013-05-24 02:29:50 via web
続き。artifactベースでしか見ない…というのは、ローカルにライブラリを匿っておく場合にもバージョンをつけてやる必要があるような感じ。まだまだ調べる必要はありそうだが、:など変な文字が名前に混入したりしないようにシンプルな構成をとることも重要かもしれない、と。
[http://twitter.com/kimukou2628/status/337802464357134336:twitter:tree]
- gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy - platform/tools/build - Git at Google
git clone -b tools_r22 https://android.googlesource.com/platform/tools/build
IDEA plugin側もソースが公開されているよう
git clone https://android.googlesource.com/platform/tools/adt/idea
- リリースノートはgrittのやり取りログの方を見ましょうというお話が・・・
Tor によると、Android Studio は詳細な change log は作ってないけど URL (と 必要なら URL URL )見てねって言ってる
aarのフォーマットはzip形式の認識なんだけど、これの中身を参照する場合new File("abs-debug.aar!classes.jar") みたいな参照でいいんだっけ? うーん。解凍やjavaでリソース検索しないで対処したいorz
@kimukou2628 補足ですが、dependenciesにcompile project(':library')的なことを書いた時点でclasspathにaarが追加されるようでした。listタスクのようにすると確認できます。 URL
2013-05-24 10:45:05 via web to @kimukou2628
task list(dependsOn: configurations.compile) { println "classpath = ${configurations.compile.collect {File file -> file.getAbsolutePath()}}" }
ってこういう意味だったのか。。。人のコードはすごく勉強になります。ありがとうございます。
公式的な認知済み?遣り方っぽい方法の話)
とか読むと
@u1aryz さんが遣ってた方法が邪道ではなく海外でも一般認識っぽい・・・
[http://twitter.com/u1aryz/status/337011593143537664:twitter:tree]
http://twitter.com/kimukou2628/status/337013530375118848:twitter:detail:right
http://twitter.com/kimukou2628/status/337014427784192001:twitter:detail:right
@kimukou2628 私はここ見てますー URL
@kimukou2628 なんとなくそっちのが正しい気もしますね。私は邪道だと思いますが、mavenのローカルリポジトリに直接デプロイしてそれを参照する形にしたらAndroid Studioからもインストール出来ました。もう少し調べてみます(・∀・)
http://twitter.com/kimukou2628/status/337021931490537473:twitter:detail:right
@kimukou2628 Groovyとかよくわからんですw classes.jar以外は見えてるんですか?
- ライブラリプロジェクトをローカルのmavenリポジトリにデプロイするスクリプト(これはおそらく邪道である) · GitHub
- ActionBarSherlockのaarをローカルリポジトリにデプロイして使用するためのbuild.gradle · GitHub
@u1aryz さんから
githubをmavenRepoにする手法の話の情報をいただきましたのでメモ
よし、githubをmavenRepositoryとしてライブラリプロジェクト参照出来るの確認した
@kimukou2628 私もgh-pagesに簡単に上げる方法知りたいw 私は普通にコミットしましたw
@kimukou2628 gh-pagesにアップするにはJGitを使用すればいけるっぽいです。でもbuild.gradleが汚らしくなってしまったのでやめましたw
@kimukou2628 自分のbuild.gradleはgh-pagesのブランチにコミットしてプッシュするだけなんでそんなに面倒感はないんですよねー。 ここのページにわかりやすいのがありますよ。 URL
@kimukou2628 ブログ書き始めるの少し後になりそうなので、ひとまず、ライブラリプロジェクトをGradle対応したやつをお渡しします。URL
ありがとうありがとう URL
build.gradle で compile files('libs/android-support-v4.jar') だったものが compile 'com.android.support:support-v4:13.0.0' にできて libsは不要になる!いいね
@u1aryzさんに相談を載ってもらうことに。。
@u1aryz お忙しいところすみません。zakiさんが楽勝いってた構成が動かせないのですが、記述何か間違ってますでしょうか? URL
2013-05-31 15:58:33 via YoruFukurou to @u1aryz
@u1aryz 今後SDK Manager系のサポートライブラリ等がSDKの下のmavenRepoっぽい構成の位置に設置されるようになるようです。gradleを使う場合はこちらを指定しろってことらしいのですが直接この場所を mavenRepo にする記述がわからなくて。。。(汗
2013-05-31 16:11:52 via YoruFukurou to @u1aryz
http://twitter.com/u1aryz/status/340368914338947075:twitter:detail:right
@u1aryz 一度 [file://] 自体は試して(再確認して)いるのですが動かないですね(汗。昔の書き方の mavenRepo urls: XXX も駄目。。。 URL と同じはずなのですが。。。(汗
2013-05-31 17:04:21 via YoruFukurou to @u1aryz
@u1aryz 自分のところのANDROID_HOMEですね(この定義の仕方の場合は、gradle.properties に定義した値/Aplications/android-sdks が表示されます
2013-05-31 17:30:03 via YoruFukurou to @u1aryz
@u1aryz actionbarsherlock のフォルダの build.gradle => _build.gradle として buildscript辺のコメントを外して -b _build.gradle として動かした処動くみたいですね(汗。これ
2013-05-31 17:37:49 via YoruFukurou to @u1aryz
@u1aryz multiProjectだと Main側等の repositories{ } 宣言等とか干渉するって話なのかな‥‥。うわっ この構成で突っ走るの怖すぎです(汗
2013-05-31 17:39:12 via YoruFukurou to @u1aryz
@u1aryz さっきの記述だとABS側のbuild.gradleに記述してました(その時ListnerがどうこういうExcepitonが、、)。で本体側で abstest/build.gradle に宣言でそのエラーは出なくなりましたが 見つからないのは相変わらず。。。
2013-05-31 17:46:17 via YoruFukurou to @u1aryz
ここを指摘されてもしやallProjectsでいけるのでは?と試したら
いけました。大変感謝〜(ぺこり
@u1aryz 自己解決しました。multiProjectの場合は allprojects で全子プロジェクトにrepository参照を強制しないと駄目みたいですね。こんなの普通わかんねースよ>< URL
2013-05-31 17:57:13 via YoruFukurou to @u1aryz
@u1aryz いえいえ。相談載っていただいてすごく感謝です。一人だと絶対煮詰まっていたので凄く助かりました。ありがとうございます(ぺこり
2013-05-31 18:07:03 via YoruFukurou to @u1aryz
最終的には
AsAbstest/build.gradle at master · kimukou/AsAbstest · GitHub
話。。。
すごい時間かかった‥‥orz
maven力前提の話ってモヒモヒし過ぎだよ。。(汗
多分、日本のAndroid開発者としてかなり著名な
@zaki50 さんが「超簡単」とおっしゃってるのは
@u1aryz さん がちょっと上のほうでやってるように
mavenDeployerでLocalRepositoryに一度アップmavenLocal() で参照
なことだと思うんだけど、個人で毎回上げ直すのもな。。。(汗
しかもこれも素人には説明できんです〜><
ココらへんの話は実は
mavenAndroidSupport()
mavenGoogle()
でもまあ
IDEAとかがイイっていう時点で
- もうGoogleさんの開発者も熟練モヒカンの人しか居ない
- android maven project 形式でももういいでしょ?(eclipseイラネー
- maven とか gradleとか使いこなせて当然だよね
- fragment とか前から公開してる技術書いたことなんかありえないよな?
って認識でやってるなら、
初心者置いてきぼりにはなりそうな気はするんだけど。。
実際どうなんでしょうかね−(汗
追記)
id:craf さんのコメントにより
gradle android pluginのソースコード読んだら
下記な状況になってるのを把握しました。
- local.properties の'sdk.dir' or 'android.dir'(ANDROID_HOME) を検索
- 環境変数の System.getenv("ANDROID_HOME") or System.getProperty("android.home") を検索
の順にANDROID_HOMEの位置を検索して
=>
その位置情報に基づいて
File androidRepo = new File(mSdkLocation + "/extras/android/m2repository"); File googleRepo = new File(mSdkLocation + "/extras/google/m2repository"); repositories.add(new File(mPlatformRootFolder + "/prebuilts/sdk/m2repository"));
という形で android gradle plugin 内部で自動登録しているレポジトリが有という形
でも環境変数より local.propertiesが優先になってる って記載ありましたっけ?(汗
println System.properties['sdk.dir']
は事前に値確認はしてたんだけどnullだったので認識してないと思ってた(汗。
ここ普通気づかないよな。。
すごくハマりポイントになりそう・・
で、project.properties ももしかして自動読み込み?
proguard.config=XX
ってのも期待したけど、こっちは見つからなかったorz
ちょっと残念かなー(読んでくれれば eclipseとの共用環境の夢も少し広がったのに。。。
それとは別の意味で
subprojects や allprojects が情報上書きしてくれるのは確認したので
それはそれでmulti projectの構造としては勉強になった(ふむふむ