2025/12/30

Android 16で通知を自動的にグループ化されないようにする (アプリ開発者側での話)

この記事を書いている時点ではAndroid 16においてユーザー側で通知のグループ化を無効にする方法はありません。アプリ開発者側での話になります。


Android 13~15までは、通知を作成する時にNotification.Builder#setGroup(java.lang.String)でグループキーを設定しておけばグループ化されず、個別に通知が表示されていました。しかしAndroid 16からこの回避策が効かなくなり、通知を2つ以上出すと自動的にグループ化されるようになってしまいました。

参照: Android 16 が登場

Android パブリックトラッカーでAndroid 16での通知のグループ化をアプリごとでオプトアウトできるようにと要望も上がっていましたが、今のところGoogleはやらないようです。

参照: Per-app setting to opt-out of Android 16 notification grouping


Androidアプリの開発者向けのページの 通知の動作 によるとAndroid 16.0 (API レベル 36) では

次の通知は自動的にグループ化されます。

  • 要約のない通知
  • 子通知のない通知
  • 子通知が 1 つまたは少ない通知

となっています。つまり要約(Summary)があればグループ化されなさそうです。

で、ボタンをタップして通知を出すサンプルコード。


    button.setOnClickListener { v ->
val notification = Notification.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_android)
.setGroup("group-$count")
.setContentText("count=$count")
.build()

notificationManager.notify(count, notification)

val notificationSummary = Notification.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_android)
.setGroup("group-$count")
.setGroupSummary(true)
.build()

notificationManager.notify(Integer.MAX_VALUE - count, notificationSummary)

count++
}

1つの通知につき1つの要約と通知ごとにグループキーを変更する必要があるのでで、少し手間ではありますがこれでグループ化を回避できます。こんな感じになります(エミュレータでやってるので動作が遅いです)。


上の動画でも分かるのですが、いくつも通知を出せるわけではなく6つになるとグループ化されてしまいます。

ソース https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/services/core/java/com/android/server/notification/NotificationManagerService.java#672 を見てみると6個以上になった時にグループ化するように設定されていてこの値は変更できないので6個以上出すのは諦めましょう。


2025/11/17

Android Studioから起動するエミュレータにコマンドラインオプションを設定する

Android Studioから起動するエミュレータにコマンドラインオプションを設定できないかと検索していたら

How to pass command line options to the emulator in Android Studio? - Stack Overflow

に答えがあったので。


起動オプションを設定するには環境変数「studio.emu.params」に値を設定します。注意点としてはスペースを使用せず、「,」 (カンマ)で繋いでいきます。

例えばタイムゾーンを東京にする場合コマンドラインオプションでは

-timezone Asia/Tokyo

と「-timezone」と「Asia/Tokyo」の間にスペースありますが、環境変数で設定する場合、スペースをカンマで置換した形

$ set studio.emu.params=-timezone,Asia/Tokyo

にします。


Android Studio Otter | 2025.2.1 では https://android.googlesource.com/platform/tools/adt/idea/+/refs/tags/studio-2025.2.1/android/src/com/android/tools/idea/avdmanager/AvdManagerConnection.kt#308

で環境変数を取得して設定していました。コミットログを見ると7年以上前からあったらしい。

Diff - dd839c9436e425381256cb2e984305c09a7fbbd9^! - platform/tools/adt/idea - Git at Google

もっと早く知りたかった


2025/07/19

Pixel 6a でバッテリーのサイクル回数を見る

先日発表されたGoogle Pixel 6a バッテリー パフォーマンス プログラム で使用しているPixel 6aが対象だったのと、2025年7月のアップデート (BP2A.250705.008) を入れた後でも、Pixel 6aではバッテリーのサイクル回数が375回以上にならないとサイクル回数が表示されないようです。


なのでバッテリーのサイクル回数を見る方法のメモ書き。


アプリをインストールして見る


「android バッテリー サイクル回数」などで検索すれば出てきます。


コマンドで見る (恐らくAndroid 12以上)


$ adb shell cat /sys/class/power_supply/battery/cycle_count

でサイクル回数が出力されます。
# Pixel 3 (Android 12)でも出力されたのでAndroid 12でもサイクル回数が取得できる?


デバイス診断で見る


Pixel 6aの設定アプリからは消えてしまったサイクル回数はデバイス診断を起動すれば見れます。
amコマンド

$ adb shell am start -n com.android.devicediagnostics/.MainActivity

で起動するか、ショートカットを作成するなどして、デバイス診断を起動をします。

「コンポーネントの状態」 →「バッテリーの状態」でサイクル回数が表示されます。 (初回利用日時は取得できないようです)




アプリを作る(?) (Android 14以上)


Intent intent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
if (intent != null) {
    int cycleCount = intent.getIntExtra(BatteryManager.EXTRA_CYCLE_COUNT, -1);
    ~ cycleCount を画面等に出す ~
}

2024/05/24

povo2.0のSIMへの電話番号の書き込みで気付いたこと

 povoのサポートのチャットから依頼し、povo2.0のSIMに電話番号を書き込んでもらいました。

Android 14からは設定 → デバイス情報 → 電話番号 のタップで表示される(Android 13の時は電話番号が表示されなかったような気がする)のですが、SIMへの電話番号の書き込み前後で何か変化があるか気になったので。

検証はPixel 6a (Android 14, ビルド番号 AP1A.240505.004 (Android セキュリティアップデート: 2024/05/05))。


SubscriptionManager#getPhoneNumber(int) で電話番号を取得した場合

電話番号書き込み前は +8190xxxxxxxx

と国番号が付いた形式で返ってきたのが

電話番号書き込み後は 090xxxxxxxx

の形式で返ってきました。


Google電話アプリ

デュアルSIMで使用している場合、Androidの設定 → ネットワークとインターネット → 通話とSMS → 通話 で「毎回確認」に設定していると掛ける時にどちらのSIMを使用するかダイアログが表示されるのですが、書き込み前は電話番号は表示されていなかったのが表示されるようになっていました。

電話番号書き込み前


電話番号書き込み後



2022/11/07

Termuxがリポジトリのエラーで起動できない場合の直し方

久々にTermuxを起動したら

と起動できなくなってたので直し方。

TermuxはF-Droid https://f-droid.org/packages/com.termux/ のバージョン0.118.0(118) です。

手順は

1. Failsafeで起動

2. 環境変数PATHに /data/data/com.termux/files/usr/bin を設定

3. 必要なら sources.list を編集

4. termux-change-repo を実行

5. パッケージの更新

6. Failsafeで起動したTermuxを終了

になります。


以下細々した説明。

Termuxのアイコンを長押ししてFailsafeで起動します。


Failsafeで起動した場合、/data/data/com.termux/files/usr/bin へのPATHが設定されていないので設定し直します。(termux-change-repoから呼ばれるコマンドが /data/data/com.termux/files/usr/bin にあるので)

Failsafeから起動すると /data/data/com.termux/files/home にいるので

$ cd ../usr/bin

で /data/data/com.termux/files/usr/bin に移動してから

$ export PATH=`pwd`

で現在いるディレクトリ(/data/data/com.termux/files/usr/bin)をPATHに設定し直します。


termux-change-repoを実行しリポジトリの再設定をしたのですが、署名のベリファイでエラーが出たので https://github.com/termux/termux-packages/wiki/Mirrors#primary-host に書かれているエントリーに直します。

/data/data/com.termux/files/usr/bin にいるので

$ cd ../etc/apt

で /data/data/com.termux/files/usr/etc/apt に移動してから

$ nano sources.list

で sources.list を編集します。エントリーは

deb https://packages-cf.termux.dev/apt/termux-main stable main

とCloudFlareのが設定されていたのですがベリファイでエラーが出てるので

deb https://packages.termux.dev/apt/termux-main stable main

に変更し保存。

termux-change-repoを実行します。

$ termux-change-repo

使用するリポジトリを選択します。



リポジトリのエントリーが変更されるとそのままパッケージのアップグレードに進むのでアップグレードします。アップグレードが終了したらFailsafeで起動したTermuxを終了します。

これでTermuxが起動するようになりました。

2022/10/25

Android 13では通知を2つ以上出すとグループ化される

 Android 13から同じアプリが2つ以上の通知を送信した場合に、グループ化が指定されていないと自動でグループ化されます。(たまに2つ表示されるときもあるのですが、ソースは追ってません)

ドキュメント(日本語 / 英語)では4つ以上となっていますが、今の所ドキュメントは修正されていないようです。

参考:

Android 12Lまでは config_autoGroupAtCount の値が「4」でしたが

https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-12.1.0_r1/core/res/res/values/config.xml#4097

Android 13から「2」に変更されました。

https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-13.0.0_r1/core/res/res/values/config.xml#4274

変更のコミットログ

https://android.googlesource.com/platform/frameworks/base/+/7829fad8435b086867f624d30e763238e1866af9%5E%21/#F0


2023/01/09 追記

IssueTracker に投げてみました。

それから文字だけだと分かり辛いので画像を追加しました。

Android 12Lまでは通知を4つ出した時点でグループ化




Android 13からは通知を2つ出した時点でグループ化




2022/02/03

APK内のclasses.dexが圧縮されない

Google PlayにアップロードするときはAndroid App Bundle形式になってきてて気にならなかったりするのでメモがてら。

AGP 4.2.0-alpha07で変更されたらしく、minSdkが28以上で作成されたAPK内のclasses.dexは圧縮されません。

https://issuetracker.google.com/issues/199427345?pli=1#comment3


Android Gradle pluginのリリースノートには当初載ってなかったらしく追加されています。

DEX files uncompressed in APKs when minSdk = 28 or higher

以前のようにclasses.dexを圧縮したい場合は↑のリンク先にもあるようにbuild.gradleに

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

を追加します。

2022/01/23

5G n79対応のAndroid端末 (2023/09/22現在)

5G n79に対応しているのに載ってないAndroid端末は書いてる人が気付いてないか、買う気のないメーカーまたは機種です。
2022/02/06 Astro Slide 5Gを追加
2022/02/09 AQUOS wish (キャリア販売以外) を追加
2022/03/26 Xperia 5 III SIMフリー版を追加
2022/04/20 適宜更新されているようなのでdocomoからの発売機種はリンクのみに変更
2022/05/12 AQUOS R7 (ソフトバンク) を追加
2022/07/09 Xperia 10 IV (楽天モバイル) を追加
2022/07/15 Xperia 10 IV (キャリア販売以外) を追加
2022/09/01 Desire 22 proを追加
2022/09/12 Xperia 1 IV XQ-CT44 を追加
2022/09/26 AQUOS sense7 SHG10 (au) を追加
2022/09/29 Xperia 5 IV (楽天モバイル) を追加
2022/11/04 AQUOS sense7 (楽天モバイル) を追加
2022/11/16 AQUOS sense7 (キャリア販売以外) を追加
2023/01/19 Xperia 5 IV (キャリア販売以外) を追加
2023/04/20 Android One S10 (ワイモバイル) を追加
2023/05/11 Google Pixel 7a, Xperia 1 V (キャリア販売以外), Xperia 10 V (楽天モバイル) を追加
2023/06/09 AQUOS wish3 (楽天モバイル) を追加
2023/06/30 Xperia 10 V (キャリア販売以外) を追加
2023/07/06 razr 40 ultra を追加
2023/07/13 AQUOS wish3 (キャリア販売以外) を追加
2023/07/27 Pixel Fold を追加
2023/08/23 AQUOS R8 (キャリア販売以外), AQUOS R8 pro (キャリア販売以外) を追加
2023/09/22 Xperia V 5 (キャリア販売以外、楽天モバイル)を追加

Google

モデル名 発売日 発売時のOSのバージョン
Pixel Fold 2023/07/27 Android™ 13 Google Pixel Fold の技術仕様と画面サイズ - Google ストア
Pixel 7a 2023/05/11 Android™ 13 Google Pixel 7a の技術仕様 - Google ストア


HTC

モデル名 発売日 発売時のOSのバージョン
Desire 22 pro 2022/10/01 Android™ 12 HTC Desire 22 pro | HTC 日本


Microsoft

モデル名 発売日 発売時のOSのバージョン
Surface Duo 2 2022/01/11 Android™ 11 スペック


Motorola

モデル名 発売日 発売時のOSのバージョン
razr 40 ultra 2023/07/21 Android™ 13 motorola razr 40 ultra
razr 5G 2021/03/26 Android™ 11 Motorola Razr 5G


Planet Computers

モデル名 発売日 発売時のOSのバージョン
Astro Slide 5G 2021/11/xx ? Android™ 11 スペック


SHARP (キャリア販売以外)

モデル名 発売日 発売時のOSのバージョン
AQUOS R8 pro SH-R80P 2023/08/31 Android™ 13 スペック
AQUOS R8 SH-R80 2023/08/31 Android™ 13 スペック
AQUOS wish3 SH-M25 2023/07/21 Android™ 13 スペック
サポート
AQUOS sense7 SH-M24 2022/11/25 Android™ 12 スペック
サポート
AQUOS sense6 SH-M19 2021/11/26 Android™ 11 スペック
サポート
AQUOS R6 SH-M22 2021/09/24 Android™ 11 スペック
サポート
AQUOS sense5G SH-M17 2021/03/12 Android™ 11 スペック
AQUOS wish SH-M20 2022/02/18 Android™ 11 スペック
サポート


Sony (キャリア販売以外)

モデル名 発売日 発売時のOSのバージョン
Xperia 5 V XQ-DE44 2023/10/中旬 Android™ 13 スペック
Xperia 10 V XQ-DC44 2023/08/04 Android™ 13 スペック
サポート
Xperia 1 V XQ-DQ44 2023/07/14 Android™ 13 スペック
サポート
Xperia 5 IV XQ-CQ44 2023/02/01 Android™ 12 スペック
サポート
Xperia 1 IV XQ-CT44 2022/09/16 Android™ 12 スペック
サポート
Xperia 10 IV XQ-CC44 2022/07/22 Android™ 12 スペック
サポート
Xperia 5 III XQ-BQ42 2022/04/22 Android™ 12 スペック
サポート
Xperia PRO-I XQ-BE42 2021/12/15 Android™ 11 スペック
サポート
Xperia 1 III XQ-BC42 2021/11/19 Android™ 11 スペック
サポート
Xperia 5 II XQ-AS42 2021/05/28 Android™ 11 スペック
サポート
Xperia PRO XQ-AQ52 2021/02/10 Android™ 10 スペック
サポート
Xperia 1 II XQ-AT42 2020/10/30 Android™ 10 スペック
サポート


docomo

対応周波数帯 - NTTドコモ 参照 (PDF)


au

モデル名 発売日 発売時のOSのバージョン
Pixel Fold 2023/07/27 Android™ 13 Google Pixel Fold 実装周波数一覧 (PDF)
au携帯電話などの対応周波数帯一覧
Pixel 7a 2023/05/11 Android™ 13 Google Pixel 7a 実装周波数一覧 (PDF)
au携帯電話などの対応周波数帯一覧
AQUOS sense7 SHG10 2022/11/11 Android™ 12 au携帯電話などの対応周波数帯一覧


ソフトバンク

モデル名 発売日 発売時のOSのバージョン
Pixel Fold 2023/07/27 Android™ 13 Google Pixel Fold 搭載周波数帯一覧 (PDF)
Pixel 7a 2023/05/11 Android™ 13 Google Pixel 7a 搭載周波数帯一覧 (PDF)
AQUOS R7 2022/07/08 Android™ 12 SHARP AQUOS R7 搭載周波数帯一覧 (PDF)

参考: SIMロックが解除可能な機種及びSIMフリー機種の周波数帯一覧 (PDF)



ワイモバイル

モデル名 発売日 発売時のOSのバージョン
Android One S10 2023/01/19 Android™ 13 京セラ Android One S10 搭載周波数帯一覧  (PDF)

参考: SIMロックが解除可能な機種及びSIMフリー機種の周波数帯一覧 (PDF)


楽天モバイル

モデル名 発売日 発売時のOSのバージョン
Xperia 5 V 2023/10/中旬 Android™ 13 スペック詳細
AQUOS wish3 2023/07/06 Android™ 13 スペック詳細
Xperia 10 V 2023/07/06 Android™ 13 スペック詳細
AQUOS sense7 2022/11/04 Android™ 12 スペック詳細
Xperia 5 IV 2022/10/21 Android™ 12 スペック詳細
Xperia 10 IV 2022/07/08 Android™ 12 スペック詳細
AQUOS wish 2022/01/21 Android™ 11 スペック詳細

2021/11/03

Android 12のクイック設定にWi-Fiとモバイルデータを追加する (エミュレータでの話)

2022/08/18 追記

Android 13ではクイック設定のWi-Fiとモバイルデータは分離できなくなりました。

変更時のコミット

https://android.googlesource.com/platform/frameworks/base/+/29c2e807e010ca0229e9db1d036649f3b7c21134%5E%21/

2022/08/18 追記ここまで

以下Android 12での内容です。


ここではAndroid Studioのエミュレータを使用しています。

実機では確認していませんので実機で設定を変更される方は自己責任でお願いします。

2021/11/12 追記: reddit への投稿によると実機でもできるようです。

2022/02/11 追記 ここから

2022/02/08 (日本時間) にリリースされた Pixel 3のアップデート (ビルド番号 SP1A.210812.016.C1) では2021/11のセキュリティパッチが取り込まれていないので、以前と同じ方法

$ adb shell settings put secure sysui_qs_tiles "wifi,cell,$(settings get secure sysui_qs_tiles)"

のみでWi-Fiとモバイルデータをクイック設定に追加できます。

追記ここまで


Android 12になってからクイック設定のWi-Fiとモバイルデータが1つにまとめられインターネットとなりました。Android 12にアップデートした直後は

9To5Google - How to bring back the Wi-Fi and mobile data toggles on Android 12

XDA - Google explains the reasoning behind Android 12’s Internet Quick Settings tile

で紹介されている方法でできていたのですが、2021/11のセキュリティパッチを適用するとこの方法が使えなくなるようです。

コミットログを見てみると

Pixel 3a, Pixel 3a XL, Pixel 4, Pixel 4a, Pixel 4a (5G), Pixel 4 XL, Pixel 5, Pixel 5a (5G)
https://android.googlesource.com/platform/frameworks/base/+/39627225836a334d785e2176ca517effe806ec3a

Pixel 6, Pixel 6 Pro
https://android.googlesource.com/platform/frameworks/base/+/a8c61c93a4adc401781424ff87167c8f2b02c332

でクイック設定の表示する項目でWi-Fi、モバイルデータがあった場合、削除するようになっています。

9To5Google、XDAで紹介された方法ではAndroid Studioのエミュレータ (Android 12 ビルド番号 SE1A.211012.001) ではWi-Fi、モバイルの追加ができなかったので、エミュレータも恐らくこのパッチが適用されているのだろう、ということで差分からクイック設定にWi-Fi、モバイルデータを追加できないか確認してみます。


差分を見ると FeatureFlags というのが追加されています。さらに

https://android.googlesource.com/platform/frameworks/base/+/a8c61c93a4adc401781424ff87167c8f2b02c332/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java#519

https://android.googlesource.com/platform/frameworks/base/+/a8c61c93a4adc401781424ff87167c8f2b02c332/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java#124

で featureFlags.isProviderModelSettingEnabled()

https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-12.0.0_r12/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java#107

は FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL) を返しているだけなので

https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-12.0.0_r12/core/java/android/util/FeatureFlagUtils.java#89

を false で返すことができれば、Wi-Fi、モバイルデータが削除されずに済みそうです。


最初に SETTINGS_PROVIDER_MODEL (= settings_provider_model)の値を確認。

$ adb shell settings get global settings_provider_model

エミュレータでは null (キーが無い) でした。

次に SETTINGS_PROVIDER_MODEL の値を false に設定します。

$ adb shell settings put global settings_provider_model false

次にクイック設定にWi-Fi (wifi) とモバイルデータ (cell) を追加。

$ adb shell settings put secure sysui_qs_tiles "wifi,cell,$(settings get secure sysui_qs_tiles)"

コマンド実行後、クイック設定を開く。(Wi-Fi (wifi) とモバイルデータ (cell) が追加されている)
並び替えたい場合ここで行う。

最後に SETTINGS_PROVIDER_MODEL の値を元に戻す。(エミュレータでは SETTINGS_PROVIDER_MODEL のキーは無かったので削除)

$ adb shell settings delete global settings_provider_model

SETTINGS_PROVIDER_MODEL を削除したのは設定アプリでこの値を参照しているのがいくつかあったので初期状態に戻すためです。


補足: SETTINGS_PROVIDER_MODEL のキーを削除しているので、端末の再起動、クイック設定の並び替えを行うとWi-Fi、モバイルデータの項目が消えます。


最後にもう一度

実機では確認していませんので実機で設定を変更される方は自己責任でお願いします。

参考: Connectivity User Interface


2021/10/12

回転提案ボタンの消し方

回転提案ボタン(下の画像の矢印)の消し方

詳しくは Android Open Source Project の 画面の回転の提案 を参照。


回転提案ボタンを非表示にするにはPCから

$ adb shell settings put secure show_rotation_suggestions 0


回転提案ボタンを表示する(元の設定に戻す)には、デフォルトではshow_rotation_suggestionsというキーはないので

$ adb shell settings delete secure show_rotation_suggestions

でキーを削除するか

$ adb shell settings put secure show_rotation_suggestions 1

で値を1にする。


2020/06/01

Rakuten MiniのNFCのアイコンを消す

先日始まった楽天モバイルのキャンペーンでRakuten Miniを入手したのですが、ステータスバーに表示されるNFCのアイコンが邪魔なので消します。



まずPCとRakuten Miniを繋ぎ、ステータスバーで現在非表示になっている項目を取得します。

$ adb shell settings get secure icon_blacklist

自分のRakuten Miniでは

rotate

と表示されました。現在非表示になっている項目に追加する形でNFCのアイコンを非表示にします。(rotateの後に",nfc"を追加)

$ adb shell settings put secure icon_blacklist rotate,nfc

これでNFCのアイコンが消えました。


2020/02/22

Android 11 Developer Preview 1 のスマートフォン情報が入っているパッケージ

Android 11 Developer Preview 1 (エミュレータ、ビルド番号 RPP1.200123.017)で、電話アプリから「*#*#4636#*#*」で呼び出せる画面にある「スマートフォン情報」(Android 10までは携帯電話情報)が入っているパッケージが変わってた。

Android 10では com.android.settings/.RadioInfo だったのが、
Android 11 Developer Preview 1では com.android.phone/.settings.RadioInfo に変更されてた。

「スマートフォン情報」のアクティビティを直接呼び出している自分用のアプリがあるのでメモ代わりに。


Android 11 Developer Preview 1(エミュレータ)での「スマートフォン情報」


変更された時のコミット
Merge "[RadioInfo] Remove from Settings (into Telephony)"

[RadioInfo] Move from Settings to Telephony

2019/10/21

Android 10でのMIME typeの定義が更新されてた

Android 10でMIME typeの定義が更新されているのでストレージアクセスフレームワーク (SAF)の ACTION_OPEN_DOCUMENT 等でMIME typeを設定している場合、見直したほうがいいかもしれません。

Android 9までは


で定義されていたのがAndroid 10では


にある


で定義されるようになりました。


コミットログは↓参照
https://android.googlesource.com/platform/libcore/+/d5e73ac1a2c92dd929e1462b63d6e36509813486


#Android 10からは "font/*" の指定が効くようになったのでTrueTypeフォント、OpenTypeフォントのファイルのみ選択させることができますね。

2018/10/08

Android Studioのレイアウトエディタのプレビューのフォントを日本語フォントに

Android Studioのレイアウトエディタのプレビューのフォントが気になる、というのを見たので中華フォントで表示されているプレビューを日本語フォントになるようにしてみます。

Windows 8.1 (64bit), Android Studio 3.2 (Windows 64-bit)の場合、修正するファイルは
C:\Program Files\Android\Android Studio\plugins\android\lib\layoutlib\data\fonts\fonts.xml
になります。

2018/10/12 追記
ファイルを編集すると、Android Studioのアップデートに失敗します。必ずバックアップを取っておいてください。また、Android Studioのアップデートは元のファイルに戻してから行うようにしてください。
追記ここまで

でパッチ。 日本語で使用するフォント(<family lang="ja">)を中国語(簡体字)(<family lang="zh-Hans">), 中国語(繁体字), 中国語(注音符号)(<family lang="zh-Hant zh-Bopo">)より前にもってきます。

XML修正前は中華フォントで表示されていたのが


XML修正後は日本語のフォントで表示されるようになりました。

2018/09/26

AndroidXへ移行後に出たNot annotated parameter overrides @NonNull parameterという警告

はじめに
警告の抑止方法がこれで合っているのかは分かりません。


Android Studio 3.2がリリースされたので"Migrate to AndroidX..."を使ってサポートライブラリからAndroidXへ移行したところ、


Not annotated parameter overrides @NonNull parameter
This inspection reports problems related to @Nullable and @NotNull annotations usage configured in Constant conditions & exceptions inspection.

という警告が。対応としては、

File -> Settings...
-> Editor -> Inspections
-> Java -> Probable bugs -> Constant conditions & exceptions


右側の"Configure annotations"をクリックして "Nullable/NotNull Configuration"を表示後、


Nullable annotations, NotNull annotationsの「+」をクリックしてNullable (androidx.annotation), NonNull (androidx.annotation)を追加



androidx.annotation.Nullable, androidx.annotation.NonNullをチェック後、OKをクリック


で警告が出なくなった。

2018/08/14

イースターエッグ ねこあつめのねこの数え方

先日リリースされたAndroid 9でもイースターエッグのねこあつめは残っており、「Andrdoid 8.0/8.1 でのイースターエッグのねこあつめ」に書いてある手順と同じ方法でねこあつめを有効化できます。

Android 8.xの時の「たこ」も残っており、

$ adb shell am start -n com.android.egg/.octo.Ocquarium

で起動できます。


ここから本題

Android 7.x, 8.x, 9.xのイースターエッグ ねこあつめで集まったねこの数を画面上で数えようとすると手間が掛かります。そこでねこの情報が格納されている設定ファイルからねこを数えてみます。


イースターエッグ ねこあつめの設定ファイルはソースから
/data/data/com.android.egg/shared_prefs/mPrefs.xml
にあることが分かります。

設定ファイルの内容は(既にねこが集まっている場合)、以下の様になっています。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="cat:1871912869">Cat #869</string>
    <string name="cat:771645645">Cat #645</string>
    <int name="food" value="3" />
    <string name="cat:2101744869">Cat #869</string>
</map>

このうち、ねこ以外の行は
・XML宣言
・<map>
・<int name="food" value="n" /> (現在置いているエサの種類)
・</map>
の4行なので、XMLファイルの行数から4行引いてあげればねこの数になります。

root権限がある場合

直接設定ファイルの行数を数えて4引きます。

端末上なら

# wc -l < /data/data/com.android.egg/shared_prefs/mPrefs.xml

PCからだとadbで接続して

$ adb shell "su -c \"wc -l < /data/data/com.android.egg/shared_prefs/mPrefs.xml\""

で設定ファイルの行数が表示されるのでここから4引いた数がねこの数になります。

root権限がない場合

root権限がない場合、/data以下のファイルは直接読むことができません。しかし、設定ファイルはadb backupで取得することができます。手順としては、

(1) PCからadb backupでイースターエッグ (com.android.egg) の設定をバックアップ
(2) PC上でAndroid Backup Extractorを使用してバックアップファイルをTAR形式に変換
(3) TAR形式に変換したファイルから設定ファイル (mPrefs.xml) を抽出して行数 -4

でねこの数を数えることができます。
adb backupの説明は公式サイト (https://developer.android.com/studio/command-line/adb?hl=en) を参照。


(1) PCからadb backupでイースターエッグ (com.android.egg) の設定をバックアップ
-f でバックアップファイル名を指定 (この場合egg.ab) し、バックアップします。
端末とPCを接続後、

$ adb backup -f egg.ab com.android.egg

でPC側に egg.ab が作成されます。


(2) PC上でAndroid Backup Extractorを使用してバックアップファイルをTAR形式に変換
次にAndroid Backup Extractorのサイトから、
android-backup-extractor-YYYYMMDD-bin.zip (YYYYMMDDはリリース年月日)
というファイルをダウンロードし、ZIPファイルの中から abe.jar を抽出します。
(Android Backup Extractorの実行にはJREが必要になります)

引数に unpack、読み込むバックアップファイル (egg.ab)、出力するファイル名 (egg.tar) を指定して、

$ java -jar abe.jar unpack egg.ab egg.tar

でバックファイル (egg.ab) がTAR形式 (egg.tar) で出力されます。


(3) TAR形式に変換したファイルから設定ファイル (mPrefs.xml) を抽出して行数 -4
あとはtarファイルの中から mPrefs.xml を抽出し、ファイルの行数から4を引けばねこの数になります。

$ tar xOf egg.tar apps/com.android.egg/sp/mPrefs.xml | wc -l

で mPrefs.xml の行数が表示されるのでここから4引いた数がねこの数になります。


--

ここまで書いておいてなんですが、
Android 8.0 の 2018/03/01 以降のセキュリティパッチを当てるとThreadLocalRandomの動作が変わるようで、(Android 8.1, Android 9も含む。Android 7系は不明)

https://android.googlesource.com/platform/frameworks/base/+/7bcd6aa4f71a45b27a7f4486e35ebe29fa9eb507/packages/EasterEgg/src/com/android/egg/neko/Cat.java#203

で新しいねこが来る時に生成される乱数が端末を再起動しない限り同じ値を返すようになってしまって、ねこがなかなか増えない状態になってます。

プロセスが生きている間は 10 → 24 → 49 → 34 → ... のようにランダムに値を返すのですが、プロセスが一旦終了し再び実行されると 10 → 24 → 49 → 34 → ... と同じ値を返すようになっています。つまり、
新しいねこがくる(乱数で生成された値がnnn)、プロセスが終了する、
新しいねこがくる(乱数で生成された値がnnn)、プロセスが終了する、
の繰り返しになってしまい、新しく来るねこが毎回同じねこになってしまって…

2018/06/14

Termux上でFDcloneを動かす

2019/05/25 追記

Android 9に対応したFDclone 3.01iがリリースされました。
pkgコマンドでclang, make, ncurses-dev (2019/09/16 statさんの指摘により修正。2019/07の終わりに*-devなパッケージは無くなりました。)とそれらが依存する必要なパッケージをインストール後、makeコマンドでコンパイルできます。

2019/09/16 追記

ncurses-devに含まれているヘッダーファイルなどはncursesのパッケージに含まれるようになりました。
また、ncursesはTermuxの初回起動時にインストールされるので、FDcloneのコンパイルに追加で必要になるパッケージはclang, make (とこれらが依存するbinutils libffi libllvm ndk-sysroot) になります。

2019/09/16 追記ここまで

以下は古い情報です。

2019/05/25 追記ここまで


Termux上でFDcloneを動かそうとした場合、TermuxのAPTリポジトリにFDcloneは無いので自前でコンパイルする必要があります。
makeコマンド一発でコンパイルできればよかったのですが、FDcloneのInstallにもある通り、FDcloneはAndroid 4.xまでの対応となっており、Android 5.0からのサポートされた64bit環境でのコンパイルには対応していません。
ソースを修正してみたところ、少しの修正で済んだのでパッチを上げておきます。

Termuxのバージョン: 0.60
FDcloneのバージョン: 3.01g
端末は
Xperia X Compact (Android 8.0.0 (CPU ABI: arm64-v8a))
Android エミュレータ (Google Play Inten x86 Atom_64 System Image API Level 28 Revision 3)
でコンパイルし、FDcloneが起動するところまで確認しています。

パッチ FD-3.01g-android-termux.patch

FDclone コンパイル手順

コンパイルに必要なパッケージをインストールします。

$ pkg install clang make ncurses-dev

clangを動かすにあたり必要なパッケージ (binutils, libandroid-support-dev, libffi, libllvm, ndk-stl, ndk-sysroot) もインストールされます。

FDcloneのページからダウンロードしたFD-3.01g.tar.gzを展開し、

$ tar xf FD-3.01g.tar.gz

パッチを当てます。

$ patch -p1 < FD-3.01g-android-termux.patch

FDcloneのソースのあるディレクトリに移動してコンパイルして

$ cd FD-3.01g
$ make CC=clang PREFIX=$PREFIX CONFDIR=$PREFIX/etc

インストール。マニュアルは不要なので、バイナリのみインストールしています。マニュアルもインストールする場合は install-bin を install にします。(2019/05/08訂正)

$ make LN="ln -s" install-bin

2019/05/08 訂正
マニュアルもインストールする場合はMANTOPの場所を指定し、install-manを追加します。

$ make LN="ln -s" MANTOP=$PREFIX/share/man install-bin install-man

2019/05/08 訂正ここまで

Android 6.0からハードリンクの作成はできなくなっているのでlnコマンドにオプション "-s" を追加してシンボリックリンクを作成するようにします。
これでFDcloneを動かすのに必要なファイル(fd, fd-cat.C, fd-cat.ja, fd-dict.tbl, fd-unicd.tbl, fdsh)が /data/data/com.termux/files/usr/bin/ にインストールされます。


2018/06/15 追記
FDcloneを起動した状態での上下のスワイプはカーソルの上下になるので、Google 日本語入力のように左右のカーソルキーがあるソフトウェアキーボードを使用すれば、ハードウェアキーボードが無くても結構使えます。

2018/08/29 追記
Google 日本語入力の場合、カーソルキーのフリックでカーソルの上下もできることを教えていただきました。


2018/08/15 追記
2018/08/11にリリースされたFDclone 3.01hですが、FD-3.01h.tar.gzを展開したディレクトリに移動後、patchコマンドのオプションを "-p2" に変更しパッチを適用すればコンパイルできます。

$ tar xf FD-3.01h.tar.gz
$ cd FD-3.01h
$ patch -p2 < ../FD-3.01g-android-termux.patch
$ make CC=clang PREFIX=$PREFIX CONFDIR=$PREFIX/etc
$ make LN="ln -s" install-bin

2018/02/23

Android 8.0にしたXperiaでステータスバーの時計の午前/午後を消す

Xperia X CompactをAndroid 8.0にしたところ、ステータスバーの時計を12時間表示で使用している場合、Android7.xの時には無かった「午前/午後」が表示されるようになってしまいました。


邪魔なので消します。

Re: Sony Android Oreo Flavor: Accordion in Notification Bar on Network Activity
を参考にパッケージ(apk)を作成します。

まず、パッケージの情報と設定を変更する項目を指定したリソースファイルを作成

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.blogspot.zau2and.hideampm"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="26"
        android:targetSdkVersion="26" />
    <overlay
        android:priority="1"
        android:targetPackage="com.android.systemui" />
</manifest>

res/values/config.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="config_showAmpm">false</bool>
</resources>

続いてコマンドラインでパッケージの作成

パッケージの作成


$ aapt p -S res -M AndroidManifest.xml -I $ANDROID_HOME/platforms/android-26/android.jar -f -v -F hideampm.apk

アライメント (zipalign)


$ zipalign -v -p 4 hideampm.apk hideampm-align.apk

パッケージへの署名 (apksigner)


$ apksigner sign --ks キーストアのファイル --v1-signing-enabled false --out hideampm-release.apk hideampm-align.apk


キーストアのパスワードの入力後、インストール可能なパッケージが作成されるのでPCと端末を接続しインストール

$ adb install hideampm-release.apk

パッケージの設定を有効にします。

$ adb shell cmd overlay enable --user 0 jp.blogspot.zau2and.hideampm


消えました。

午前/午後を表示したくなった場合、

$ adb shell cmd overlay disable --user 0 jp.blogspot.zau2and.hideampm

とコマンドを打つか、パッケージをアンインストールします。

#設定を変更する項目で指定した「config_showAmpm」はAOSPのconfig.xmlには無い項目なのでSonyのカスタマイズかな

2018/02/07

Andrdoid 8.0/8.1 でのイースターエッグのねこあつめ

Android 7.x の時にあったイースターエッグは Android 8.0/8.1 でも引き続き遊べます。

ただ、最初から Android 8.x が入った端末では Android 7.x と同じ方法ではねこあつめを始めることはできません。
最初から Android 8.x だった端末でイースターエッグのねこあつめを有効にするにはPCから

$ adb shell am start -n com.android.egg/.neko.NekoActivationActivity

を実行します。実行後、Android 7.x でねこあつめを有効にした時と同じようにねこが表示されるので、Android 7.x の時と同じように通知にねこあつめのお皿を置いてあげれば動きます。


2018/08/14 追記
Android 9 でも引き続き遊べます。また、最初からAndroid 9 が入った端末でも上記と同じ方法で猫集めを有効にできます。
追記ここまで

2018/11/24 追記
Android 9でも遊べると以前書いたのですが、Pixelシリーズのソースを見ると、
・Pixel, Pixel XL(発売時Android 7.1.0)ではAndroid 9にアップデートしてもねこあつめが残っている
・Pixel 2, Pixel 2 XL(発売時Android 8.0.0)ではAndroid 9にアップデートするとねこあつめは(おそらく)削除される
・Pixel 3, Pixel 3 XL(発売時Android 9)は最初から無い
というものでした。
他の端末でも発売時にAndroid 8.0/8.1だった端末をAndroid 9にアップデートするとねこあつめが削除されて遊べなくなるかもしれません。
追記ここまで

2019/02/06 追記
Pixel, Pixel XLですが、Android 9 2018-12-05のセキュリティパッチ(該当するイースターエッグのソース)でねこあつめが削除されペイントになっています。
Essential PH-1はAndroid 9 2019-02-05のセキュリティパッチでねこあつめが削除されペイントになっています。
追記ここまで

Android 8.0/8.1 でねこあつめに修正が入ったかソースを見てみると Android 7.1.2 の時から3回修正が入っていました。

51efddbd3bb304de2dd47fa8cd1114ac555958bb

キャストの削除だけなので、見た目などの変更はありません。
参考: Android 8.0 の機能と API # findViewById() 署名の変更

49ddb0de55020320a4f08bd7060cb531a84fb536

Android 8.0 のイースターエッグの追加。見た目などの変更はありませんが、Android 7.x 用のまま Android 8.0 向けでコンパイルしているため、

(1) ねこが来ても通知に表示されない
(2) ねこの画像の共有時、アプリが落ちる

ようになってしまいました。

(1)の原因は Android 8.0 で通知の仕様に変更があったためです。修正する必要があったのですが忘れられていたようです。
参考: Android 8.0 の機能と API #通知

(2)の原因は Android 7.0 から FileProvider クラスを使用してファイルの共有をする必要があるのですが、FileProvider を使用していないため落ちます。
参考: Android 7.0 の動作の変更点 #アプリ間のファイルの共有

7bcd6aa4f71a45b27a7f4486e35ebe29fa9eb507

Android 8.1 では上記の2つのバグの修正と、Treatがドーナツからクッキー(オレオ)に変更されました。(クッキーと書いたのは画像ファイルがfood_cookie.xmlになっていたので)

2017/12/10

3000匹集まったので

Android 7 のイースターエッグ、ねこあつめで3000匹集まった
で3000匹のスクリーンショット