androidアプリ リリース直前の微調整で気を付けたこと
概要
Androidアプリ ツケ台帳 のプログラミングが完了した後、リリースする直前にいくつか調整したので備忘録的にメモしてみます。
アプリの解説、過去の投稿は→こちら
確認事項
起動速度が遅い
プログラミング完了直後は起動時間がエミュレータで7秒近くありました。
さすがにこれは長いと思いいろいろな方法を試したのですが、一番効果があったのは
・gradle(app)
内で余計なものをimplement
していないかを確認し、削除する
でした。
初のアプリ開発でいろいろ試しながらやっていたというのもありますが、これで5秒以下まで起動時間が短縮できました。
また、最後にこういう見直しができるようにしっかりコメントを書いておくことも重要かと思います。
テーマの変更
個別で変更するのは効率が悪いので、themes.xml
でまとめて最後に変えます。
アイコンの下に表示されるアプリ名
ホーム画面のアイコンの下に表示されるアプリ名はAndroidManifest.xml
のMainActivity内android:label
を参照しているっぽいです。
難読化 Firebaseを使う場合の注意点
アプリのサイズが大きい場合、「難読化」という方法でサイズを小さくすることができます。
ツケ台帳 ではFirebase Realtime Databaseを使用していますが、その場合そのまま難読化することはできずエラーとなるようです。
今回はサイズがもともと小さい(数Mb)ので難読化せずに妥協しました。が、工夫すればRealtimeDatabaseも難読化できるようです。もっと大きなアプリ作成したら試してみようかと思います。
難読化とは:複数回登場するスクリプトを別の文字列に置き換えることで軽量化している、と理解してます。置き換えた文字列同士の対応はmapping.txt
として出力されるため、これも一緒にストアにアップロードする必要があります。
【Firebase】 Realtime Database 実装時に詰まった箇所(DB設計編)
概要
Androidアプリ ツケ台帳 を作る際にFirebase realtimedatabaseを初めてさわったのですが、
特に詰まった部分を、備忘録かねて初心者的な目線でメモしてみます(DB設計編)
アプリの解説、過去の投稿は→こちら
スクリプト編もあります→スクリプト編
詰まりポイントと解決方法
key名の付け方
末端のkey名は小文字にする必要があるようです。
大文字でもDB設計できてしまいますが、スクリプト内で setValue(key)
する際にkeyの文字列が全て小文字として認識されるようです。
keyとvalue
DBからデータを読み出す場合は末端のデータを抜き出す場合以外、基本的にkeyで検索するのでデータ作成時のkeyのつけ方は重要です。
私は以下のように場合分けして実施していました。
・データの順番が重要な場合(例:掲示板への投稿メッセージのようなデータなどで、投稿順で並べ替えて表示したい場合)
:push()
でkeyを自動生成する。
時系列になるように生成してくれるので管理が楽です。
・データの順番が重要でない場合(例:グループに所属するユーザのデータなどで、特にユーザ間に優劣がない場合)
:key = valueとする。
検索の際、valueの値でもkeyの値でも検索できるので楽。
以上です。
【Firebase】 Realtime Database 実装時に詰まった箇所まとめ (スクリプト編)
概要
androidアプリ ツケ台帳 を作る際にFirebase realtimedatabaseを初めてさわったのですが、
特に詰まった部分を、備忘録かねて初心者的な目線でメモしてみます(スクリプト編)
アプリの解説、過去の投稿は→こちら
解決方法
Firebaseのリスナー内でcontextを参照する場合
this
だけでは取得できなかった。contextの後に @○○Activity
が必要。
※コピペでやっているとハマりやすい
読み取り時のSnapshotの参照先
できるだけ狭い範囲を指定すべき。
後からセキュリティルールを定める時に困るし、一度に読むデータが多くなるのでユーザが増えると重くなる原因となる。
少なくともルート(下記画像ではdatabase
)を参照するのはやめる(セキュリティルールが全く設定できなくなる)。
NG例:database.addListenerForSingleValueEvent(Listener)
よい例:database.child("messages").addListenerForSingleValueEvent(Listener)
これをやるとルート直下のノードを複数読み込みたい場合に困るが、私の場合はリスナーを入れ子にした。その際、リスナー・スナップショットの名前は変えること。
(他にもっといい方法があるかもしれない。。)
リスナー内スクリプトの実行タイミング
リスナー内のスクリプトは、配置に関わらずリスナー以外のスクリプトがすべて実行された後に実行される。
例:onCreate内に 命令文1→リスナー内命令文→命令文2 の順番で記入されていた場合、実際には
命令文1→命令文2→リスナー内命令文 の順番で実行される。
Firebaseの読み取りは1回限りの場合もリスナーを使わないといけないので実行順に注意が必要。後から読み取りのリスナーを実装するとハマりやすい罠。
対策として、読み取りの命令文だけでなくその前後のスクリプトもまとめてリスナー内に入れていた。
リスナーの種類
特殊な事情がない限り
.addValueEventListener
でなく
addListenerForSingleValueEvent
(1回だけ実行して消えるリスナー)
を使うべき。リスナーが残っていて変な挙動をする例がよくある。特に初心者(私を含む)の場合はリスナーを活用した開発は難しいので.addValueEventListener
を原則使うようにしたほうが余計なトラブルがないだろうと思われる。
これはクエリを使ったリスナーでも同様。
TextViewなどの初期値
Firebaseだけの問題ではないかもしれないですが、DBから読み取って表示するデータは画面表示の際に読み込みのラグが発生するためxmlに初期値を入れておくとTextViewがチラついて見栄えが悪いです。
【Android】TextViewの内容を動的に変更する方法
自作androidアプリ Flexible Dice
では、TextViewを動的に変更することでダイスロールを表現しています。
その際に結構迷ったので備忘録的にメモします。
方法
色々調べた結果、以下のことがわかりました。
・画面更新の方法としてinvalidate()
という命令文があるが、これはどうやら更新を予約するだけのものらしい。
・その場では更新されずinvalidate()
のスレッドが終了した後(アイドル時)に画面の更新が行われる。
・そもそもinvalidate()
はステータスを更新するほとんどの命令文(set○○()
など)の際に暗黙に実行されているらしい。
なので結論としては、invalidate()
は書く必要がなく、別スレッドでステータスを変更して元のスレッドに戻ればよいです。
そうすれば別スレッドが終了した時点で画面の更新が行われ、変更点が反映されます。
例
Thread{ }.start()
で別スレッドを生成することができます。
例えば、下記のプログラムは Flexible Dice Dice画面の左上に表示されているさいころの面と数を表すテキスト(1D10など)を動的に変更するスクリプトです。
Thread{ activity?.runOnUiThread { val textViewDice = view.findViewById<TextView>(R.id.textView_dice) textViewDice.text = "DICE: " + number.toString() + "D" + face.toString() } }.start()
アイデア次第でいろいろできそうですね。
【AdMob】 リワード広告設定時に詰まった点
自作androidアプリ Flexible Dice にはリワード広告を実装しているのですが、
その実装の際に詰まった点を備忘録的にメモしてみます。
詰まった点
アプリ認証後しかAdMob審査ができない
AdMobの審査をする際にストアからアプリを検索しないといけない。つまり、ストアへの登録→AdMob審査の順番になるため、ストアへ登録した直後(48時間程度)は広告が表示されない。
バナー広告の場合はあまり問題ないが、リワード広告の場合は報酬を受け取れないので機能が一部使えなくなる。
これを防ぐために、まずリワード広告をつけていないアプリで審査を通し、広告ありのバージョンにアップデートするという方法をとった。
忘れがち?な登録内容
AdMobの「支払情報」の登録を忘れていた。
これをやらないといつまでたってもアプリの広告審査が「準備中」から変化しない。
※実はこれで1週間くらいロスしました。。
この項目だけは入力しなくてもアプリの登録、審査依頼ができる上、通常の審査待ちと同じ「準備中」状態になるため、意外と気づきにくいんじゃないかと思う。
パーミッション
これはリワード広告というかAdMobの仕様だが、インターネットアクセスのパーミッションが必要。
<manifest> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> </manifest>
見落としていて結構時間を取られてしまった。
【kotlin】botton,textviewなどのスタイルの変え方
方法
drawable.xml
ファイルに使いたいスタイルを新規作成し、xmlのandroid:background
に設定するだけ
例
自作androidアプリ Flexible Dice の場合。
このアプリではTextViewのスタイルを変更してダイスを表示しています。
1.drawable.xml
の新規作成
まずはスタイルを指定するdrawableファイルを作成します。
ここへ新規作成
中身はこんな感じ。背景色・枠線の丸み、幅、色を設定しています。
2.設定したい箇所への設定
こんな感じで、設定したい箇所のxmlにandroid:background
を追記
3.結果
textviewに設定するとこんな感じになります。
Flexible Dice ではこれをダイスのUIとして使っています。