2019年6月6日木曜日

Android Studio くんご乱心

Android の業務アプリで、ちょっと見てくれってお願いされて、Android Studio を起動したんですわ。そしたら、デバッグができない。
あー、また gradle 地獄か?と、うんざりしながら、Android Studio 一式をアップデートしたんですわ。
原因もわかりました。
null オブジェクトを trim() してたんで、飛んでたんです。
該当箇所のライブラリをビルドして、実行しても、直らない。
???
???
???
え?なんで?
ビルドしたライブラリを見たら、出来てないんですわ。
目を凝らすと、app-release.aar とかいうものと、app-debug.aar というものが生成されてたんですわ。
また、Android Studio くんがご乱心されたんですわ。
はいはい、aar をリンクするように書き換えれば良いんですよね?
ライブラリのビルドプロジェクト14個全部書き換えて、それを利用してるプロジェクトも全部書き換えるんですよね?
やりましたとも…

さて実行をば…
突然のduplicate class error!!!!

はい、解決方法は
  //implementation fileTree(dir: '../../Ref/Java', include: 'hoge.jar')
  compileOnly fileTree(dir: '../../Ref/Java', include: 'hoge.jar')
implementation を compileOnly に書き換えれば、これらの jar ファイルが aar に含まれなくなります。
毎回毎回やってられるかー!
  ( ⌒ ) 
   l | / 
  ∧_∧ 
⊂(#・д・) 
 /   ノ∪ 
 しー-J |l| 
         人ペシッ!! 
       __ 
       \  \ 
          ̄ ̄ 
2019/08/26 追記: gradle のアップグレードに中途半端に失敗する場合がありまして、「Could not get unknown property 'assembleDebug' 」と怒られる事態に陥る事があります。 その場合、下記のように assembleDebug を assemble に変更する事で回避できます。
task cleanDebugJar {
    def classes = new File('build/outputs/aar/app-debug.aar')
    if( classes.exists() ) {
        delete '../../Ref/Java/foo.aar'
    }
}

task generateDebugJar(type: Copy, dependsOn: [cleanDebugJar,assemble] ) {
    //from 'build/intermediates/bundles/debug/'
    from 'build/outputs/aar/'
    into '../../Ref/Java/'
    include('app-release.aar')
    rename('app-release.aar', 'foo.aar')
}