読者です 読者をやめる 読者になる 読者になる

android gradle plugin(v04) の構造のお話のメモ

android gradle IDEA AS

情報整理エントリ
一応メモ途中)

自分が作った構成

  1. ASメイン構成
    1. GitHub - kimukou/AsAbstest
  2. ecメイン構成
    1. https://github.com/kimukou/ecAbstest

@ さんに検証してもらってできた構成

  1. ASメイン構成から
    1. GitHub - taky/AsAbstest



AOSP のソースの位置メモ>

git clone https://android.googlesource.com/platform/tools/build
git clone https://android.googlesource.com/platform/tools/adt/idea

ただ読み解くにはIDEA Pluginの構造理解とかも必要かもしれない

らへんぽいんだけど
ちょくに落とすにはどうすればいいんだろう?

git clone https://android.googlesource.com/platform/sdk/

だとデカそう(汗



自己検証メモ>

IDEA Plugin側)

git clone https://android.googlesource.com/platform/tools/adt/idea

http://twitter.com/alterakey/status/340105449946898436:twitter:detail:right

  • これはAS v0.1だとDLに失敗したと判定すると繰り返すっぽい挙動
  • 0.1.1では直ってる & ./gradlew レベルでは起きない

android gradle plugin側)*1

//git clone -b tools_r22 https://android.googlesource.com/platform/tools/build
git clone https://android.googlesource.com/platform/tools/build


v0.4.1差分

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/337198544538714112:twitter:detail:right
http://twitter.com/kimukou2628/status/337225573816487937:twitter:detail:right

http://twitter.com/kimukou2628/status/337329449227915264:twitter:detail:right
http://twitter.com/kimukou2628/status/337330890910859265:twitter:detail:right

http://twitter.com/kimukou2628/status/337479011821305857:twitter:detail:right

http://twitter.com/kimukou2628/status/337487920753692672:twitter:detail:right

http://twitter.com/kimukou2628/status/337579179954565122:twitter:detail:right

 ココらへんの話は
  gradle-1.6/samples/ivypublish
 辺りを読めば良さそう。@ さんのはmaven形式なだけで
 上げ方が違うだけ

http://twitter.com/kimukou2628/status/337701972369108992:twitter:detail:right

詳細な仕組み的にはこういうお話らしい)

ここらへんは maven絡みの知識なので、知識の幅というか懐が広いわ。。。(汗

[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のやり取りログの方を見ましょうというお話が・・・



task list(dependsOn: configurations.compile) {
     println "classpath = ${configurations.compile.collect {File file -> file.getAbsolutePath()}}"
}

ってこういう意味だったのか。。。人のコードはすごく勉強になります。ありがとうございます。




公式的な認知済み?遣り方っぽい方法の話)

とか読むと
@ さんが遣ってた方法が邪道ではなく海外でも一般認識っぽい・・・

[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

http://twitter.com/kimukou2628/status/337016673775259648:twitter:detail:right
http://twitter.com/kimukou2628/status/337021003584659456:twitter:detail:right
http://twitter.com/kimukou2628/status/337021931490537473:twitter:detail:right
http://twitter.com/kimukou2628/status/337026988365709312:twitter:detail:right


@ さんから
githubをmavenRepoにする手法の話の情報をいただきましたのでメモ

http://twitter.com/kimukou2628/status/338294830377607168:twitter:detail:right
http://twitter.com/kimukou2628/status/338545648922144768:twitter:detail:right

これ id:bluepapa32 さんのブログだ‥‥ブクマしてたけど忘れてたよ。。(汗




@さんに相談を載ってもらうことに。。

http://twitter.com/u1aryz/status/340363191290843136:twitter:detail:right
http://twitter.com/u1aryz/status/340365548036685824:twitter:detail:right
http://twitter.com/u1aryz/status/340368914338947075:twitter:detail:right
http://twitter.com/u1aryz/status/340383229754368000:twitter:detail:right
http://twitter.com/u1aryz/status/340387540097986561:twitter:detail:right
ここを指摘されてもしやallProjectsでいけるのでは?と試したら
いけました。大変感謝〜(ぺこり

最終的には
AsAbstest/build.gradle at master · kimukou/AsAbstest · GitHub
話。。。
すごい時間かかった‥‥orz
maven力前提の話ってモヒモヒし過ぎだよ。。(汗

多分、日本のAndroid開発者としてかなり著名な
@ さんが「超簡単」とおっしゃってるのは
@ さん がちょっと上のほうでやってるように

  1. mavenDeployerでLocalRepositoryに一度アップ
  2. mavenLocal() で参照

なことだと思うんだけど、個人で毎回上げ直すのもな。。。(汗
しかもこれも素人には説明できんです〜><

ココらへんの話は実は


mavenAndroidSupport()
mavenGoogle()
とかの元になるやつですよ。or mavenCentral() に入りますよ
そのうちこのような指定作りますよ。今は我慢してね
って話にならないと初心者お断り状態orz


でもまあ
IDEAとかがイイっていう時点で

  • もうGoogleさんの開発者も熟練モヒカンの人しか居ない
  • android maven project 形式でももういいでしょ?(eclipseイラネー
  • maven とか gradleとか使いこなせて当然だよね
  • fragment とか前から公開してる技術書いたことなんかありえないよな?

って認識でやってるなら、
初心者置いてきぼりにはなりそうな気はするんだけど。。

実際どうなんでしょうかね−(汗


追記)
id:craf さんのコメントにより

gradle android pluginのソースコード読んだら
下記な状況になってるのを把握しました。

  1. local.properties の'sdk.dir' or 'android.dir'(ANDROID_HOME) を検索
  2. 環境変数の 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の構造としては勉強になった(ふむふむ

*1:-b つけると [git pull] で最新版持ってこないみたい??

*2:griffonでは既に廃止済み