All

Navigation Componentの暗黙的DeepLinkの処理を追う

背景/概要 最近FragmentベースのNavigation Componentの導入を再検討しています。 数年前はXMLでNavGraphを作成し、actionで画面遷移を定義するのが一般的でしたが、バージョン 2.4.0からナビゲーションルートとKotlin DSLによる動的なグラフ作成が導入され…

AIフレンドリーなGitHubリポジトリ内のドキュメントにするための調査

背景/概要 生成AIの活用がコード生成からドキュメンテーションに関する活用にも広がってきた。 一例としてCopilot knowledge basesがある。 Copilot以外にも似たサービスが増えているので、それらでも活用しやすいドキュメントを書くための要点を調査する。 …

proguard-rules.proとconsumer-rules.pro

背景/概要 Androidのライブラリモジュールを作成するとconsumer-rules.proとproguard-rules.proも作成されますが、その役割を「難読化」という表面的なことしか知らずにいました。 このままではプロのAndroidエンジニアとは名乗れない気がしたので、ちゃんと…

Androidで安全にブラーをかける

背景 ブラー効果の流行 最近はアプリでブラー効果をよく見ます。 YouTube Music アプリでのブラー効果 ブラー効果を使う理由は、次のようなものだと思います。 背景をぼかすことで、その上の文字や画像に注目させたい 没入感を高める(奥行きを出す) また注…

プロダクトで安全にDataStore移行する

DataStoreの紹介 Preferences DataStore と Proto DataStore Preferences DataStoreの実装イメージ ① DataStoreのインスタンス作成 ② キーの定義 ③ データの取得 ④ データの更新 Preferences Storeをプロダクトへ導入する アプリ アーキテクチャとの関係 Dat…

【RxJava学習ログ】①基本的な5つの要素

はじめに この記事について この記事はRxJavaの基本的な5つの要素の学習ログです。 Observable Operators Single Subject Scheduler 学習のモチベーション RxJavaに触れずにAndroidアプリ開発をやってきましたが、業務でRxJavaのコードを読んだり書いたりす…

レイアウトパラメータってStyleに書いていいの?

はじめに StyleはViewの外観を指定する属性(attribute)の集まりです。 そのため、Viewの属性の共通化したい時に使っていると思います。 ただ最近「レイアウトパラメータってStyleに書いていいのかなぁ」と疑問に思うことがありました。 ※ レイアウトパラメ…

グロースエンジニアになるためにどう学んでいくか

はじめに 本記事では、新卒1年目がグロースエンジニアを目指す中で学んだことを紹介します。 ただ私はまだグロースエンジニアには程遠いのであまり参考にならないと思いますが、「こんな失敗もあるのか〜」というお気持ちでご覧ください。 記事の対象者 グロ…

In-App Review API の導入とトラブルシューティング

In-App Review API とは? アプリ内でPlayストアのレビューができる機能です。 これまではユーザをPlayストアに移動させてレビューしてもらっていましたが、この In-App Review API を使うと、Playストアに移動することなくアプリ上でレビューすることができ…

ActivityのisFinishingで破棄される理由を確認する

ActivityのisFinishingでわかること 公式ドキュメントのonDestroyの章では、以下2つのシナリオを区別するのに用いると書かれています。 アクティビティが終了する(ユーザーがアクティビティを完全に閉じるか、アクティビティに対して finish() が呼び出さた…

typealiasからinline classに置き換えて代入互換性をなくす

inline class を知った inline class UserId(val value: String) Kotlin 1.4.30 のリリース記事を読んで、inline classを知ったのでドキュメントを読んでみました。 個人的にかなり有用に感じたのは、typealiasと違ってassignment-compatible(代入互換性)…

Jar出力して実行したら、resources内のファイルが見つからない

resources内のファイルを読み込み 以下のコードは、KtorでFirebaseの初期化をするためにfirebase-adminsdk.jsonをFileInputStreamで読み込んでいます。 // Application.kt fun Application.initializeFirebaseApp() { val serviceAccount = FileInputStream(…