ToolKitを使って10分以内にGMSアプリをG+H対応に変換できました

#概要
この前の記事では、既存のAndroidアプリをHMS対応に変換する方法の概要を紹介しました。
この記事ではHuaweiが提供しているコード自動変換ツール（ToolKit）を使ってGMSアプリをGMS、HMS両方の端末で動作できるアプリに変換するやり方を紹介したいと思います。

#ToolKitの紹介
まず、ToolKitの概要、原理を簡単に紹介したいと思います。
##ToolKitとは
ToolKitはAndroid Studioのプラグインツールであり、HMS開発の際のコーディングアシスタント、クラウドデバッグ、クラウドテスティングや自動コード変換などの機能があります。

[ToolKitの自動コード変換ツール（GitHubリンク）](https://github.com/HMS-Core/hms-toolkit-convertor
)は、元のアプリの中で使用されたGMSのAPIを検出してG+H対応に自動変換するツールで、KotlinとJava両方に対応しています。今回は自動コード変換ツール（Convertor）を使用して、既存のGMSアプリをG+H対応に変換してみましたのでそのやり方を共有したいと思います。

変換のコストは思ったより少なく、準備作業を除いたらわずか10分以内で変換できましたので興味のある方は自分で試してみてもいいですね。

##Convertor変換原理の概要

Convertorの原理について、[Huaweiのオフィシャルサイト](https://developer.huawei.com/consumer/en/doc/development/Tools-Guides/convertor-0000001050147221)ではこういう風に書かれています。

>・Add HMS API: Adds the xmsAdapter, an adapter code module, based on the original code for calling third-party APIs. The adapter code can call third-party APIs or HMS APIs based on the scheduling policy. The scheduling policy is determined by you. 
・To HMS API: Replaces the third-party API code in the app code with the to-be called HMS API code. The converted code directly calls the HMS APIs.

また、[このページ](https://developer.huawei.com/consumer/en/doc/development/Tools-Guides/appendix-0000001050061063#EN-US_TOPIC_0000001050061063__section9635103615532)にはさらに詳しい原理が書かれています。

変換ロジックを自分なりに理解して、イメージ図を作ってみました。真ん中が元のアプリで、左側がG+H変換後のアプリ、右側がG2H変換後のアプリになります。
G+HとG2Hについて前の記事で紹介したことがありますのでわからない方は[この記事](https://qiita.com/Kirin9000/items/4ccf3e2d2f8ad0bc169f)を参照してください。

![xmsconvertorlogic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/0b3aa7e5-b98f-9cfb-7225-e956998bd1cd.png)


G2H変換の場合は比較的に簡単で、Convertorはアプリ内のGMSのAPIとパッケージをすべて対応するHMSのものに差し替えます（上の図の「G2H変換後のアプリ」）。

G+Hの場合（「G+H変換後のアプリ」）はちょっと複雑で、Convertorを使って変換する際に、Convertorが元のアプリ内で使用したGMSのAPIに応じて新たなモジュール（xmsadaptor）を生成します（上の図の中の緑の部分）。そして、元のコード内で使用されたGMSのAPIはすべてXMSのAPIに変換されます。

あるAPIがコールされたとき、このxmsadaptorが端末のGMS/HMSの可用性を判定し、判定結果に応じて該当するGMS/HMSのSDKのAPIを使用する形になります。

#変換用デモアプリの説明
変換を試すために、GMSを使用した簡単なデモアプリを作成しました。
デモアプリでは、Google MapsとLocation SDKを使用し、アプリが起動されたらユーザーの現在地付近の地図が表示されます。
![onlyg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/3f4b5bf5-b6d4-c061-1743-04ef899a4d3d.jpeg)

変換前アプリをHMS端末にインストールすると、このようにGoogle Play開発者サービスが使えないというダイアログが表示されます。
![onlyh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/8e40b2cc-210d-81ab-9632-bb11449171bc.jpeg)


変換前アプリは一応GitHubにあげました。興味のある方は直接これを使って変換してみてくださいー
（ご自身のGoogle Cloud Platformで発行されたGoogle Maps API用のAPIキーが必要です）
GitHub: https://github.com/vptsama/GHDemo_BeforeConversion

#準備
実際の変換をする前に、まずはHMSのMap SDK&Location SDKとToolKitを使用するための前準備をする必要があります。

##準備その１：HMS MapとLocation SDKを使用するための設定

###ステップ１：Huawei開発者アカウントの取得（無料）
HMSのSDKを使用するには、Huawei開発者アカウントを取得する必要があります。
アカウントの申請には主に以下の2つのステップがあります。

1. Huawei IDの取得
2. 開発者認証

2の開発者認証では、個人開発者認証と法人開発者認証の2つの選択肢がありますが、私は個人アカウントで認証し、審査はだいたい1日で終わりました。また、ただで申請できるところがありがたいですね。

詳しいガイドは以下のサイト（英語）を参照してください。
Huawei ID申請ガイド：https://developer.huawei.com/consumer/en/doc/10104
開発者認証（個人の場合）：https://developer.huawei.com/consumer/en/doc/10122

###ステップ２：Appgallery Connectにてアプリプロジェクトの作成、情報設定
[AppGallery Connect（リンク）](https://developer.huawei.com/consumer/en/console)はHuaweiの開発者コンソールです。
![コンソール内](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/05fa81c3-4470-f05f-0ca6-f1f7a20c398e.png)

Googleと同じように、HMSのSDKを使用するにはまずはコンソールでいろいろ設定をする必要があります。

だいたいな流れは以下のようになります。
<dl>
  <dt>1. アプリプロジェクの作成</dt>
  <dd>上の図の「My apps」に入って次の画面の右上にある「New app」より作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/2b5e36a1-dec1-b89e-cbf0-366772506075.png)
</dd>
  <dt>2. プロジェクト詳細設定ページで署名情報を登録</dt>
  <dd>ページの左上に「My apps」が表示されていますが、そこから「My projects」を選択してプロジェクトの詳細情報入力ページに入ります。General informationページでの「App information」のところにアプリの署名情報を登録できます。</dd>
  <dt>3. 使用したいAPIを有効化</dt>
  <dd>つぎに、ページ上部の「Manage APIs」を選択し、使用したいAPIのスイッチをオンにします。![Manage API](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/5d2cbfdf-84e2-5b56-1577-88c42d628869.png)
　<dt>4. agconnect-services.jsonファイルをプロジェクトに追加</dt>
  <dd>以上の設定がすべて終わったら、最後にコンフィグファイル（agconnect-services.json）をプロジェクトに導入する必要があります。General informationページでの「App information」のところにagconnect-services.jsonをダウンロードできるボタンがありますので、それをクリックしてダウンロードできます。最後にダウンロードしたファイルをapp root directoryにコピーして設定を完了させます。
</dd>
</dl>

詳しいガイドは以下のサイト（英語）を参照してください。
アプリ情報設定ガイド：https://developer.huawei.com/consumer/en/doc/development/HMS-Guides/hms-map-configuringinagc

##準備その２：ToolKitのインストール
ToolKitは直接Android Studioでインストールできます。
File > Settings > Plugins > MarketplaceでHMSを検索したら出てきますので簡単にインストールすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/b10bca1f-0377-d495-211a-378e4dc0c912.png)

詳しいガイドは以下のサイト（英語）を参照してください。
ToolKitインストールガイド：https://developer.huawei.com/consumer/en/doc/development/Tools-Guides/installation-0000001050145206

#変換のながれ
ここから実際の変換にはいります。

##変換開始
まずは、Android Studioで変換したいプロジェクトを開き、ツールバーの「HMS」よりConvertor→New Conversionで変換を開始できます。New Conversionをクリックしたら次の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/7f14a68b-1ec0-f7a3-98c3-d36b6ba3df7f.png)

ここでバックアップのディレクトリーを選択して「Next」をクリックします。

##スキャン結果と変換ソリューションの選択
「Next」をクリックしたらスキャンが始まり、しばらくしたら結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/569775fd-542a-9c66-0c06-ff663b22dc7e.png)

スキャン結果を見ると、現在のファイルではどれぐらいのGMSのAPIを使用しているのか、そして自動で変換可能なAPI数が表示されていることが分かります。今回の場合、100%のGMS APIが自動でHMSに変換できます（Auto Rate: 100%）。

最後に、変換のソリューション（Add HMSかTo HMS）を選択して「Analyze」をクリックすると分析が始まります。今回は、Add HMS API(GMS API First)を選択しました。これを選択すると、GMSが使えるかどうかを優先的に判定し、GMSが使える場合はGMSを使い、GMSが使えない場合はHMSを使うように変換されます。

##変換操作
分析が終わったら、操作方法が記載されてた「README.md」ファイルが最初に表示されます。そして、分析の結果が下部に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/ce9b7075-2ab3-721e-952d-c864b526015e.png)

分析結果を見ると、プロジェクト中のすべてのGMSに依頼しているところが表示されていることが分かります。

###gradleファイルの改修
コードを変換する前に、まずはgradleファイルを変換する必要があります。
Fileフィルタでbuild.gradleを指定して、条目右端の空欄にチェックを入れて「Convert」をクリックするとHMSのrepositoriesやdependenciesが自動的追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/0168ea4b-41cd-3cb2-f7f3-e9e5d283a2bd.png)

次に、同じような感じてapp/build.gradleを選択してdependenciesなどを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/d5cf6061-a97a-725e-1f76-1cd07d7f67f2.png)

赤字のところは自動変換できないところとなりますので、Descriptionに書かれた指示に従って手動で修正する必要があります。

最後に、フィルタをsetting.gradleにして、自動変換を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/af27775d-0f7c-05d1-d5a1-ca3099ddef45.png)

gradleファイルの変換が完了したら一度プロジェクトをSyncします。

###コードの変換
Syncが終わったら、コードの変換を実行します。
FileフィルタをAllにして、gradle以外の条目にすべてチェックを入れて変換を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/fff6b5f4-607d-a6b8-322b-63cc908cf7bc.png)

これで、プロジェクトの変換はすべて完了となります。

詳しいガイドは以下のサイト（英語）を参照してください。
Convertorガイド：https://developer.huawei.com/consumer/en/doc/development/Tools-Guides/convertor-0000001050147221

#変換後のアプリの動作確認
変換後のアプリをHMS、GMS端末両方にインストールしてみました。
GMS端末で開いた場合は元のアプリと同じく、Google Mapが表示されます。
![gmsmap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/356c27b2-7f92-da1f-5067-5f7bb064d823.jpeg)

HMS端末で開いた場合は正しくHuawei Mapが表示されるようになりました。
![hmsmap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674503/0f99a933-5760-0e23-9a12-6ded414dbc3a.jpeg)

このように、ToolKitのConvertorを使用すれば、既存のAndroidアプリを意外と簡単にHMS対応に変換できます。

また、気になる変換前後のAPKのサイズなんですが、
変換前：2.4MB
変換後：3.9MB
になります。2つのSDK（Map, Location）を対応して1.5MBぐらいしか増加していないのでG+H対応によるサイズの増加も許容範囲内であるかと思います。

変換後のアプリもGitHubにあげましたので変換後のコードを見たい方は直接こちらを参照してください。
（Huawei Mapを表示させるためには「準備その1」で書いた作業をご自身で行う必要があります）
GitHub: https://github.com/vptsama/GHDemo_AfterConversion

#おわりに
Huaweiは世界2番目に多い出荷台数を誇るスマートフォンメーカーで、ヨーロッパでは約20%の市場シェアを持つほか、特に中国では約50%の市場シェアをもっています。ですので、アプリの海外進出を考えているのであれば、アプリをHMS対応にしてAppGalleryに登録するのが避けられない時代になってきているかと思います。
実際の変換も、このToolKitを使用すればかなり時短で終わらせることができますので、皆さんも現在のアプリをHMS対応にしてAppGalleryにリリースし、ユーザー数を拡大させながらグローバル中のHuaweiユーザーに自分のアプリを配信してみませんか？