Eclipse+ADT（build:Maven2）で作ったAndroidアプリをAndroid Studio（build:gradle）に移行した記録

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# 今までの開発環境
* DELL XPS 13
* Windows 10 Home
* Intel Core-i7
* メモリ 8GB
* SSD 256GB
* Eclipse 4.5（だったかな？）
* ADT最新版

# やること
* 開発環境をEclipse+ADT → <font color="blue">Android Studio</font>へ移行
* ビルド環境をMaven2 → <font color="blue">gradle</font>へ移行

# 何故やるか？
* AdMobの広告ポリシー違反で広告を止められ、広告収入がゼロになった
* 推定2年放置してたが、再審査の改修が必要なので、開発環境をMacに移行する
* せっかくなので、モダンな開発環境にしたい

# 移行するアプリ
* [バスくる for 東急バス](https://play.google.com/store/apps/details?id=org.buskuru.tokyu&hl=ja)（※改修放置してたらBANされました・2020/09/07現在）
* [バスくる for 小田急バス](https://play.google.com/store/apps/details?id=org.buskuru.odakyu&hl=ja)

# どんなアプリか？
* バス接近情報をスクレイピングして、スマホで通知する
* バス時刻表を表示する

# 環境を移行する
### 今までの開発環境
<img width="486" alt="スクリーンショット 2020-06-15 3.15.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/c07dcd20-366d-55b5-b90b-3beaaebf0f33.png">
Windows環境はBootcampに作ってるけど、Bootcamp起動するの面倒なので、Bitbucketのスクショにて。

### Eclipse+ADTをAndroid Studioでインポートする
ほほう、Eclipse+ADTインポートできるみたい！
<img width="779" alt="スクリーンショット 2020-06-15 3.20.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/aa28951d-5613-d936-94d2-bf1713a9b3c7.png">

インポートしてみた。

<img width="491" alt="スクリーンショット 2020-06-15 3.18.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/6a4b65fc-8467-3efc-7894-7bd661840c39.png">

あれ？、、、ソースは！？

うーむ、、、無理か、、、手動で移行するしか術がないな。。。

### Eclipse環境をAndroid Studioに手動で移行する
<img width="899" alt="スクリーンショット 2020-06-15 3.32.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/975e948b-13c2-34d9-4c21-a8403f3b1868.png">
何か、テンプレート沢山ある！？
とりあえず「基本アクティビティ」で新規プロジェクトを作ってみる。
<img width="491" alt="スクリーンショット 2020-06-15 3.30.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/9d745f84-9d53-a222-b813-7386c9e0e597.png">

ここに旧環境のソースを手動で移動してみる。

<img width="575" alt="スクリーンショット 2020-07-04 18.48.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/13201100-9d6c-621d-8e7b-f79f7c2fd52c.png">

コンパイルエラーは「Google Play Service」と「org.apache.http.〜」が無いから。
あと、「AndroidManifest.xml」で、幾つかエラー出てる。
それ以外は大丈夫そう。

# コンパイルエラー修正
### Google Play Serviceの導入
メニューの「ツール」→「SDK マネージャー」を開いて、「Google Play services」をインストール。
<img width="771" alt="スクリーンショット 2020-07-04 19.09.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/41e1081e-1332-1ebb-c30b-5cf826f568c0.png">

build.gradle（app直下）に追加。

```gradle:app/build.gradle
dependencies {
    implementation 'com.google.android.gms:play-services:+'
}
```

※参考
[Google Play Services SDK のセットアップ(Android Studio)](https://qiita.com/ryo0301/items/e2722f0a8d5528d0f257)

### org.apache.http対応

build.gradle（app直下）に追加。

```gradle:app/build.gradle
android {
    ・・・
    useLibrary "org.apache.http.legacy"

    defaultConfig {
```

※参考
[【Android Studio】「パッケージorg.apache.http.clientは存在しません」が発生した時の対処法](https://cpoint-lab.co.jp/article/201803/1850/)

コンパイルエラーが消えた！
<img width="546" alt="スクリーンショット 2020-07-04 19.30.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/8cfab4ae-3c85-116b-5012-4f424326373e.png">

# AndroidManifest.xmlのエラー修正

```terminal
ERROR: The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
```

AndroidManifest.xmlのversionCode、versionName、minSdkVersion、targetSdkVersionは、build.gradle（app直下）へ移動する。

```xml:app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
		android:versionCode="24"
		android:versionName="1.2.7">

	<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" />
```

targetSdkVersionを26以上にしろと怒られたので、28 に変更。

```gradle:app/build.gradle
defaultConfig {
    minSdkVersion 9
    targetSdkVersion 28
    versionCode 24
    versionName "1.2.7"
}
```

※参考
[僕たちはいつまでこんな楽しいAndroid Studio設定をし続けるのか？ Android Studio 3.x時代の設定不足解消メモ](https://qiita.com/riversun/items/78353cb2b3a8c7aa97a5)

あと3箇所がエラーになってる。

```terminal
<uses-permission android:name="android.permission.READ_LOGS" />
<application android:debuggable="false">
<activity android:screenOrientation="portrait">
```

### android.permission.READ_LOGSのエラー
```terminal
Permission is only granted to system apps
```
Android Studioの設定を変更。
<img width="1015" alt="スクリーンショット 2020-07-04 21.39.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/7ddde5ff-d683-9231-9315-436a3dc1fe89.png">

※参考
[[Android]Permission is only granted to system apps](https://blog.integrityworks.co.jp/2017/12/20/android-permission-is-only-granted-to-system-apps/)

### android:debuggable="false"のエラー
```
Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one
```

**昔はandroid:debuggable="true"フラグをつけないとDebug実行ができませんでしたが、SDKのバージョンアップ（SDKr8, 2010.12）で自動的に付くようになったのでdebuggableフラグの指定は不要になりました。**

との事なので、「android:debuggable="false"」を削除。

※参考
[android:debuggableでデバッグログ切り替えはやめた方がいい](http://greety.sakura.ne.jp/redo/2012/05/do-not-use-debuggable-in-manifest.html)

### android:screenOrientation="portrait"のエラー

```terminal
Expecting android:screenOrientation="unspecified" or "fullSensor" for this activity so user can use the application in any orientation and provide a great experience on Chrome OS devices
```

縦向き固定はダメらしい。
applicationタグに「tools:ignore="LockedOrientationActivity"」を追加したが警告は消えなかったので、デフォルトの「unspecified」を設定。

※参考
[Expecting android:screenOrientation=“unspecified”...の対処法](https://qiita.com/Capotasto/items/d8e67ab505a7cab9ab73)

# build.gradleのエラー修正

build.gradle（app直下）でエラー

```gradle:app/build.gradle
dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
}
```

build.gradle（プロジェクト直下）にGoogle Mavenリポジトリを追加。

```gradle:build.gradle
buildscript {
    repositories {
        ・・・
        maven {
            url 'https://maven.google.com/'
        }
    }
    ・・・
}

allprojects {
    repositories {
        ・・・
        maven {
            url 'https://maven.google.com/'
        }
    }
}
```

build.gradle（app直下）に、support-v4、animated-vector-drawable、mediarouter-v7を追加。

```gradle:app/build.gradle
dependencies {
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:animated-vector-drawable:28.0.0'
    implementation 'com.android.support:mediarouter-v7:28.0.0'
}
```

※参考
[解決に失敗しました：com.Android.support:appcompat-v7:28.0](https://www.it-swarm.dev/ja/android/%E8%A7%A3%E6%B1%BA%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%9Acomandroidsupportappcompatv7280/806145941/)
[All com.android.support libraries must use the exact same version specification](https://stackoverflow.com/questions/42374151/all-com-android-support-libraries-must-use-the-exact-same-version-specification)

# ビルドエラー修正

```terminal
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:extractDeepLinksDebug'.
> org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 途中でファイルの末尾に達しました。
```

上記ビルドエラーの原因が分からず2日間ハマる、SAXだからXMLなんだろうけども。。。
以前の環境がWindowsの為、改行コードがCRLFだったのでLFに修正、でもエラー消えず。。。
BOM付きUTF-8！？、、、かと思ったが違った。。。
関係ないだろうけど、旧ビルドファイル（Maven、Ant）など不要ファイルを削除、もちろんエラー消えず。。。

res配下の未使用ディレクトリを削除してみた。
<img width="546" alt="スクリーンショット 2020-07-05 13.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/e3d9547f-61b2-a5a3-6dd4-75e6e3ec1287.png">

おっ、別のエラー出た！？
res配下に空ディレクトリを置いちゃダメらしい。

```terminal
Manifest merger failed : uses-sdk:minSdkVersion 9 cannot be smaller than version 14 declared in library [com.google.android.gms:play-services:12.0.1] /Users/satoshi/.gradle/caches/transforms-2/files-2.1/dd50b5c4da9d853295d7932aef6bc7b9/play-services-12.0.1/AndroidManifest.xml as the library might be using APIs not available in 9
	Suggestion: use a compatible library with a minSdk of at most 9,
		or increase this project's minSdk version to at least 14,
		or use tools:overrideLibrary="com.google.android.gms.play_services" to force usage (may lead to runtime failures)
```

minSdkVersionを14にしろという事らしいので、build.gradle（app直下）を修正。

```gradle:app/build.gradle
defaultConfig {
    minSdkVersion 14
    ・・・
}
```

新たなビルドエラー。

```terminal
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeDexDebug'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
     The number of method references in a .dex file cannot exceed 64K.
```

build.gradle（app直下）を修正。

```gradle:app/build.gradle
defaultConfig {
    ・・・
    multiDexEnabled true
}
```

※参考
[【Flutter】エラー解決: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:](https://qiita.com/tetsukick/items/25d42ce3281291e5946a)

<img width="495" alt="スクリーンショット 2020-07-05 13.21.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/cfcea3a3-b08f-192f-de0a-9167d2710421.png">

### **<font color="blue">やったー！！</font>**

# 実行する

メニューの「ツール」→「ADV マネージャー」を開いて、仮想デバイスを作成して実行する。
<img width="269" alt="スクリーンショット 2020-07-05 23.21.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/80f31dd5-6b0b-48b7-d512-ae210465d74b.png">

実行したらエラー、、、うーむ。。。

```terminal
PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT
```

Java8をインストールして、環境変数を設定する。

```terminal
$ vim ~/.bash_profile
★点線内を追記
---
export JAVA_HOME=/usr/bin/javac
export ANDROID_HOME=/Users/xxx/Library/Android/sdk
export ANDROID_SDK_ROOT=/Users/xxx/Library/Android/sdk
export ANDROID_AVD_HOME=/Users/xxx/.android/avd
---
:wq
$ source ~/.bash_profile
```

※参考
[Mac OS X にJDK 1.8をインストール](https://qiita.com/jun68ykt/items/3432f44e9635581f3621)
[How to install ANDROID_SDK_ROOT on Mac OS?](https://stackoverflow.com/questions/59288003/how-to-install-android-sdk-root-on-mac-os)

<img width="1920" alt="スクリーンショット 2020-07-06 1.23.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/6abc707a-b48f-88d4-274b-b9d853e22e77.png">

### **<font color="blue">キタコレ！！</font>**

以上で開発環境は完成〜、さて広告違反の改修をするかな。