結構しんどいAndroid Support Library依存関係

はじめに

support library 25.X 系で クリティカルにハマったので備忘録としてメモ

  • 現象としては
    • ビルドが通るのに実行時にクラッシュする

下記みたいな指定を書いてしまった場合

  • app/build.gradle
android {
    compileSdkVersion '25'//◎
    buildToolsVersion "25.0.2"
    
    defaultConfig {
        applicationId "com.hoge.hogeapp"
        minSdkVersion 14
        targetSdkVersion 25//◎
        versionCode 1
        versionName "1.0"
    }    
}   

dependencies{
    compile ('com.google.android.gms:play-services:8.4.+'){
        exclude group: 'com.android.support'
    }
    compile 'com.android.support:support-v4:23..+.'//★
    compile 'com.android.support:recyclerview-v7:23.+' //★
    compile 'com.android.support:cardview-v7:23.+' //★
    compile 'com.android.support:design:23.+'//★
}
  • ◎と★が、ASのbuild.gradle用のlintにより、赤字表示されてウザい
  • ★ を 25.+ に修正

ビルドは通る。

  • 実行時に内部で関数参照できなくて実行時クラッシュ
    • ContextCompat.getColor(Context context,int resid) が無くなってる?
    • ContextCompat.getColor(Context context,int resid,int themeId) に変更?

公式Doc見る限りそんな関数ないので、これ ResouceCompat.getColor の方ではないか?

とか思ったりもするのですが、詳細がわからず・・*1

なんで25とか指定するの

最新のOS対応(Android 7対応とか)するために◎の指定をASのIDE赤字ワーニング表示で強いられるから

本来なら

  • compileSdkVersion でコンパイル通せばいい だけだと思うんだけど
  • 関数により targetSdkVersion も上げないと、なぜか実行されない関数も有る*2

なんでクラッシュするの?

  • どのバージョンのsupportライブラリから 追加された/廃止された の情報がないから*3
  • 未だにsupport-v4とか「after API level 4 in a backwards compatible」の記載のままだし*4
  • 特に suppot-library系って ソースのdiff 情報って有りましたっけ?
    • git diffとかでOS差分見るしかないのかな〜(汗

なんでGoogle Play Services を10.0.1とか最新使わないのさ

  • まずリリースノートがないのが不安
    • 当たり障りのない、現在地取得するぐらいなら問題ないんだけど・・・
  • low levelに近い関数を使っているといつ廃止されるかヒヤヒヤ
  • 公式の関数説明document*5が常に最新のものしかないか、逆に下手するとメンテされてないものがそのままだったりする
  • compileSdkVersion x targetSdkVersion x GooglePlayServices のversion で動作挙動のバリエーションが発生してる気が正直する*6
    • 通常のActivityとかの利用ではなく、IntentService/Service等で利用するとかあたり

一番無難な対応

  • 下記のコマンドで元々のライブラリ依存状態をチェック(メインモジュール名を :app とした時)
gradlew :app:dependencies

html出力するなら

gradlew :app:lint
// app/build/outputs/lint-results.html に出力

GPS 8.4なら 23.X系。したがって 23.X系で最新化する

lintOptions{ 
        //== 旧Lint系はココらへんの記述でOKな話がよく ==
        checkReleaseBuilds false
        abortOnError false

        //== 新規Lint系は明示的に指定しないと無効にならない ==
    disable 'GradleCompatible' 
    disable 'InnerclassSeparator' 
} 

でも問題なのは、「最新のこれ対応したぜ〜/変更したぜ〜」しか書いてない ので

あたりとか旧来の情報も探す必要があるということ。

なんか情報が五月雨で出てくるので正直すごく困る・・

そもそも、lintの新規定義基準がなんか違う気がするのは気の所為?

ビルド/コンパイル通って動作に問題ないなら、新規追加しないで欲しい奴とか結構ある*7


suppor-library 使用している雑感

随時追加するかもしれない・・

Chrome Custom Tabs

compile 'com.android.support:customtabs:25.+'

の指定 + プリフェッチ対応で

  • shareのソースをコピーして利用

まではいい。だけどこれやると、

すごい作りっぱ臭がプンプンなんですが。。ブラックボックスはいいんだけどさ。。

SwitchCompat

これはどちらかと言うとAppCompat関係なのかもしれないのですが

compile 'com.android.support:appcompat-v7:25.+'
  • android-switch-backport とかの2系対応してくれるようなサードパーティライブラリ
    • sytle干渉をよく起こして、ビルドが通らなくなる
  • Switchの方に存在する Widget.Holo.Light.CompoundButton.Switch みたいな四角スタイルのSwitchが標準では使えない
    • かなりCustom Style 記述をゴリゴリ書かないとダメ
    • 標準は ==◎ なボタンの一択*9

特にStyle定義に関してはよくわかんない・・

とか色々と読んでるんですけどね・・

今回クラッシュの原因とかになったと思われる

  • ContextCompat.getColor
  • ResouceCompat.getColor
  • ResouceCompat.getDrawable

あたりって 下記の対応をする為みたいなthemeId対応だったりすると思われるんだけど、

あんまり対応してるアプリって見たことないよな・・・

qiita.com

theme関係の公式解説docとかが少ないからなのかな・・

theme関係情報追記

qiita.com


google play services 使用している雑感

AdMob

firebase経由とgms経由で挙動が違う

モジュールが違うといえばそれまでなんだけど、わけわからず。

とくに今1クリック30円キャンペーンとかやってるそうで被害は増大気味かもな。。

compile 'com.google.firebase:firebase-ads:8.4.0'

compile 'com.google.android.gms:play-services-ads:8.4.0'

他社の広告SDK

Nend SDK

3.3.0で support-library 25.1.X 系のUI部品のスタイルを使っているため、ビルドが通らなくなりますた。

ココのsdk 何故か dependenciesでみると常に最新のlibraryでビルドしてるのよね・・

リリース直前にビルドが通らなくなるのはやめてください><(泣きます

3.2.2までは下記の記述で通ってたのにな・・(遠い目

  • app/build.gradle
dependencies{
    compile ('net.nend.android:nend-sdk:3.2.2'){
        exclude group: 'com.android.support'
        exclude group: 'com.google.android.gms'
    }
}

まず、aarの提供元が分からず探すところから

で、結局コミット履歴から追うことに・・。でaarバイナリを落としてくると

  • nend-sdk-3.2.2.aar をサーチしてDownload github.com

  • nend-sdk/build.gradle

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

なんだかね・・。広告入れるだけでも一苦労ですよ(汗

*1:たまに起こるlocal repositoryの誤バイナリ配布ケース?

*2:data-bindingの双方向とかもそうだけど、この手の情報がstackoverflowとかG様開発者ブログとかしかないのはすごく困る

*3:release noteにも<これ新規対応したぜ。すげーだろ>しか書いてない

*4:minsdk 9とかsupport libraryのrelease noteにチョロっと書いてるだけだしな。。開発優先なのかもしれないのですけど・・

*5:あれjavadocか?

*6:どれか上げるだけでよくわかんないException吐き始めたりするし

*7: UsesMinSdkAttributes とか・・

*8:エラーすら出ない

*9:その割にはOSの表示依存が有るからSwitchよりSwitchCompatを使いましょう的な記載が未だにあるという・・・