Cordova プラグインの設定について - Android 編

Monaca で Cordova プラグインを組み込む場合、`Zip`、 `URL`、`パッケージ名` で組み込むことができます。

Cordova プラグインを `URL`、`パッケージ名` で組み込む場合、バージョン指定をしない場合は、ビルド時に最新版の Cordova プラグインが組み込まれます。

そのため、対象の Cordova プラグインのバージョンが更新されている場合は、前回ビルドした際に組み込まれた Cordova プラグインとは異なるバージョンのものが組み込まれるため、ビルドが失敗したり、ビルドが成功しても正常にアプリが動作しない場合があります。

また、Cordova プラグインが更新されていない場合でも、設定ファイルの内容によって、ビルド時に異なるバージョンのフレームワークが組み込まれる場合があるため、このような場合もビルドが失敗したり、ビルドが成功しても正常にアプリが動作しない場合があります。


# plugin.xml

Cordova プラグインの設定は、通常 `plugin.xml` に設定されています。

下記は、[cordova-admob-pro](https://github.com/floatinghotpot/cordova-admob-pro) プラグインの plugin.xml の抜粋です。

```xml:plugin.xml
<?xml version="1.0" encoding="UTF-8"?>

<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        xmlns:android="http://schemas.android.com/apk/res/android"
        id="cordova-plugin-admobpro"
        version="2.31.6">
      
    <name>AdMob Plugin Pro</name>

    <dependency id="cordova-plugin-extension" />

    <!-- android, now build with gradle instead of ant -->
    <platform name="android">
        <config-file target="AndroidManifest.xml" parent="/manifest/application">
            <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
                      android:name="com.google.android.gms.ads.AdActivity"
                      android:theme="@android:style/Theme.Translucent" />
          </config-file>
        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.INTERNET"/>
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
          </config-file>
          
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="AdMob">
                <param name="android-package" value="com.rjfun.cordova.admob.AdMobPlugin"/>
                <param name="onload" value="true" />
            </feature>
        </config-file>
        <source-file src="src/android/AdMobMediation.java" target-dir="src/com/rjfun/cordova/admob" />
        <source-file src="src/android/AdMobPlugin.java" target-dir="src/com/rjfun/cordova/admob" />

        <!-- cordova CLI using gradle and it working well -->
        <framework src="com.google.android.gms:play-services-ads:+" />
        <!-- but unfortunately, build.phonegap.com, Intel XDK, and some other tools still use ant -->
        <!-- dependency id="cordova-plugin-googleplayservices"/ -->
     </platform>
</plugin>
```

# framework タグ

`framework` タグでは、Cordova プラグインで利用するフレームワークを指定します。

Androidの場合、この `framework` タグでバージョンが指定されています。

```xml:例1
<framework src="com.google.android.gms:play-services-ads:+" />
```

```xml:例2
<framework src="com.android.support:support-v4:26.+"/>
```

上の例のように、バージョン指定に `+` が指定されている場合は、ビルド時に最新版のフレームワークが組み込まれます。

新しいフレームワークが公開された場合は、前回のビルド時に組み込まれたバージョンと異なるバージョンのフレームワークが組み込まれるため、ビルドが失敗したり、ビルドが成功しても正常にアプリが動作しない場合があります。

また、下の例のように `gradle` ファイルにフレームワークの指定が行われている場合もあります。

この `gradle` ファイルに指定されているフレームワークのバージョンが `+` 指定されている場合も、同様の動きになります。

```xml:例3
<framework src="sample.gradle" custom="true" type="gradleReference"/>
```

```gradle:sample.gradle例
dependencies {
    implementation 'com.android.support:support-v4:+'
}
```

# dependency タグ

Cordova プラグインでは、指定した Cordova プラグインだけではなく、他の Cordova プラグインに依存している場合があります。

他の Cordova プラグインに依存している場合は、`dependency` タグが指定されています。

```xml:例
<dependency id="cordova-plugin-extension" />
```

この `dependency` タグで指定されている Cordova プラグインもビルド時に一緒に組み込まれます。

依存先の Cordova プラグインで指定されている `framework` タグの設定によっても、ビルドが失敗したり、ビルドが成功しても正常にアプリが動作しない場合があります。


# バージョンを指定する

`framework` タグのバージョンに `+` が設定されていることによってビルドが失敗したり、ビルドが成功しても正常にアプリが動作しない場合は、下の例のようにバージョンを指定することで、動作するようになる場合があります。

対象の Cordova プラグインをダウンロードして、設定を変更した Cordova プラグインを `Zip` ファイルにすることで、Monaca にインポートすることができます。

```xml:例
<framework src="com.google.android.gms:play-services-ads:11.6.2" />
```

元の設定を変更しているため、必ずしも正常に動作するとは限りません。
設定を変更して使用する場合は、自己責任で行ってください。


# おわりに

Android の場合、新しいバージョンの OS の公開や、Android Studio の新しいバージョンの公開のタイミングで、フレームワークのバージョンが更新される傾向にあります。

これまで利用できていた Cordova プラグインが利用できなくなった場合は、`framework` タグや `dependency` タグを確認し、バージョン指定に `+` が設定されていないか確認してみてください。