com.android.support.* の dependencies のバージョンが揃わない件

直感的に分かりかねる(分からない)のが「com.android.support.*」の内部的な依存関係.

今や, 下位互換の compat が本流となり, support やら v7 やら v4 やら複雑すぎて.

ふと, RecyclerView のバグらしく.

it is fixed internally, so in the next release it should be fine.

Issue 230295 - android - RecyclerView 25.1.0 StaggeredGridLayoutManager GapWorker prefetch FC with full-span items - Android Open Source Project - Issue Tracker - Google Project Hosting

なので, やむなくバージョンを 25.1.0 から 25.0.1 に下げる.

すると, AndroidStudio が build.gradle の該当行を色変化で「新バージョンがあるよ」と教えてくるが無視.

ところが, 入れ替わってないようで, 同様の Exception.

java.lang.IllegalArgumentException: Pixel distance must be non-negative

プロジェクト自体 clean しても rebuild しても変化なしで

「バージョンがコンフリクト」

と言われまくる.

解決法

ResolutionStrategy で強制.
ResolutionStrategy - Gradle DSL Version 3.3


configurations.all {
  resolutionStrategy {
    force "com.android.support:support-v4:$rootProject.supportLibraryVersion"
    force "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
    force "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
    force "com.android.support:support-compat:$rootProject.supportLibraryVersion"
    force "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
    force "com.android.support:design:$rootProject.supportLibraryVersion"
    force "com.android.support:cardview-v7:$rootProject.supportLibraryVersion"
    force "com.android.support:percent:$rootProject.supportLibraryVersion"
  }
}

外部ライブラリからの依存があるようで, androidDependencies に頼りながらシコシコ強制.

25.1.0 が remove されたのはビルド時ログで確認できたが.

グループとかツリーの根本からの指定とかあるのではないかと思いつつ朝.

android-apt が不要となった ButterKnife


新しくなった Gradle Tips and Recipes : 各ソースセットの配置の確認

新しくなってます, Gradle Tips and Recipes .

Gradle Tips and Recipes | Android Studio

Gradle が利用するディレクトリ

それぞれ指定できるのはなんとなく知っていたが.


android {
  ...
  sourceSets {
    main {
      java.srcDirs = ['other/java']
    ....

これらの記述無し無指定のデフォルトの場合はどのディレクトリが利用対象になっているのか.

ドキュメントやツールスクリプトなど,

Git に登録して管理はしたいが, アプリ自体に影響ない位置はどこなのか??

と思っていましたが.

Configure Build Variants | Android Studio

右上 [Gradle] タブから以下ダブルクリックで実行.

MyApplication > Tasks > android > sourceSets

Gradle が認識している対象ディレクトリ群が Gradle Console に出力される.


------------------------------------------------------------
Project :app
------------------------------------------------------------

...

debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]

これで, AndroidStudio でファイルを操作しながらの Git 管理しても安心です.

他にもあれこれ小技がのっていますよ, このレシピ.


あやしい Project Structure ダイアログを Experimental にしてライブラリ更新を正しく把握する

「かんたんにGUI上で編集する」という考え方なのだろうと思いますが, 今や設定項目の多さや複雑さに対応できているのか疑問に思うダイアログの「Project Structure」.

実行時の挙動が問題ない場合, 設定ファイル自体を直接GUIに対応するように修正する, というのもなんともおかしな話で.

一方, 利用しているライブラリの最新のバージョンを確認したいときはどうしたらいいのか.

Settings > Editor > Inspections > "Newer Library Versions Available"

サード・パーティのライブラリに関してはチェックしていない? の変化なし.

Experimental な機能を使う

Preferences > Build.. > Gradle > Experimental

そして, Project Structure を開くと, ライブラリ同士の依存関係を見ることができたり,

JCenter を利用したライブラリのバージョン確認もできます.

昔は, フツーにチェックしてくれたように思うが, いつからこうなった?