
Android Studio でエミュレーターのように接続した実機を、
操作、キャプチャーなどできるようになったんですね。

scrcpy も不要となってたんですね。
👉 【macOS / Android】scrcpy on Mac can't find "… libmbedcrypto.14.dylib" · Genymobile/scrcpy

Android Studio でエミュレーターのように接続した実機を、
操作、キャプチャーなどできるようになったんですね。

scrcpy も不要となってたんですね。
👉 【macOS / Android】scrcpy on Mac can't find "… libmbedcrypto.14.dylib" · Genymobile/scrcpy

ビルド速度が遅いので、
org.gradle.caching=true
としたら、署名付きビルドが更新されない。
「キャッシュ」のせいなのは分かるが、
いろいろ種類がありそうだよな、
Android Studio の「キャッシュ」って。
ChatGPT に聞くと、3つあるそうです。
もちろん信用はしてないです。
IDE キャッシュ
コード補完、シンタックスハイライト、プロジェクトインデックス、ビルド設定など
Gradle キャッシュ
依存ライブラリ、ビルドキャッシュ(Gradleがダウンロードしたファイルなど)
ビルドキャッシュ
build/ フォルダ内の成果物やコンパイル済みファイルなど
そして、今回の調べるきっかけとなった
org.gradle.caching=true
は「ビルドキャッシュ」のようです。
いきなり、分かったことをまとめます。
org.gradle.caching=true
は、ビルドキャッシュ。
キャッシュの範囲は、
ビルドキャッシュ < Gradle キャッシュ < IDE キャッシュ
のようなので、
キャッシュを消したいときは、
[Build] - [Clean Project]
[Build] - [Rebuild Project]
./gradlew clean
rm -rf ~/.gradle/caches
[File] → [Invalidate Caches / Restart]
rm -rf ~/.gradle
を上から順番に試していくのがいいと思います。
もちろん信用はしてません。
公式読むと良いです。
👉 Build Cache - docs.gradle.org
今回のような場合、
Gradle タスクに追加しておく方法もあるらしい。
tasks.withType(Sign).configureEach {
outputs.cacheIf { false }
}
記述場所としては、
基本的に、android {} の外、末尾に記述する。
マルチモジュールなら subprojects {} 内に。

私の場合だけども、cloudflare で。
❯ curl -sI https://android.benigumo.com/ | grep 'cf-cache'
cf-cache-status: BYPASS
どうやっても「HIT」にならない。
レスポンスヘッダーに set-cookie があると cloudflare のキャッシュが効かなくなるらしい。
Additionally, the following headers have given me grief with CF in the past, they should not be present:
Set-Cookie
👉 CF-CACHE-STATUS showing BYPASS - Website, Application, Performance - Cloudflare Community
確認すると、謎の cookie セットがある。
❯ curl -sI https://android.benigumo.com/
HTTP/2 200
date: Sun, 02 Feb 2025 06:42:13 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
vary: accept, content-type
set-cookie: 6666cd76f96956469e7be39d750cc7d9=1738478533; expires=Sun, 02-Feb-2025 07:42:13 GMT; Max-Age=3600; path=/
web リソース内を grep して、
あやしそうなプラグインを特定後、無効化しながら確認する。
私の場合は、中華産プラグインでした。
削除後。
❯ curl -sI https://android.benigumo.com/ | grep 'cf-cache'
cf-cache-status: HIT
1秒あたり15リクエストしか返せなかったのが、
キャシュが効いて71リクエストを返せるようになりました!
❯ wrk https://android.benigumo.com
Running 10s test @ https://android.benigumo.com
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 201.93ms 252.04ms 1.57s 88.06%
Req/Sec 38.47 20.07 90.00 63.01%
713 requests in 10.03s, 68.66MB read
Socket errors: connect 0, read 0, write 0, timeout 1
Requests/sec: 71.06
Transfer/sec: 6.84MB
Cloudfrare プラグインは有料化への誘導なだけなので、
記事の更新や追加時のキャッシュのパージは手動で行います。


なんとなくまだ古くさい感じはありますが。
val context = LocalContext.current
fun Context.getActivityOrNull(): Activity? {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
return null
}
fun Context.findActivity(): Activity {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
throw IllegalStateException("Permissions should be called in the context of an Activity")
}

Debug でなく Run ボタンでいけてたような気がするが
セキュリティの絡みか、今では反応がない。
なので、
コマンドラインで adb から。
❯ adb shell am broadcast -a android.intent.action.MY_PACKAGE_REPLACED
Broadcasting: Intent { act=android.intent.action.MY_PACKAGE_REPLACED flg=0x400000 }
Exception occurred while executing 'broadcast':
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MY_PACKAGE_REPLACED from pid=6153, uid=2000
ダメですか。
またセキュリティですか。
一度、ビルドして、 apk をインストールしたらいけた。
Go to Build -> Build APK, and note the location that the .apk is stored.
Then, run in terminal:
adb install -r debugapp.apk
This will trigger the MY_PACKAGE_REPLACED intent, since newer Android SDKs only allow the system to broadcast it.
👉 Android: Broadcast ACTION_MY_PACKAGE_REPLACED never received - Stack Overflow
「-r」いるんかね ? いらなくね ?
今後以下でやろう。
❯ ./gradlew assembleDebug
> Configure project :app
BUILD SUCCESSFUL in 59s
42 actionable tasks: 21 executed, 21 up-to-date
❯ find . -name "*.apk" | fzf | xargs adb install
Performing Streamed Install
Success
❯ adb shell am start -a android.intent.action.MAIN -n YOUR_PACKAGE/.TARGET_ACTIVITY
Starting: Intent { act=android.intent.action.MAIN cmp=YOUR_PACKAGE/.TARGET_ACTIVITY }
当然、バージョン番号は上げておかなければなりません。
👉 junegunn/fzf: :cherry_blossom: A command-line fuzzy finder