結構しんどい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が赤字ワーニング表示で強いられるから
本来なら
なんでクラッシュするの?
- どのバージョンの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系で最新化する
- lint制御を追加してでエラーワーニングを消す
- IDE上からやる場合には
- Preferences > Editor > Inspections あたりのチェックを外す
lintOptions{ //== 旧Lint系はココらへんの記述でOKな話がよく == checkReleaseBuilds false abortOnError false //== 新規Lint系は明示的に指定しないと無効にならない == disable 'GradleCompatible' disable 'InnerclassSeparator' disable 'MissingTranslation' //翻訳がないとき // config.xml とかでurl定義しているやつもしつこく出るので・・・ }
でも問題なのは、「最新のこれ対応したぜ〜/変更したぜ〜」しか書いてない ので
あたりとか旧来の情報も探す必要があるということ。
なんか情報が五月雨で出てくるので正直すごく困る・・
そもそも、lintの新規定義基準がなんか違う気がするのは気の所為?
ビルド/コンパイル通って動作に問題ないなら、新規追加しないで欲しい奴とか結構ある*7
suppor-library 使用している雑感
随時追加するかもしれない・・
Chrome Custom Tabs
compile 'com.android.support:customtabs:25.+'
の指定 + プリフェッチ対応で
- shareのソースをコピーして利用
まではいい。だけどこれやると、
- setCloseButtonIconの関数が何故か動かなくなる
- もちろん CustomTabsIntent | Android Developers の指定はしている
- そもそも Material icons - Material Design の画像しか、プリフェッチ使わないで標準で対応しても、まともに適応されないよね?*8
すごい作りっぱ臭がプンプンなんですが。。ブラックボックスはいいんだけどさ。。
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対応だったりすると思われるんだけど、
あんまり対応してるアプリって見たことないよな・・・
theme関係の公式解説docとかが少ないからなのかな・・
theme関係情報追記
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
nend のandroid sdkがひどい、、
— close_yutori (@kimukou2628) 2017年2月7日
3.2.2でコンパイル出来てて、別環境でビルドできない
=>3.3.0のAARしかない(何でふるいの消すの?)
=>これ指定するとビルドエラー
古いaar をダウンロードできないので詰まった
イマココ
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にチョロっと書いてるだけだしな。。開発優先なのかもしれないのですけど・・
*6:どれか上げるだけでよくわかんないException吐き始めたりするし
*7: UsesMinSdkAttributes とか・・
*8:エラーすら出ない
*9:その割にはOSの表示依存が有るからSwitchよりSwitchCompatを使いましょう的な記載が未だにあるという・・・