スマホアプリ開発レッスン中の出来事です。
①新規プロジェクト作成
②デフォルトApp(HelloWorld)を実行
③ビルドエラー(タイトルの文言)
皆さんこんにちは。アザラシステムでは「Java教えます」のような内容を絞り込んだレッスンは行っておらず、やりたいことを伺った上で最適なプランを提案しています。
先日、その「やりたいこと」を伺うと趣味としてスマホアプリを簡単なものでいいから作ってみたいという方にお会いしました。私自身はスマホアプリ開発者ではありませんが、良さげな入門書を探すところから一緒にやってみましょう!ということでレッスンを行いました。
生徒さんのお手元の実機がAndroidOSのスマホでしたので定番のAndroidStudioによる開発(Java言語)の入門書の中から一番良さそうに思えた以下の書籍に沿って進めることに。
環境構築1つ取っても、書いてある通りに設定してください。という入門書が多い中、各種設定の意味やなぜそうする必要があるのか、また環境差異やちょっとした見落としによって陥りやすいエラーについて他の書籍ではわざわざ言及しないような場面まで配慮がされており、良書と感じました。
ただ・・・この手の技術書の宿命で発売から1年も経つと、内容通りに進めてたのにうまく動かない(´∀`;)といった問題からは逃れられません。
書籍内容と同様のバージョンをインストールしても、リポジトリ(参照先)のアドレスが変わっていたり、様々な要因からまったく同じ動作は期待できず、多少の読み替えは必要が生じるものです。
私も生徒さんと一緒に書かれた通りに進め、最初のプロジェクトを実行してみると・・・
さて、エラー文章の冒頭【The minCompileSdk (32) specified】にて検索してみました。
The minCompileSdk (31) specified に関する記事がいくつか出てきます(2022年10月時点)HITした記事上ではエラーメッセージ内のSDKバージョンの数値が31となっていますが、いずれもプロジェクト作成後、起動(ビルド)時に発生していることから同一の原因による事象であると推察します。
対処法を案内している日本語の記事は数件あるものの「対応したSDKを追加インストールすればOK、なぜこうなるのかはよくわからない。」のような内容が多く、きちんと掘り下げてみようというのがこの記事の趣旨です。
環境構成を把握しよう
まず今回は2021年4月に発行された「Androidアプリ開発の教科書 第2版 Java対応」の内容通りにVer4.1.2を導入し環境構築を行っていますが、やはり一部は差異が生じました。
■AndroidStudio4.1.2(Win-64bit版)
■SDK Platforms
●Android 11.0(R)
・Android SDK Platform 30
・Sources for Android 30
・Google APIs Intel x86 Atom System Image
■SDK Tools
●Android SDK Build-Tools(※1)
・30.0.3
・Android Emulator(※2)
・Android SDK Platform-Tools(※2)
・Intel x86 Emulator Accelerator(HAXM installer)(※2)
(※1)書籍では”Android SDK Build-Tools”と記載されていますが、2022年10月時点では”Android SDK Build-Tools 33″となっていました。ただし、その中で細かいバージョン指定が可能で書籍同様の30.0.3が存在したためそちらを選択。(※2)に関しては書籍とは異なるバージョンしか選択の余地がありませんでした。このようにAndroidStudio本体は書籍同様の4.1.2をインストールしていますが、追加コンポーネントに関してはある程度の割り切りが必要な状態でした。
エラーメッセージを読み解こう
エラーの英文に拒否反応を起こす初学者は多いですが、Googleのガバガバ翻訳でも何となく意図は伝わるのではないでしょうか?読めなければ翻訳してみましょう。
■エラー原文
The minCompileSdk (32) specified in a
dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
is greater than this module's compileSdkVersion (android-30).
Dependency: androidx.appcompat:appcompat-resources:1.5.1.
■Google翻訳
で指定された minCompileSdk (32)
依存関係の AAR メタデータ (META-INF/com/android/build/gradle/aar-metadata.properties)
このモジュールの compileSdkVersion (android-30) より大きいです。
依存関係: androidx.appcompat:appcompat-resources:1.5.1。
依存関係という言葉はLinuxに触れている方はよく目にするのではないでしょうか。Aというパッケージを導入するにはBが必要です。といった関係性を指します。このエラーはつまり、
SDK30を指定してっけど”androidx.appcompat:appcompat-resources:1.5.1″とやらが少なくともSDK32以降でないと動かないンだわ。
このような意味合いでしょう。
解決策を考えよう
①SDKのバージョンを32以降にアップする
②”androidx.appcompat:appcompat-resources:1.5.1″をバージョンダウンする
インターネット上の検索結果では①を勧める記事が大半でした。しかしながら購入した書籍通りに進めたい場合はもちろん、実務であっても顧客と合意したバージョン内で開発を完結させたいというのはあるあるです。なにより書籍のサンプルプログラムはSDK30が最新だった時代のものですから、SDK30で動くはずです。
生徒さんと②の解決策を試みることにしました。
そもそも、”androidx.appcompat:appcompat-resources”なんて指定した覚えがありません。プロジェクト生成時にデフォルトで生成された設定ファイルにSDKバージョン30では動かないような記述がなされているのでしょう。設定ファイルは以下です。
33行目に”implementation ‘androidx.appcompat:appcompat:1.5.1′”と犯人っぽい記述が。こやつのバージョンを下げてみるとして、適当に1.0.0とか打つのではなく存在するバージョンを指定すべきです。そのため”androidx.appcompat:appcompat”を以下の公式リファレンスで確認します。
https://developer.android.com/jetpack/androidx/releases/appcompat?hl=ja
今回、参考にしている書籍は2021年4月12日、初版発行とあります。その直前のバージョンにしてみましょう。2021年3月24日にバージョン1.3.0-rc01があります。しかしrcとかbetaとか書かれたものではなく安定版を採用したいところです。2021年4月12日以前となると2020年8月5日のバージョン1.2.0が良さげ。build.gradle33行の記載を”implementation ‘androidx.appcompat:appcompat:1.2.0′”に書き換えた上で改めて実行してみましょう。
残念ながら別のエラーが発生しました。しかしこれまでのエラーが解消され、ビルドが先に進んだ証拠でもあります。根気強く潰していきましょう。
後続エラーを解消しよう
先程のエラーを見ると”android:color/system_neutral1_1000″とやらが見つからないと書かれています。そしてそれは”~前半PATH省略\material-1.6.1\res\values-v31\values-v31.xml:3:5″というxmlファイルに記載されている参照ファイルのようです。こちらもbuild.gradleの34行目に”implementation ‘com.google.android.material:material:1.6.1′“なんて思いっきり書かれていますね。
参照先がandroidxではなくcom.googleとなっています。恐らくgoogleのリポジトリなのでしょう。それらしきページを発見しました。以下のページを見るにmaterialの1.6.1のリリースはMay 31, 2022とあります。SDKバージョン30のリリース日より後ですから、これもバージョンダウンの必要がありそうです。
https://mvnrepository.com/artifact/com.google.android.material/material?repo=google
参考書籍の初版発行日以前の安定版となるとFeb 05, 2021リリースとあるバージョン1.3.0が良さそうです。build.gradle34行の記載を”implementation ‘com.google.android.material:material:1.3.0′”に書き換えて実行してみましょう。
結論(解決策だけ知りたい人はここだけ読んでください)
■事象
意図的に古いバージョンのSDKをインストールした環境(当blogの例ではVer30)にもかかわらず、build.gradle(module:モジュール名.app)のdependencies{}内に記載される参照先がインストールしたSDKより新しいバージョンでないと動作しないために The minCompileSdk (32) specified in a dependency’s AAR metadata~ (最低でもVer32以上にしろ!)というエラーが発生した。
■解決策
①エラーに記載されたバージョンのSDKに切り替える
②build.gradle(module:モジュール名.app)に記載された参照先のバージョンを下げる
①はシンプルですが、意図的に古いバージョンのSDKを導入したのには理由があるかと思います。そのためSDKのバージョンは変えたくないという方のため②の解決策についてご説明します。
build.gradle(module:モジュール名.app)を開き、記載を以下のように変更してください。
implementation ‘androidx.appcompat:appcompat:1.5.1’を1.2.0へ、implementation ‘com.google.android.material:material:1.6.1’を1.3.0へ書き換えることで解消される(SDK30の場合)
SDKバージョンが私のケースと違う方でも、同様のエラーの場合はSDKリリース時期を調べ、依存性のあるパッケージ群がその時期より後にリリースされたものである場合、SDKのリリース時期以前の安定版を指定することで解消されるのではないかと思います。
■原因(予想)
SDK Platformsで指定したバージョンと合致するものが必ずしもSDK Toolsのインストール一覧上に存在するわけではなく、そこはもう仕方がないと妥協してインストールを行ったのが原因でしょう。
SDKマネージャに古い項目を表示させる設定を知っている方であれば、そもそもこの事象の回避が可能のようにも思えます。それが一番スマートでしょう。私がスマホアプリ開発者であればそこまで調べる価値ありですが、業務システム開発・運用現場のSEですし、この辺りでご容赦を・・・。
環境起因と思わしきエラーに遭遇した際に、エラーメッセージと向き合い、原因をしっかり調査すれば割と何とかなります
コメント