android SDKアップグレードによるappcompat-v7のエラー対処

android SDKのバージョンをAndroid6.0(API 23)にアップグレードして、プロジェクトを読み込むと以下の箇所でエラーになり、ビルドできません。

import android.support.v7.app.ActionBarActivity;

以下のエントリによると、どうやら新たにappcompatを設定しないといけないようです。
https://akira-watson.com/android/lollipop-api-21.html
android - Private Librariesが消えてしまいました。 - スタック・オーバーフロー

当方もandroid studioにまだ移行できてないので、非常に助かりました..

環境

eclipse Mars 4.5.1
android 6.0 (API 23)

AppCompat

そもそもAppCompatってなんぞと思ったので調べてみました。

AppCompat(別名 ActionBarCompat)は Android 4.0 の ActionBar API を Gingerbread 搭載デバイスに対応させるためのバックポートとしてはじまり、バックポートとフレームワーク共通の API レイヤーを提供していました。

https://googledevjp.blogspot.jp/2014/11/appcompat-v21-lollipop.html

つまり上位のAPILevelの機能を下位のAPILevelで動作させるための仕組みと理解しました。

原因

上記のStackOverflowでも議論されていますが、どうやら新しいSDKにアップグレードしたことで、AppCompatを参照できなくなったようです。
なので、新しいAppCompatをインポートして、古いAppCompatを参照している設定を削除し、新しいAppCompatへの参照を設定することで解決できる模様。

Eclipseの場合、ActionBarActivityを使うには同じワークスペースのプロジェクトに、v7 support libraryが必要です。<中略>
ADTの以前のバージョンでは新規プロジェクトを作る度に、自動で最新版をインポートして新規プロジェクトと紐付けていたのですが、現在は手動でインポートしてビルドパスの解決を行う必要があるみたいですね。

android - Private Librariesが消えてしまいました。 - スタック・オーバーフロー

現状確認

  1. プロジェクトを選択して右クリック[プロパティ]
  2. [Andorid]-[ライブラリー]のappcompatがエラーになっていることを確認

対策1:android-support-v7-appcompatのインストール

上記エントリにも書いてありますが、appcompat-v7の設定手順をメモとして残しておきます。

  1. [ファイル]->[インポート]->[Android]->[Existing Android Code Into Workspace]を選択
  2. [ルート・ディレクトリー]に/extras/android/support/v7/appcompat/を参照するように設定
  3. パッケージエクスプローラandroid-support-v7-appcompatのプロジェクトがインポートされる
  4. libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスに追加]
  5. libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスの構成]を選択
  6. プロジェクトのプロパティが開くので、[順序およびエクスポート]タブにandroid-support-v7-appcompat.jarが設定されていることを確認
  7. 同タブ内の[Android Dependencies]のチェックを外す
  8. 作成しているアプリケーションのプロジェクトを右クリック->プロパティ->[Android]->[ライブラリ]を開く
  9. 新しいappcompat-v7があることを確認したら古いappcompat-7を除去して新しいappcompat-v7を追加

上記エントリによればminSdkVersionを13以下に設定するとappcompat-v7が自動的に生成されてしまうようですので、14以上にすることで回避できるそうです。

<uses-sdk android:minSdkVersion="14"
          android:targetSdkVersion="21" />

ビルド

これで動くかと思いきや、ビルドすると今度は以下のようなエラー。

You need to use a Theme.AppCompat theme (or descendant) with this activity.
ActivityでTheme.AppCompatを使えや!と怒られました。

対策2:style.xmlのThemeを修正

本件の対策については、以下に詳しく書かれていました。
Proguard有効でビルドを行ったアプリを起動するとIllegalStateException: You need to use a Theme.AppCompat theme... - Qiita

対策として以下を行いました。

  • res/values-v11/style.xmlで定義されているTheme.LightをTheme.AppCompat.Lightに変更
  • res/values-v14/style.xmlで定義されているTheme.Light.DarkActionBarをTheme.AppCompat.Light.DarkActionBarに変更
  • proguard-project.txtに以下を追加
-keep class com.google.android.gms.** { *; }
-keep public class com.google.android.gms.**
-dontwarn com.google.android.gms.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
  • project.propatiesに記述されている以下のコメントを外す


proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

というわけで、無事に動作しました。