2021 年 8 月以降リリースする Androidアプリは次の要件を満たす様、Googleが通知が来ました。
・Android App Bundle 形式で公開
・Target SDK APIレベル 30(Android 11)以上
今まで、ずっと Eclipse + AndroidSDK で開発してきましたが、EclipseではBundle形式の資材が作れない様です。
仕方がないのでAndroid Studioへ移行してみました。
予想以上に手間がかかり、単純にセットアップ画面を進めるだけでは動いてくれません。5回やり直して(自分の環境では)クリーンな手順を確認できたつもり。以下、その覚書きです。
(2021/5頃 V4.1.3での情報、バージョンによって結構変わるようです)
■事前情報
Android Studioを動かす上で必要なものは以下3つ。構成はEclipseでの環境と大差ありません。
・IDE(Android Studio本体)
・JRE(Java Runtime Environment)
・Android SDK
3つ全てがAndroid Studioのセットアップ作業で登録されます、セットアップ中に登録をSKIPする選択肢はありません。容量は最低7GB程度使用します。
JREはAndroid Studioのダウンロードzipに含まれています。
使用するJREの指定はAndroid Studio内のdir設定だけなので、後から変更も可能(環境変数は参照しない)。
Eclipse用に使っていたJREでも動きます、そっちは32bit版なのでメモリ量設定を上げるとエラーが出ました。
素直にzip内のJREを使うのが良いです。
Android SDKはセットアップ作業内で追加ダウンロードされます。デフォルトで5GB程度?
登録先のdirをセットアップ作業で指定するのですが・・・
★注意 dirパス中に英数字以外の文字があるとエラーになります。全角はもちろん、半角空白、「!」等もダメです。意味不明なワナ・・・
使用するAndroid SDKの指定もAndroid Studio内のdir設定で、後から変更も可能(環境変数は参照しない)。
Eclipseで使用していたSDKのdirを設定しても動きます。
ただしEclipse用にセットアップしたSDK ManagerにはAPI 29までのSDK Platformしか表示されず、APIレベル30のSDKがダウンロードできない様です。
APIレベル30のSDKが使用できないと意味が無いので、素直にAndroid StudioがダウンロードするSDKを使用します。
新しいSDK Manager、AVD Managrも、セットアップ作業内で利用可能になります。
あとWindowsで★「Hyper-V」を使用できる様にしているとAndroidエミュレータが動きません。(詳細は後述)
■Android Studio ダウンロード
公式「Android Studio のインストール」→Android Studio の最新バージョンをダウンロード、へ移動。
標準のダウンロードリンクは exeファイル。zipファイルの方が扱い易いので「Download options」の方へ移動。
Windowsユーザは「Windows(64-bit) android-studio-ide-xxxx-windows.zip」をダウンロード。2021/5頃のバージョンは900MBあった。
正式サポートは64-bitのみとの事。
ちなみにWindows(64-bit)のzipには32-bit用と思われる起動ファイルも存在するので32-bit OSでも使えるのかもしれない(試してはいない)。
■セットアップ作業
ダウンロードしたzipを任意のdirに解凍します。これがAndroid Studioの本体です。
解凍先dirのパス文字の制限は無さそうでしたが、上記のSDKのパス制限が有ったので英数字のみのパスにしました。
起動モジュールは以下。
〜 \android-studio\bin\studio64.exe (32bit版はstudio.exe?)
初回起動で、セットアップ処理が動きます。
以後、セットアップ処理のポイント。
・Import Android Studio Settings(古いAndroid Studio設定を引継ぐか?) →初回なので Do not import settings を選択

・Data Share(使用状況を Google とシェアするか)→Don't send を良い。
・InstallType(個別指定するか?)→上記のdirパス問題があるので「Custom」を選択

・Select UI Thema →見た目だけなのでどちらでも良い
・SDK Component Setup → SDKのセットアップパス(英数字のみ)を指定する、Componentはデフォルトで可、Intel HAXM(エミュレータの高速動作に必要)が未チェックならチェックする。

・Emulator Settings →メモリ割当は2048MBから変えない(Intel HAXMの指定値が2048MBらしい)

・「Finish」でダウンロード&セットアップ開始。

↓
初期画面が出れば第一段階完了。

レジストリ、環境変数の登録はありません。関連するファイルは以下のdirにセットアップされています。
・Android Studio のzipを解凍したdir
・SDKのセットアップに指定したdir
・C:\Users\xxxxx\AppData\Local\Google
・C:\Users\xxxxx\AppData\Roaming\Google
■日本語化
世界的に利用されるツールのくせに、多言語対応していません。VisualStudioを見習って欲しい物です・・・余りに使いにくいので日本語化。
MergeDoc Project(Pleiades)から下段の「Pleiades プラグイン・ダウンロード」−「Windows」を選択、pleiades-win.zipをダウンロードする。
任意の場所に展開して、Android Studio を停止してから pleiades-win\setup.exeを実行
「日本語化するアプリケーション」にAndroidStudioのstudio64.exeを指定。「日本語化する」を押下→日本語化されます。
AndroidStudioを起動すると日本語化されている。

ただしコレだけではAndroidStudioのログ表示が文字化けする。
「構成>カスタムVMオプションの編集」を選択、最終行に
-Dfile.encoding=UTF-8
を追加して「保存する」。これで日本語化完了。

■ライセンス承認
既存プロジェクトのビルドで以下のエラーが発生。
Failed to install the following Android SDK packages as some licences have not been accepted.
ライセンスの承認が必要らしいです・・・
Android Studio を停止してからCommand Prompt画面を起動。
〜\android-sdk\tools\bin まで移動して sdkmanager.bat --licenses を投入。

未承認のpackageがあると何度か <y/N> の確認を聞かれるので全て「y」で応答。
「All SDK package licenses accepted」が表示されれば完了。
■エミュレータ
まずはコントロールパネルの「アプリと機能」からIntel HAXM(Hardware Accelerated Execution Manager)がインストールされている事を確認。

もし無ければ、以下のファイルを起動してインストールする。
〜android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager\haxm-7.6.5-setup.exe
続いてHAXMが動作するか確認。窓の杜よりVirtualCheckerをダウンロード。
ダウンロードしたzipを解凍してVirtualChecker.exeを起動。
Intel VT-Xが「Enabled」ならOK。

Enableにならない場合は以下をチェックしてみる。
・BIOSの設定でVT-Xが無効になっていないか
・コントロールパネル「Windowsの機能の有効化」で「Hyper-V」が有効になっていないか(Hyper-VとVT-Xは共存できない)

ここまで確認すれば普通に起動できる筈。メモリの空き(「タスクマネージャ」−「メモリ」−「利用可能」の値)が 3GB以上ないと落ちる事が多い。
エミュレータ関連のファイルは以下に格納されている。
・〜\android-sdk\system-images\ 配下、バージョン毎のベースイメージファイル
・〜\Users\xxxxx\.android\avd 配下、AVDマネージャで作成した実行環境
1環境毎に3〜10GB程度使うので、不要な物は削除した方が良い。
■Eclipse既存プロジェクトの移行
元のアプリの作り方にも因ると思うのですが、用意されている「プロジェクトのインポート」を使ってもエラーが多発して自動移行は不可能・・・ 以下の「手動」手順で移行しました。
1.既存と同じパッケージ名で、新規プロジェクトを「空のアクティビティ」で作成。「Use legacy android.support libraries」はチェック。
2.プロジェクトを閉じる。
3.既存の以下のファイルを、新規プロジェクト上にコピー&上書き。
・AndroidManifest.xml(→ 〜app\src\main\AndroidManifest.xml)
・javaソース(→ 〜app\src\main\java\〜)
・リソースファイル(→ 〜app\src\main\res\〜 画像を複数dirに分けていた場合は\drawableにまとめて格納)
4.AndroidManifestにminSdkVersion、targetSdkVersionの記述がある場合は削除。
5.代わりに 〜app\build.gradle(プロジェクト直下のbuild.gradleではない)のminSdkVersionを修正。targetSdkVersionは30から変更しない。
6.合わせてversionCode、versionNameも修正(こちらの値がapkに反映される)。
:
defaultConfig {
:
minSdkVersion XX
targetSdkVersion 30
versionCode XX
versionName "XX"
:
7.プロジェクトを開いて「ファイル」−「Gladleファイルとプロジェクトを同期」、「ビルド」−「プロジェクトの作成」を実行。
8.エラーは余り出ない筈。後は個別に調べて直すしかない。
9.import android.support.vX.app.〜 はエラーになる。import文を消して、該当のClassから自動インポート(import androidx.core.app.〜)すれば直る。
私の既存プロジェクトはこの程度で、ビルド、実行可能になりました。
■アクションバー復元
一通り動く様になりました。
画面の雰囲気はかなり変わったけどまあ良いか、と思ったのですが・・・ 画面上端のアクションバーが消えている。
アクションバーのメニューから遷移する画面もあるのでアクションバーが無くなるのは許容できません。
Eclipseでビルド AndroidStudioでビルド


アクションバーが消えた正確な原因は良く分からず・・・ android:Theme.Light でActionBarが表示できなくなったらしい?
対処方法は幾つか有ったが、以下が比較的ラクでした。
【Eclipseプロジェクトの指定】(API 14のデフォルト出力指定をそのまま利用していた筈・・・)
・Activity.java
public class MainActivity extends Activity { ←Activityを継承している
・AndroidManifest.xml
<activity
:
android:theme="@style/AppTheme" ←activityでAppThemeを指定
:
・styles.xlm
:
<style name="AppTheme" parent="AppBaseTheme"></style>
<style name="AppBaseTheme" parent="android:Theme.Light"></style> ←「背景色に白、テキスト色に黒を基調、Titleバー有」のTheme
:
【Android Studio(API30)用に修正した指定】
・Activity.java
import androidx.appcompat.app.AppCompatActivity; ←AppCompatActivity用のインポート追加
:
public class MainActivity extends AppCompatActivity { ←AppCompatActivityを継承
・AndroidManifest.xml
<application
:
android:theme="@style/Theme.AppCompat.Light.NoActionBar" ←application(全体)でTheme.AppCompat.Light.NoActionBarを指定
:
<activity
:
android:theme="@style/ActionBarTheme" ←アクションバーを表示するactivityにActionBarThemeを指定
:
・styles.xlm
:
<style name="AppTheme" parent="AppBaseTheme"></style>
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar"></style> ←デフォルトをTheme.AppCompat.Light.NoActionBarに変更
<style name="ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar"></style> ←ActionBarThemeを追記
:
修正した結果が以下。ほぼ元通りに動作するように移行できました。
Eclipseでビルド AndroidStudioでビルド


■APK生成でエラー(2022/5/22追記)
久しぶりに訳あってAPK(否AAB)をビルドしようとしたらエラーが発生(AAB はビルドできます)。APK のビルドも以前は出来た。
エラー内容は以下。
Could not HEAD 'https://jcenter.bintray.com/junit/junit/maven-metadata.xml'.
JCenter が閉鎖された影響らしいです。以下、対処。
プロジェクト直下のbuild.gradle(〜app\build.gradleではない)に以下を追記。
repositories {
google()
mavenCentral() ←追記
jcenter()
}
APK ビルドできるようになりました。
■Target API31 対応
PlayStoreを更新するのに Target API31 対応が必須になりました。自分が必要だった対応は以下2点。
@ AndroidManifest.xml に android:exported="true / false" の明記。
こちらはビルドでエラーになるから明快。
false にすると他のアプリからの intent呼び出しが出来なくなる。
何も考えないなら android:exported="true" を明記すれば良い。
false にして他アプリから intent発行すると発行側が何のエラーも出さず(Logcatに何も出ない)に落ちるから分かりにくい。
A Bluetooth 利用権限のユーザ許可。
権限系は何のエラーも出ず処理がスルーされるので分かりにくい & API31のデバイスは所有が無く、Bluetoothはエミュレータで試験出来ないので悩みました。
AndroidManifest.xmlに <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> を追加。
Activity の onCreate に以下の処理を追加。
ArrayList
起動時に以下のダイアログ(エミュレータ画面です)を表示、許可されれば次回以降は表示しなくなります。

使用するAPIによって、BLUETOOTH_ADMIN, BLUETOOTH_SCAN が必要な場合も有ります。
■ダークモード 対応
AstroSlideが有機液晶なので、システムのダークモード設定に対応できる様にする。
他で公開されている手順では上手く行かなかった、、、古いプロジェクトを引き継いでいるから?
いろいろトライして、以下の手順で対応できました。簡単に済ませたかったので、最低限の修正方法。
・Layout内で「background」「xxxxxColor」等、色指定している定義は全て削除。
・〜\res\values配下の「styles.xml」を〜\res\values-night配下へコピー。(〜\res\values-nightフォルダは元から有った、配下の「themes.xml」は変更不要)
・〜\res\values-night\styles.xml内の「Theme.AppCompat.Light.NoActionBar」2カ所を「Theme.AppCompat」に変更。
・Activity の class文
class xxxxxActivity extends Activity のままだったら
→class xxxxxActivity extends AppCompatActivity に修正(サブ画面は直してなかった)。
・AndroidManifest.xml の activityタグ内に
android:theme="@style/ActionBarTheme" が無かったら追加(サブ画面は直してなかった)。
これで、システム設定に従ってダークモードに変わる様になりました。
■Target API31→34 対応
毎度のことながら面倒くさい、、、とりあえず、自分のアプリで修正したのは以下。最適な直し方では無いが簡単に通す事を優先。
・ストレージアクセス権限の許可の変更
AndroidManifest.xml
android.permission.READ_EXTERNAL_STORAGE → android.permission.READ_MEDIA_IMAGES、等に変更(単純に追加でOK)
・通知を表示させるには権限許可要求が必要、MainActivity の onCreate ブロックに追加。表示不要であれば対処も不要。
AndroidManifest.xml
uses-permission android:name="android.permission.POST_NOTIFICATIONS"
onCreate
static final int REQUEST_MULTI_PERMISSIONS = 101;
ArrayList
・PendingIntentの引数指定
PendingIntent.getActivity( 〜 , PendingIntent.FLAG_IMMUTABLE );
・レシーバ登録時に引数追加
if(Build.VERSION.SDK_INT >= 26) {
registerReceiver(broadcastReceiver, new IntentFilter( 〜 ,RECEIVER_EXPORTED);
} else {
registerReceiver(broadcastReceiver, new IntentFilter( 〜 );
}
・FOREGROUND_SERVICE_TYPE の指定、これが一番面倒。PlayStore申請時にService使用の理由を説明する動画も必要、、、
xxx に指定する値は微妙に異なる。フォアグラウンド サービス タイプは必須 を参照。
AndroidManifest.xml
uses-permission android:name="android.permission.FOREGROUND_SERVICE"
uses-permission android:name="android.permission.FOREGROUND_SERVICE_xxx"
:
<service
:
android:foregroundServiceType="xxx"
>
通知生成処理の修正
if (Build.VERSION.SDK_INT >= 34){
startForeground( 〜 , ServiceInfo.FOREGROUND_SERVICE_TYPE_xxx);
} else {
startForeground( 〜 );
}