AndroidStudioでAndroid2.2対応アプリにAdMob/GooglePlayServicesを組み込む方法

(2014/8/1 追記)
どうやら Google Play Services を組み込んだアプリは APIレベル9(Android 2.3) 以上にする必要があるようです。

<img src="http://i.gyazo.com/2ef48ab0bd66cb0d2103ee7dfc4c030f.png">

この記事の意味が・・・ｗ

#背景
周知のとおり、2014/8/1からGoogle Playストアの広告IDに関するポリシーが変わり、旧AdMobのSDKや新広告IDを利用しないアプリは新規登録やアップデートができなくなります。

https://support.google.com/googleplay/android-developer/answer/6048248

>2014 年 8 月 1 日から Google Play デベロッパー プログラム ポリシーでは、Play ストアにアップロードされるすべてのアップデートと新着アプリに、広告を目的とした広告 ID（端末で利用可能な場合）を他の端末 ID の代わりに使用することが定められています。デベロッパーはアプリ使用のポリシーだけでなくすべての Play ポリシーに自分のアプリが準拠するよう責任を負う必要があります。
>
>新しいポリシーが有効になると、広告 ID 以外の永続 ID を使用しているアプリは、サイトオーナーのサイトまたはアカウントの登録時に使用したメールアドレス経由でポリシー違反の警告が通知されます。警告を受け取った場合は、公開済み APK がデベロッパー プログラム ポリシーの広告 ID 関連ガイダンスに準拠していることを確認する必要があります。サードパーティの広告 SDK を使用している場合は、SDK メーカーに連絡して、この新しいポリシーに準拠している新しいバージョンを入手してください。

#AdMobの変更
AdMob自体については単体のSDK(jar)をGooglePlayServices(GPS)のライブラリに変更するだけですので下記サイトを参考にするとそこまで難しくはないです。
https://developers.google.com/mobile-ads-sdk/docs/admob/play-migration?hl=ja

(まぁ個人的にはAPKが(proguardを通しても)500KB～1MB程度大きくなりますし、そもそも端末のGooglePlay開発者サービスが古いとGPS内でクラッシュするのでアプリのクラッシュレポートが大変なことになるのは不満だらけですが・・・それはさておき・・・)

#Android2.2対応アプリでもビルドできるようにする

ここで問題になるのはGPSライブラリが minSdkVersion=9 (Android2.3)なので、Android2.2対応アプリの場合、GPSを組み込んでAndroidStudioでビルドしようとすると下記のようなエラーが発生してしまうことです。

```
:twitPane:processFreeDebugManifest
D:\Src\TwitPane\twitPane\src\free\AndroidManifest.xml:0:0 Error:
	uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library com.google.android.gms:play-services:4.4.52
```

※ちなみにEclipse/ADTではわりとスルーしてビルドできちゃいます。

色々と回避策はあると思いますが、ManifestMerger を止めてしまうのが一番簡単だと思います。

```groovy:build.gradle
android {
    compileSdkVersion 16
    buildToolsVersion "20"

    defaultConfig {
        applicationId "com.twitpane"
        minSdkVersion 8
        targetSdkVersion 15
        versionCode 279
        versionName '6.1.1'
    }
...
    productFlavors {
        free {
            applicationId "com.twitpane"
        }
        kindle {
            applicationId "com.twitpane.kindle"
        }
    }
...
    applicationVariants.all { variant ->

        variant.processManifest.enabled = false

        System.println("* self manifest merge : [${variant.buildType.name}]" +
                "[${variant.productFlavors[0].name}]" +
                "[${variant.productFlavors[0].applicationId}]" +
                "[${variant.mergedFlavor.name}]"
        )

        def flavor = variant.productFlavors[0]
        def newManifestDir = "$buildDir/work/${flavor.name}"
        file(newManifestDir).mkdirs()

        def updatedContent = file("src/${flavor.name}/AndroidManifest.xml").getText('UTF-8')
                .replaceAll('android:versionCode="1"', "android:versionCode=\"${defaultConfig.versionCode}\"")
                .replaceAll('android:versionName="a.b.c"', "android:versionName=\"${defaultConfig.versionName}\"")
        new File("${newManifestDir}/AndroidManifest.xml").write(updatedContent, 'UTF-8')
        variant.processResources.manifestFile = file("$newManifestDir/AndroidManifest.xml")
    }
...
```

上記で行っているのは各ProductFlavorsのAndroidManifest.xmlのversionCodeとversionNameをそれぞれ書き換える処理です。処理自体は単純なので必要に応じて追加するといいでしょう。

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.twitpane"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="a.b.c">
...
</manifest>
```

#アプリ自体の修正も忘れずに。

以上でAPKを生成できるようになるので、あとはコード(Java)側で `android.os.Build.VERSION.SDK_INT` 等を確認して Android 2.2 端末では AdView の実体を作らないようにすれば完成です。
layoutをlayout-v9ディレクトリ等で切り替えるのでももちろんかまわないでしょう。


#備考
* ProductFlavors使ってる前提で書いたけどmainだけだったら単純にMerger止めるだけでいいかと。
* 個人的には[バージョン番号をAPKファイル名に埋め込んだり](http://qiita.com/takke/items/c6c774807f064500aca4)と別の事情があるのでこんなめんどくさいことをしてみました。