Androidの開発環境は当初はEclipse+ADTプラグインだったが、現在はGoogle公式の開発環境はAndroid Studioになっており、ADTの更新は2015年末で終了している。Andoroid Studioに乗り換える必要を感じていたものの、NDKの移植がうまくいかないために、延び延びになっていた。
ところがGoogle さんからの一通のメールでAndroid Studioに移行せざるを得なくなった。
Android 向け Google Mobile Ads SDK の 6.4.1 以前のバージョンは、2016 年 9 月 15 日をもってサポートを終了させていただきます。
2016 年 9 月 15 日以降も引き続き広告を配信していただくには、Google Mobile Ads SDK を 7.0.0 以降のバージョンにアップグレードしてください。
SDK をアップグレードするには、Play 開発者サービスの最新バージョン(バージョンは dependencies セクションで確認)を Gradle Build 設定ファイルに追加してください。次の例では v9.0 を追加しています。apply plugin: 'com.android.application'
...
dependencies {
compile 'com.google.android.gms:play-services:9.0.2'
}
うーん、そうですか。EBPocket Freeも読書尚友 FreeもGoogle Mobile Ads SDK 6.4.1なので、バージョンアップしないと9/15以降広告収入が途絶えることになる。世の中の流れとしてAndroid Studio用以外の開発情報が少なくなっているので、この機会にAndroid Studioに乗り換えることにした。この作業が予想以上に大変だったので、忘備録として書いておくことにする。
1. Eclipseのプロジェクトのインポート
Android Studioには既存のEclipseのプロジェクトをインポートする機能があり、"Import project(Eclipse ADT,Gradle,etc.)"を実行するだけで簡単に取り込める。100% Javaの読書尚友はこれだけでOK。問題はNDKを使用しているEBPocketである。
2. NDKのコンパイルをAndroid.mkで行う
Android Studioは1.3からNDKをサポートするようになったが、色々不完全でGradleのバージョン毎に設定方法が変わったりしている。jni/ディレクトリにC/C++言語のソースを入れておけばAndroid.mkは不要でコンパイルしてくれることになっているが、これが曲者でどうしてもNDKのコンパイルが通らない。既存のAndroid.mkでNDKをコンパイルする方法を探したところ、次のページを見つけた。
Android StudioでNDKを使ったビルドをする
ほぼこのページの説明通りで、既存のAndroid.mkでコンパイルできるようになった。Cソース内のデバックができるかどうか不明だが、とりあえずAndroid Studioへの移行に成功。
3. com.google.android.gms:play-servicesの導入
続いてGoogle Mobile Ads SDKのバージョンを6.4.1から最新版の9.2.1にしてみる。
- app/libs/GoogleAdMobAdsSdk-6.4.1.jar を削除する
- build.gradleに追加
build.gradle
defaultConfig { ... minSdkVersion 9 // 9以上 ... } dependencies { ... // compile files('libs/GoogleAdMobAdsSdk-6.4.1.jar') compile 'com.google.android.gms:play-services-ads:9.2.1' }
AndroidManifest.xml
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <!-- <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" /> --> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
main_pager.xml
【変更前】 xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" 【変更後】 xmlns:ads="http://schemas.android.com/apk/res-auto" 【変更前】 <com.google.ads.AdView android:id="@+id/adView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" ads:adSize="SMART_BANNER" ads:adUnitId="....." ads:loadAdOnCreate="true" /> 【変更後】 <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" ads:adSize="SMART_BANNER" ads:adUnitId="....." />
com.google.android.gms.ads.AdViewではada:loadAdOnCreateがなくなってJava内でloadAdしないといけなくなったので、onCreate()に記述を追加。
AdView adView = (AdView) this.findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest);
Android Studio を使い始めると、Eclipseより便利なところも不便なところも両方あるが、なにしろGoogleの開発速度が異様に速いので、問題点は急速に解決されることだろう。継続的なサポートのためには、なるべくAndroid Studioに移行することが望ましい。
Android Studio2.1になってエミュレータの速度が向上して実機以上の速度で動くようになった。これだけでも非常に開発が捗るというものだ。
今回のはまりどころ:play-services はモジュール単位で使うべし!
冒頭のGoogleのメールに記載された例では、
compile 'com.google.android.gms:play-services:9.0.2'
のようにcom.google.android.gms:play-services を丸ごと指定しているが、この方法はお勧めできない。
Androidはアプリ内で定義しているメソッド数(依存ライブラリも含む)が65k(65536)を超えると、ビルドできなくなる問題があり、play-servicesには大量のメソッドを含んでいるために、簡単に65kの制限を超えてしまう。その場合はMultidexにするか、使用するメソッド数を65k未満に収めないといけない。
MultidexはAPI14以上でないとサポートされないという別の問題があるので、できればメソッド数を65k未満に抑えたほうがいい。
実はgms:play-servicesはモジュール化されており、必要なモジュールだけ選択すれば、65k未満に抑えることができる。
今回のようにadsモジュールだけ使用したい場合は、次のように記述する。
compile 'com.google.android.gms:play-services-ads:9.2.1'
Multidex化する方法
API14以上しかサポートしないからMultidexでいいよ、という場合は、次のようにするとMultidex化できる。
(バージョンは適宜変えてください)
build.gradle:
buildToolsVersion "23.0.2" ... defaultConfig { ... minSdkVersion 14 // 14以上 ... // Enabling multidex support. multiDexEnabled true } dependencies { compile 'com.android.support:multidex:1.0.0' }
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <application ... android:name="android.support.multidex.MultiDexApplication"> </application>
Android Studioのheapサイズ不足でAPKが作れないと言われた場合は、gradle.propertiesに次の記述を追加
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m