古い Android アプリを API Level 33 (Tiramisu) でビルドするまでにやったこと
背景
- 自分自身は、8年くらい前に Unity でアプリ開発に関わったことがある程度で、Android まわりにはあまり詳しくない。
- 諸々の事情で、とあるプロジェクトの Android アプリを API Level 30 → 33 まで上げる必要性がでてきた。
- プロジェクトの開発環境に関する情報が少なく、あまりあてにならない状況。
以前のアプリの状況
以下の環境でビルドしていた
- Android 11 (R) - API Level 30
- Android Studio 4.2.2
今の開発環境
- MacBook Pro (Apple Silicon)
- macOS: 13.6.3(22G436)
Android Studio のバージョンを Framingo | 2022.1 にした
どうせ、今後もバージョンアップがあるのを見越して「とりあえず最新版を入れる」という選択肢もあるが、現状のアプリが対応していたバージョンとの乖離が大きいと、その分だけ非互換に対応する作業も増える可能性が高くなるため、必要最小限のバージョンとして Framingo を選択した。
バージョンの決定は、以下のページの「Android API レベルをサポートするツールの最小バージョン」で、
API Level 33 をサポートしている最小バージョンが Flamingo であることから。
Source option 6 is no longer supported. Use 7 or later
というエラー
Project に含まれている Module の Source Compatibility / Target Compatibility の設定がなかったのが問題らしい。
File > Project Structure... を開き、 Modules > (対象モジュール) で、 Source Compatibility / Target Compatibility で 1.7 を選択した。
該当箇所の変更は build.gradle に反映された。
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
これもまた、1.7 より新しいバージョンでも良さそうだが、今は非互換の対応を最小限に抑えたいので1.7とした。
Installed Build Tools revision 33.0.2 is corrupted. Remove and install again using the SDK Manager.
というエラー
どうやら、 Android Gradle Plugin が古く、新しい Build-Tools (v33.0.2) に対応していないのが問題らしい。
関連リンク:
上記のページでは、 build-tools/(version)
の中の d8
というファイルを dx
という名前にコピーするかシンボリックリンクする、みたいな対処法が上位に上がっているが、根本的には Android Gradle Plugin を対応するバージョンまで引き上げるのが得策と思われる。
Project Structure を開き Android Gradle Plugin Version と Gradle Version を引き上げた
このバージョンとした理由は、Android API レベルをサポートするツールの最小バージョン に、以下の記述があったことから AGP 7.2 を選択したが Gradle のバージョンはそれ以上を選択する必要があった。
差分
Project Structure の変更は以下の差分となった
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.4'
+ classpath 'com.android.tools.build:gradle:7.2.2'
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
dx
や d8
って何?
Android ランタイム上で動作するバイナリコードを生成するコンパイラらしい。
dx
が古いほうのコンパイラで、その後継が d8
となった。という経緯らしい。
AGP のバージョンを上げると Gradle Sync でエラーが出る
発生したエラーは以下のとおり ( 一部改変 )
Unnecessarily replacing a task that does not exist is not supported. Use create() or register() directly instead. You attempted to replace a task named '(task name)', but there is no existing task with that name.
原因
利用している Gradle Plugin のいずれかが古い Gradle の API を利用していて、Gradle の新しいAPIに対応していないことが原因らしい。
対応
問題となっている Gradle Plugin のバージョンを現在の Gradle に対応したバージョンまで上げる。
今回は Gradle DeployGate Plugin の問題だった ( StackTrace にそれっぽい情報があった ) ので、そのバージョンを上げることでエラーが解消した。
同じ理由で Google Services Gradle Plugin もバージョンを上げた
Manifest の修正
<activity />
や <service />
に export
属性が必須になったらしい、以前なにも記述していなかったそらの箇所に export
の記述を追加した。