前回の記事では、完全ローカル完結の暗号化カメラアプリ「フォト・守」の開発思想について書きました。
今回は、実際にJavaのコードを叩き、AI(Copilot)と壁打ちしながら直面した、具体的な実装の苦労と泥臭いバグ対策の記録を技術メモとして残します。Android開発で暗号化やセキュアなUI制御を行う方の参考になれば幸いです。
1. 再生パフォーマンスの極限化:全復号から「一部復号」への転換
当初は、暗号化されたファイルを一度すべてメモリ上(または一時ファイル)に完全復号してから再生する仕様で進めていました。 しかしこれだと、ファイルサイズが大きい動画の場合、再生ボタンを押してから実際に動き出すまでに致命的なタイムラグ(待ち時間)が発生してしまいました。
そこで、「ファイルの先頭や一部のストリームだけをリアルタイムに復号しながら順次読み込む」というオンデマンド方式に切り替えました。これにより、数GBある動画でも、待たされることなく一瞬でサクサク再生が開始できるようになりました。
2. 汎用性を高めるための「Adapterの分離」
後々、別のアプリでもこの機能を使い回せるように設計したかったため、設計の初期段階でコンポーネントの共通化を意識しました。 具体的には、ファイル一覧から呼び出される「画像プレビュー用」と「動画再生用」の処理について、共通のパーツにするのではなく、それぞれのAdapterを完全に分離して実装しました。これにより、今後の別プロジェクトへの移植性が大幅に向上しています。
3. 暗号化方式の仕様変更:パスワード変更機能の追加
暗号化・復号化のコアロジック自体はAIの助けを借りたため、比較的スムーズに実装できました。しかし、開発の途中で「ユーザーが後からパスワードを変更できるようにしたい」という要望(仕様変更)が浮上しました。
単純にパスワードを変えるだけでは、過去のパスワードで暗号化したファイルがすべて開けなくなってしまいます。それをユーザーのパスワードでさらに隠すという、パスワード暗号化の階層構造を見直すリファクタリングを行いました。
4. UI/UXの試行錯誤:画像と動画の操作ロジック
アプリ内再生を快適にするため、動画画面の拡大・座標移動(ピンチイン・アウトやドラッグ)を実装しましたが、静止画(写真)側で一つ大きな罠にハマりました。
写真を表示したままスワイプして次の画像に切り替えた際、「前の画面の拡大率や座標情報」がメモリに残ってしまい、切り替え後の画像の位置やサイズがおかしくなるバグが発生したのです。 初期バージョンでは拡大縮小の座標情報を保持しようと試みましたが、表示が崩れる挙動を回避するため、現バージョンでは「画面が切り替わるごとに一回縮小(初期化)する」という安全策をとりました。この挙動のスマートな共通保持は、今後のアップデートでの課題です。
5. 【一番の苦労】バックグラウンド移行時の「徹底的な証拠隠滅」
今回、技術的に最も頭を悩ませたのが、「ユーザーがアプリを閉じてバックグラウンドに追いやった瞬間」のセキュリティ制御です。
アプリが裏に回ったとき、Androidの「最近使ったアプリ(タスク切り替え画面)」に、さっきまで見ていた写真のサムネイル(スクリーンショット)がそのまま残ってしまうのは、プライバシーアプリとして致命的です。 そのため、バックグラウンド移行を検知した瞬間に、ショートカット表示(タスクプレビュー)を確実にクリアし、かつメモリ上のパスワード情報も即座に破棄(クリア)する挙動を作り込みました。これにより、再びアプリを開くときには必ずパスワード入力を再要求する鉄壁の仕様にしています。
6. OSの「バックボタン(戻る)」の機種ごとの挙動差
現在のAndroidは、画面の端をスワイプして戻る「ジェスチャーナビゲーション」と、画面下部に三角形のボタンがある「3ボタンナビゲーション」が混在しています。 このOS側の「戻る」が押された際、暗号化のセッションをどのタイミングで安全に閉じるべきか、機種ごとの挙動の差異を吸収して一貫した安全性を保つ制御に苦労しました。
7. 重い処理の非同期化(UIスレッドの解放)
暗号化・復号化、さらには一覧画面用の「サムネイルのリアルタイム復号」は、非常にCPUを消費する重い処理です。これを普通に処理すると、画面のスクロールがガクガクになってしまいます。 一覧表示を滑らかに保つため、これらの重いデータ処理を裏側(バックグラウンドスレッド)で実行する非同期処理を徹底しました。
📥 アプリ「フォト・守」をPlayストアでチェックする
・価格:無料
・仕様:完全ローカル・通信なし
・広告:ファイル一覧下部のみ(写真・動画再生中はなし)
👉 Google Play ストアでダウンロード
🛠️ 次回予告:【設計・仕様決め編】「フォト・守」の裏側に隠された、割り切りとUI/UXのリアルなトレードオフ
無事に形になった「フォト・守」ですが、実際のビルドに向けて最もエネルギーを使ったのが「仕様決め」と「UI/UXのトレードオフ」でした。
・画像と動画でタイミングを分けた、サムネイル表示の最適化(裏側の非同期処理)
・誤操作を防ぐためのフォルダ色変更と、あえてダイアログを廃止した「長押し削除UI」
・現在迷い中】リスト表示に加えた2×2グリッド。今後4×4や8×8も用意すべきか?
・一番悩んだ箇所:アプリ固有領域への保存。アンインストールで消えるリスクをあえて「割り切った」理由
・実機テストで初めて発覚した、処理中に端末が「スリープ」してしまう致命的な罠とその解決策
・暗号化の基本ロジックから高速化(一部復号)へのリファクタリングを劇的に楽にしてくれたAIの存在
どれだけAIが優秀でも、実機で動かして初めて分かる泥臭い罠や、プライバシーアプリだからこその「引き算の美学」が盛りだくさんでした。
具体的な葛藤と仕様決めの記録は、次回の記事で詳しく解説します!




コメント