Daily-Wine-Diary

アプリ開発中心

MENU

androidアプリ リリース直前の微調整で気を付けたこと

概要


Androidアプリ ツケ台帳 のプログラミングが完了した後、リリースする直前にいくつか調整したので備忘録的にメモしてみます。
アプリの解説、過去の投稿は→こちら

Google Play で手に入れよう



確認事項


起動速度が遅い
プログラミング完了直後は起動時間がエミュレータで7秒近くありました。
さすがにこれは長いと思いいろいろな方法を試したのですが、一番効果があったのは
gradle(app)内で余計なものをimplementしていないかを確認し、削除する
でした。
初のアプリ開発でいろいろ試しながらやっていたというのもありますが、これで5秒以下まで起動時間が短縮できました。
また、最後にこういう見直しができるようにしっかりコメントを書いておくことも重要かと思います。


テーマの変更
個別で変更するのは効率が悪いので、themes.xmlでまとめて最後に変えます。
image.png



アイコンの下に表示されるアプリ名
ホーム画面のアイコンの下に表示されるアプリ名はAndroidManifest.xmlのMainActivity内android:labelを参照しているっぽいです。
image.png



難読化 Firebaseを使う場合の注意点
アプリのサイズが大きい場合、「難読化」という方法でサイズを小さくすることができます。
ツケ台帳 ではFirebase Realtime Databaseを使用していますが、その場合そのまま難読化することはできずエラーとなるようです。
今回はサイズがもともと小さい(数Mb)ので難読化せずに妥協しました。が、工夫すればRealtimeDatabaseも難読化できるようです。もっと大きなアプリ作成したら試してみようかと思います。

難読化とは:複数回登場するスクリプトを別の文字列に置き換えることで軽量化している、と理解してます。置き換えた文字列同士の対応はmapping.txtとして出力されるため、これも一緒にストアにアップロードする必要があります。



【MPAndroidchart】 棒グラフ横軸の動的設定(スクリプトから変更)時に詰まりがちな点を解決

概要


Androidアプリ ツケ台帳 のツケ金額の解析画面を作る際、
MPAndroidの棒グラフ横軸を動的に変更(要素数に合わせて本数変更)したのですが、
若干詰まったのでメモ
アプリの解説、過去の投稿は→こちら

Google Play で手に入れよう



起きた現象


listで設定した以上の数の軸が表示されてしまう。
(※本当はtestmen2、testの2軸のみ表示したい)
e34822af256f7ffb3163ebf638651280.png
おそらく、listで指定されていないインデックスの要素はリストの最後の要素(この場合は test)とするという仕様なのではないかと思われます。


解決方法


ラベルの個数を明確に指定してあげました。
815b4b52a62af0db06e1b5e2a518ac52.png

明示って大事ですね。



【Firebase】 Realtime Database 実装時に詰まった箇所(DB設計編)

概要


Androidアプリ ツケ台帳 を作る際にFirebase realtimedatabaseを初めてさわったのですが、
特に詰まった部分を、備忘録かねて初心者的な目線でメモしてみます(DB設計編)

アプリの解説、過去の投稿は→こちら
Google Play で手に入れよう

スクリプト編もあります→スクリプト編



詰まりポイントと解決方法


key名の付け方
末端のkey名は小文字にする必要があるようです。
大文字でもDB設計できてしまいますが、スクリプト内で setValue(key)する際にkeyの文字列が全て小文字として認識されるようです。



keyとvalue
DBからデータを読み出す場合は末端のデータを抜き出す場合以外、基本的にkeyで検索するのでデータ作成時のkeyのつけ方は重要です。
私は以下のように場合分けして実施していました。

・データの順番が重要な場合(例:掲示板への投稿メッセージのようなデータなどで、投稿順で並べ替えて表示したい場合)
push()でkeyを自動生成する。
 時系列になるように生成してくれるので管理が楽です。

・データの順番が重要でない場合(例:グループに所属するユーザのデータなどで、特にユーザ間に優劣がない場合)
:key = valueとする。
 検索の際、valueの値でもkeyの値でも検索できるので楽。



以上です。

【Firebase】 Realtime Database 実装時に詰まった箇所まとめ (スクリプト編)

概要


androidアプリ ツケ台帳 を作る際にFirebase realtimedatabaseを初めてさわったのですが、
特に詰まった部分を、備忘録かねて初心者的な目線でメモしてみます(スクリプト編)

アプリの解説、過去の投稿は→こちら
Google Play で手に入れよう


解決方法


Firebaseのリスナー内でcontextを参照する場合
this だけでは取得できなかった。contextの後に @○○Activity が必要。
17a6c7c4c0c39f376f96210097f32fa1.png

※コピペでやっているとハマりやすい



読み取り時のSnapshotの参照先
できるだけ狭い範囲を指定すべき。
後からセキュリティルールを定める時に困るし、一度に読むデータが多くなるのでユーザが増えると重くなる原因となる。

少なくともルート(下記画像ではdatabase)を参照するのはやめる(セキュリティルールが全く設定できなくなる)。
NG例:database.addListenerForSingleValueEvent(Listener)
よい例:database.child("messages").addListenerForSingleValueEvent(Listener)


これをやるとルート直下のノードを複数読み込みたい場合に困るが、私の場合はリスナーを入れ子にした。その際、リスナー・スナップショットの名前は変えること。
(他にもっといい方法があるかもしれない。。)
d22c205c7d405673ff12394fddf9622b.png



リスナー内スクリプトの実行タイミング
リスナー内のスクリプトは、配置に関わらずリスナー以外のスクリプトがすべて実行された後に実行される。
例:onCreate内に 命令文1→リスナー内命令文→命令文2 の順番で記入されていた場合、実際には
命令文1→命令文2→リスナー内命令文 の順番で実行される。
Firebaseの読み取りは1回限りの場合もリスナーを使わないといけないので実行順に注意が必要。後から読み取りのリスナーを実装するとハマりやすい罠。

対策として、読み取りの命令文だけでなくその前後のスクリプトもまとめてリスナー内に入れていた。



リスナーの種類
特殊な事情がない限り
.addValueEventListener
でなく
addListenerForSingleValueEvent(1回だけ実行して消えるリスナー)
を使うべき。リスナーが残っていて変な挙動をする例がよくある。特に初心者(私を含む)の場合はリスナーを活用した開発は難しいので.addValueEventListenerを原則使うようにしたほうが余計なトラブルがないだろうと思われる。
これはクエリを使ったリスナーでも同様。



TextViewなどの初期値
Firebaseだけの問題ではないかもしれないですが、DBから読み取って表示するデータは画面表示の際に読み込みのラグが発生するためxmlに初期値を入れておくとTextViewがチラついて見栄えが悪いです。


【Android】TextViewの内容を動的に変更する方法

自作androidアプリ Flexible Dice
では、TextViewを動的に変更することでダイスロールを表現しています。
その際に結構迷ったので備忘録的にメモします。

Google Play で手に入れよう


方法


色々調べた結果、以下のことがわかりました。
・画面更新の方法として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 にはリワード広告を実装しているのですが、
その実装の際に詰まった点を備忘録的にメモしてみます。

Google Play で手に入れよう

詰まった点


アプリ認証後しか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ファイルに使いたいスタイルを新規作成し、xmlandroid:backgroundに設定するだけ


自作androidアプリ Flexible Dice の場合。
Google Play で手に入れよう

このアプリではTextViewのスタイルを変更してダイスを表示しています。


1.drawable.xmlの新規作成
まずはスタイルを指定するdrawableファイルを作成します。

ここへ新規作成
image.png

中身はこんな感じ。背景色・枠線の丸み、幅、色を設定しています。
image.png

2.設定したい箇所への設定

こんな感じで、設定したい箇所のxmlandroid:backgroundを追記
image.png

3.結果
textviewに設定するとこんな感じになります。
Flexible Dice ではこれをダイスのUIとして使っています。
image.png