個人開発Androidアプリのgradleのバージョンを2.3.1から3.1.2へのアップデート対応記録

個人学習がてらに公開しているAndroidアプリ TwitMorse のgradle3系対応を行ったのでその時の対応を記す。

今回は本格的なAndroid Studio 3系対応と、ライブラリ保守、サポートOSを最新に

以前リリースしたバージョンはgmsライブラリのクラッシュ対応。

その時はAndroid Studioを3系にアップデートしたものの、gradleのバージョンを2.3.3系のまま、Googleが公開している暫定対応手段を講じて、クラッシュ修正リリース。

今回は、

  • 最近AndroidStudioが安定してきた
  • そのためgradleのバージョンを最新の3系にアップデートしてビルドの安定化・技術標準追随
  • 利用しているライブラリのアップデートが必要なものがいくつかあったのでそれも合わせてbuild.gradleファイルの書き方に大きな変更があった
  • 2018年11月から常に最新のAndroidOSをサポートしなければならなくなった←これが一番大きい

参考資料:既に公開済みのアプリも2018年11月以降のアップデート時はAPIレベル26(Android8)対応が必須となります | telemarks

そんなわけで、四苦八苦しながら、忘却の彼方にあるAndroid開発の知識を思いだしながら保守対応をした。

主に大変だったところ

今回は2018年1月以来となるリリース。
浦島太郎状態のアプリの、ライブラリ群アップデート対応で苦しんだところを記す。

com.android.tools.build:gradle:2.3.3 -> 3.1.2 の対応

Android Studioが出してくれるサジェスチョンの通りにgradleバージョンをアップデートしていくと、かなりの頻度でソースファイルにcompileエラーが出るのはもう5年くらい前から付き合っているが、検索しながら一個一個潰す。

gradle plugin3系移行でやらなければいけないこと

仕事で開発している時は「ビルドフレーバー」とよく呼んでいた。
開発(debug)、リリース(release)、ステージング(staging)、本番(production)など、公開する環境によって利用する環境変数やライブラリを変えるのが主もな用途だった。今ではこれでアプリの外観の色分けとかもできるみたい。ABテストとかに活用もできるのではないかと思う。
時代は変わった・・・

productFlaversなぞ、こんな個人の趣味開発のアプリに今のところ?予定していないので、特に対応必要なし。
buildTypesだけ分けることとした。
releaseはどこかの段階で入っていたのか、もともとあった。とりあえず、今後を考えてdebugを分けておいた。

app/build.gradle

     buildTypes {
+        debug {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+        }
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

gradleファイル内のcompileをimplementationに書き換える & Oreo対応

下記の対応。これをやらないとAndroidStudioから、「compileは廃れたのでやめて!」と怒られ続け、いずれビルドできなくなるので対応が必要。

対応は

compile -> implementation

にするだけ。

build.gradle

dependencies {
     // Libraries
     ...
     ...
     ...
     // com.android.support
-    compile 'com.android.support:support-v4:25.4.0'
-    compile 'com.android.support:design:25.4.0'
-    compile 'com.android.support:appcompat-v7:25.4.0'
+    implementation 'com.android.support:support-v4:27.1.1'
+    implementation 'com.android.support:design:27.1.1'
+    implementation 'com.android.support:appcompat-v7:27.1.1'
     // androidbootstrap
-    compile 'com.beardedhen:androidbootstrap:1.2.3'
+    implementation 'com.beardedhen:androidbootstrap:1.2.3'
     // AppIndexing
-    compile 'com.google.firebase:firebase-appindexing:11.8.0'
-    compile 'com.google.firebase:firebase-core:11.8.0'
-    // [START gms_compile]
-    compile 'com.google.android.gms:play-services-analytics:11.8.0'
-    // [END gms_compile]'
+    implementation 'com.google.firebase:firebase-appindexing:15.0.1'
+    implementation 'com.google.firebase:firebase-core:15.0.2'
+    // [START gms_implementation]
+    implementation 'com.google.android.gms:play-services-analytics:15.0.2'
+    // [END gms_implementation]'
 }

そしてtargetSdkVersionを27(Android Oreo)に追随させる。

app/build.gradle

apply plugin: 'com.android.application'

 android {
-    compileSdkVersion 25
-    buildToolsVersion '26.0.2'
+    compileSdkVersion 27
+    buildToolsVersion '27.0.3'
     packagingOptions {
         exclude 'META-INF/NOTICE.txt'
android {
     defaultConfig {
         applicationId "jp.sub.takelab.twitmorus"
         minSdkVersion 21
-        targetSdkVersion 25
+        targetSdkVersion 27 // see : http://www.telemarks.co.jp/service/oreo.html
     }

そしてgradle2.3.3の状態でgms系の暫定対応を本格対応する。
Googleのmavenリポジトリの設定をgoogle()にまとめる。

app/build.gradle

 buildscript {
     repositories {
         jcenter()
-        maven {
-            url 'https://maven.google.com/'
-            name 'Google'
-        }
+        google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.3.3'
-        classpath 'com.google.gms:google-services:3.1.1'
+        classpath 'com.android.tools.build:gradle:3.1.2'
+        classpath 'com.google.gms:google-services:3.3.1'
     }
 }
 allprojects {
     repositories {
         jcenter()
-        maven {
-            url "https://maven.google.com" // Google's Maven repository
-        }
-        maven {
-            url 'https://maven.google.com/'
-            name 'Google'
-        }
+        google()
     }
 }

面倒なことに src/java配下のimportが軒並みimportエラーを起こした

何がおかしかったのか分からないが、com.android.support:designライブラリやその他諸々がjavaコード内のimportに反映されず、四苦八苦して3時間くらいとられた。

  • gradleまわりの変更を一度stashしてひとつずつ確認しながらソース反映
  • クリーン、ビルドを数回
  • AndroidStudioで必要なアップデートがあったので最新化を実施。
  • AndroidStudioの再起動

ちなみにgradle2系から3系への移行には不具合があるようなのでそちらの資料も参考にした。

既知の問題点: Android プラグイン 3.0.0 のアルファ版(3.0.0-alpha9 など)を使用している既存の Android Studio プロジェクトがある場合は、Android プラグイン 3.0.0-beta4 に移行して プロジェクトを同期する際に、次のエラーが発生する可能性があります。 Gradle project refresh failed.
この問題を修正するには、メニューバーで [Build] > [Clean Project] を選択します。この操作はプロジェクトごとに1回だけ必要です。その後は、メニューバーから [Sync Project]をクリックすると、Gradleでプロジェクトファイルを同期できます。

他、参考にした記事は以下
import android.support.design.widget.TabLayout; error
| stack over flow

試行錯誤の後、なんとかimportのエラーが治まった。
Fragment系のimportなどは参照がおかしくなっていたので、ビルドしてみて、エラーが出たら適宜修正。

そんなこんなで久々のAndroidStudioでしたが、

エミュレータ上でOreoでの動作確認もできたので、releaseビルド完了。


gradle3系に移行してみての感想

うむ、私はまた浦島太郎状態になっているようだ!

そろそろkotlin書き換えもやりたいんだけど、忙しくてなかなか時間が取れません。。。
ちなみに別アプリの方はkotlinでリメイク中です。

というわけでgradle2 -> 3系移行がとりあえず完了したので、久々のリリース作業です。
覚えているかなぁ。

TwitMorse 〜モールス信号でつぶやこう〜 | GooglePlay

参考資料

Android Studioを2.3から3.0へ移行する | qiita


コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください