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にまだ移行できてないので、非常に助かりました..
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が必要です。<中略>
android - Private Librariesが消えてしまいました。 - スタック・オーバーフロー
ADTの以前のバージョンでは新規プロジェクトを作る度に、自動で最新版をインポートして新規プロジェクトと紐付けていたのですが、現在は手動でインポートしてビルドパスの解決を行う必要があるみたいですね。
現状確認
- プロジェクトを選択して右クリック[プロパティ]
- [Andorid]-[ライブラリー]のappcompatがエラーになっていることを確認
対策1:android-support-v7-appcompatのインストール
上記エントリにも書いてありますが、appcompat-v7の設定手順をメモとして残しておきます。
- [ファイル]->[インポート]->[Android]->[Existing Android Code Into Workspace]を選択
- [ルート・ディレクトリー]に
/extras/android/support/v7/appcompat/を参照するように設定 - パッケージエクスプローラにandroid-support-v7-appcompatのプロジェクトがインポートされる
- libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスに追加]
- libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスの構成]を選択
- プロジェクトのプロパティが開くので、[順序およびエクスポート]タブにandroid-support-v7-appcompat.jarが設定されていることを確認
- 同タブ内の[Android Dependencies]のチェックを外す
- 作成しているアプリケーションのプロジェクトを右クリック->プロパティ->[Android]->[ライブラリ]を開く
- 新しい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
というわけで、無事に動作しました。