2019年2月9日土曜日

EclipceからAndroidStudioへのお引っ越し ーその1ー

Google Play ストアにアプリを公開していますが、いつの間にかターゲット SDK を API レベル 26 以上(Android 8.0 Oreo)に設定することが求めらていました。(通知は来ていたのでしょうが、無視していました)2018年秋のアップデートは問題なかったのですが2018年11月1以降は新規アプリだけでなくアップデートもできなくなっていたんですね。1月になってちょっと修正したのでアップデートしようとしたところで怒られてしまいました(泣)

如何せんAndroid1.6の頃に作ったアプリでターゲット SDKも8(Froyo)という、とんでもアプリでした。仕方がないので急遽3倍以上のジャンプアップを目指して作業を開始しました。とはいえ、最近はAndroidの本格的な開発からは遠ざかっていた(スマフォもいつの間にかiPhoneになっています)ので最新情報にも疎く、だいぶあたふたとしております。

多くのデベロッパーの方はすでに最新のバージョンにもバリバリ対応していると思いますので、全く役に立たない情報ではありますが、作業中つまづいたところをドタバタ奮戦記として残しておきたいと思います。

さて、ターゲット SDK のAPI レベルを上げると当時に、開発環境もEclipceがサポート対象外となっているのでAndroidStudioへのお引っ越しが必要となっています。両方をいっぺんに行うのは大変なので、まずはAPI レベル を現在のEclipce環境で上げられるところまでアップしてからAndroidStudioへ引っ越したいと思います。

その1:API レベル8(Froyo)からレベル16(Jelly Bean)へ


ここでもステップを踏んで作業を進めていきたいと思います。本家でも「Google Play の対象 API レベルの要件を満たす」として説明されていますが、一番初めに「動作の変更点」があったのがレベル16のようなのでまずはここを目指します。
作業はビルドターゲットを変えてリビルドするだけで済みましたが、実行してみると「You cannot combine custom titles with other title features」なるメッセージで実行できませんでした。早速Googleさんにお伺いをたてると、タイトルをカスタマイズしている場合はテーマの設定が必要なようです。そういえばテーマなんて機能がだいぶ前に追加されていましたね。
AndroidManifest.xmlを編集してテーマを以下のように設定しところ問題なく表示されるようになりました。でも、これが後で発覚する別の問題を引き起こしていました。
<application ... android:theme="@android:style/Theme.NoTitleBar">
<activity ... android:theme="@android:style/Theme">

その2:support v7の導入


AndroidにFragmentが導入されたのはAndroid 3.0でしたが、当時Preferenceがまだサポートされていなかったと思います。そこでPreferenceFragment/PreferenceManagerCompatを使って対応していました。そのまま使っていましたが、現在ではOSで対応していますし、サポートライブラリでも使えるのでsupport v7 preferenceを導入して切り替えることにしました。
PreferenceFragmentはPreferenceFragmentCompatへPreferenceManagerCompatはPreferenceManagerにクラス名を変更することでその他にソース修正は必要ありません。ただ、support v7 preferenceはリソースなども含んでいるので、Eclipceへ取り込む必要があります。ここで問題が発生です。
取り込んだリソースの内res/values/attr.xml内でエラーが発生してしまいます。フォーマットが未定義だというので、以下のようにformat指定を追加することでエラーは出なくなりました。
<declare-styleable name="Preference">
 <attr name="icon" format="reference">
 <attr name="title" format="reference">
 <attr name="layout" format="reference">
さて、エラーがなくなって実行したところで、はたと気がついたのが設定を開くためのメニューが出ない。最近の人は知らないかの知れませんが、昔はメニューの表示は画面下部のホームボタンとか表示されているとこにあったんですね。どうやら最近は画面上部のツールバー?(タイトルバー改めアクションバーが改名してツールバー?なんて呼ぶのが正式なんでしょうか?)に表示されるようです。そうです、Theme.NoTitleBarでタイトルバーを消していたんですね。
<style name="Theme.Light_actionBar" parent="@android:style/Theme.Light">
 <item name="android:icon">@android:color/transparent</item>
 <item name="android:windowNoTitle">false</item>
 <item name="android:windowActionBar">true</item>
</style>
カスタムテーマを作って無事にメニューが表示されて、やっと設定画面を開くと、今度は実行時エラーが出ます。実はsupport  v7 recyclerviewを使っていたんですね。と言うことで、こちらもインポートして無事に設定画面も動くようになりました。
ところが、ここでカスタムPreference(ボタン)が動きません。色々と探っていると、今まではPreference全体のレイアウトを作ってカスタマイズしていたんですが、どうやらwidget部分だけをカスタマイズできるようです。カスタマイズが簡単になっていたんですね。
参考サイト:Preference(4)-Preferenceのカスタマイズ 

 その3:LVL (License Verification Library)バージョンアップ


LVLとはGoogle Play で有料アプリを配布する際に組み込んでおきたい、ライセンス認証ライブラリのことです。とは言え、ハッキングツールも公開されていたりとあまり役に立たない機能ではありますが、気休めで導入してありました。ところが、APIレベルを23(Marshmallow)に上げたところ、コンパイルでエラーが発生しました。どうやらAndroid6.0からApache HTTP クライアントが削除されたのが原因のようです。最新のソースがGithubにあったのでダウンロードして差し替えました。

オプションメニューがアクションバーに移動したことに伴い、アクションバーへの表示ができない画面が1つだけありましたが、そこはコンテキストメニューに切り替えることでクリアしました。こちらはほぼメソッド名の変更だけで完了です。

その4:テーマでハマった件


最後に残ったのがAbout画面として使っていたAlertDialogです。表示はされるのですが、背景色や文字色がダーク系になってしまい、文字が見づらいのです。テーマで設定できるかと思いましたが、なかなか思うように設定できませんでした。
結論から言うと、support v7 appcompatを導入&カスタムスタイル作成で思うような設定が可能でした。ただし、結論に達するまで数日を要し今回の作業で一番ハマったとことです。キモはカスタムスタイルを作成するときにTextAppearance.AppCompatからの派生スタイルを継承することでした。
テーマをカスタマイズするにはTheme.AppCompatを継承するように、widgetのスタイルを独自に変更しつつテーマを反映させるにはAppCompatから派生したスタイルを継承しておくことが必要なようです。
<style name="Dialog_TextSmall" parent="TextAppearance.AppCompat.Caption">
 <item name="android:textColor">?android:colorPrimary</item>
</style>
スタイルを定義して、レイアウトで指定します。
<TextView android:text="@string/about_copyright"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="15dip"
 android:layout_marginRight="15dip"
 style="@style/Dialog_TextSmall"
/>
この作業の中で、その2で修正したdeclare-styleableですが、今度は二重定義でエラーになりました。どうやらsupport v7 appcompat側のリソースで定義されているようです。support v7 appcompatは必須という位置付けなんでしょうかね。その2での修正を削除してクリアです。

最後に


これで終わりではなく、次にAndroidStudioへの移行と、API レベル 26 への対応が必要ですが、作業が無事に終了したら別に報告したいと思います。

いづれにしろ、FragmentやらThemeやらToolBarやら浦島太郎となっている状況なので、もう一度真面目に勉強し直してアプリも1から書き直す必要がありそうです。

0 件のコメント:

コメントを投稿

QNAPでPostgreSQLを動かす

 PostgreSQL公式では起動できない QNAPでPostgreSQLを動かす場合はContainerSenterを導入してDockerで動かすようになっています。 標準でサポートされているデータベースはMariaDBなのですがバージョンが5.5.57(最新版は10.5.10...