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

build不具合対処ネタ(gradle編)

はじめに

何度がググって、良く忘れてる対処メモあたりの話。

StackOverFlowで解決策まで載って無くて、試行錯誤で時間よくムダにするんだよなー(汗


local.aarを参照する話

に絡む話

まあこういうパターンもよくあるけど

OSSは作者の方のモチベーションで解決されているから途中で飽きてしまうのは仕方ないのかもなー

G様が推奨している方法

これASからIDEで local.aarを参照導入時に自動生成されるものと同じもの

コレのデメリットは、libraryProjectが1個増えてしまうこと

  • nend-sdk/build.gradle
configurations.maybeCreate("default")
artifacts.add("default", file('nend-sdk-3.2.2.aar'))
  • app/build.gradle or libP/build.gradle
dependencies{
    compile (project(':nend-sdk')){
        exclude group: 'com.android.support'
        exclude group: 'com.google.android.gms'
    }
}

なにが問題になるの?

  • library projectが増える
    • build時間ふえる
    • instant runが不安定になる

で減らせるなら減らしてね?

といわれるわけです。。

でググってでてきた情報

  • app/buid.gradle
apply plugin: 'com.android.application'

repositories{
     flatDir{
          dirs 'libs_aar'
     }
}

dependencies {
   compile(name:'nend-sdk-3.2.2', ext:'aar')
}

jarでもイケるらしいです

apply plugin: 'com.android.application'

repositories{
     flatDir{
          dirs 'libs'
     }
}

dependencies {
   compile(name:'myjar-1.0-SNAPSHOT') //省略するとjarを探すらしい
}

何時もは下記ですしね・・・

dependencies {
    compile files('libs/mnist-tools.jar') //★ AS推奨方法らしい<ProjectStructureで補正される書き方>
    compile fileTree(dir: 'libs', include: '*.jar')
} 

でググってでてきた情報で対処した方法

dependencies {
   compile(name:'nend-sdk-3.2.2', ext:'aar',{
        exclude group: 'com.android.support'
        exclude group: 'com.google.android.gms'
   })
}

で問題ないようです。

で本来遣りたかったlibrary projectで試す

  • DSLはエラーが出ない
  • ビルド時にライブラリ参照エラーが出て動きません*1
    • flatDirの指定方法自体が認識しない

apply plugin: ‘com.android.library’

Interface DependencyHandler のため、口はあるけど実体の対応がないようです。

うーん。library project側が更新されてないみたいだからなー。仕方ないのかも。

library project plugin の最終更新あたりの対応が、下記らへんで最終っぽいからな・・

  • libp/build.gradle
apply plugin: 'com.android.library'

android{
    defaultPublishConfig "debug"//★
    publishNonDefault true
}


dependencies {
    //★の指定がない時
    compile project(path: ':libP', configuration: 'debug')

    //★の指定がある時
    compile project(':libP')
}

でもまあぶっちゃけた話

https://docs.gradle.org/current/userguide/java_library_plugin.html

あたりの compileOnly とか出来るかとか試している方が居て

使えなくて爆死してるのTLで見てたりするんですが

apply plugin: 'com.android.application'
apply plugin: 'com.android.library'

あたりが、(最新のかどうかも含め?)java pluginとか継承してるの確認してからでないと意味が無い気がする。

G様ぐらいのパワー開発者集団ならbase pluginあたりから全部自前ゴリゴリできそうだしな・・


Uncaught translation SimException: dx.rop.cst.CstInterfaceMethodRef cannot be cast to com.android.dx.rop.cst.CstMethodRef (Proguard)

これ dependenciesの 同名クラスで関数の有無の差分とかある場合に発生。

でも解決策は特に記載なし。

これ依存するライブラリのバージョンが違うとでる

  • google play services のバージョン とか
  • suppor library とか
MainP
   |
   |--- google play service
   |           |
   |           |--- com.android.support //△
   |
   |--- com.android.support
   |
   |--- XXX.aar
              |
              |--- google play service 
              |           |
              |           |--- com.android.support//★
              |
              |--- com.android.support

△と★のバージョン不一致

gradlew :app:dependencies

で調べるとわかったりする話なんですが・・

  • exclude宣言で頑張れるか
    • うまく行かず
    • 直下参照のsupport-library程度ならOK
    • その中のさらなるdependenciesには制限かけられない

結局本体側の google play services バージョンを、

共通ライブラリaarを作っている方にお知らせして作り直してもらいました

色々と厳しいな・・と思いつつ*2


TLメモ(gradle)

gradleで面白い事をためそうしていた方が居たのでメモ。

確かにAS重いんで、VSCodeで開発できるならそれでしたいのは正直ある

つい最近のReactNative熱とかってそこら辺もあるんじゃないかなーとか思ったりも

TLメモ(java)

*1:同梱されない

*2:検証に半日程度無駄にしました・・