パソコンのこと

Android 16対応とAndroid 17先回り確認

1 Mins read

Android 16対応とAndroid 17先回り確認

結論から言うと、targetSdkVersion を Google Play の要件より低いままアップデートを提出すると、アップロードの時点で拒否される。 ストアに更新を出せなくなるという意味だ。新機能の話ではなく、既存ユーザーへの配信継続とストア掲載維持のための義務対応である。

Google Play は毎年8月31日に targetSdkVersion の最低ラインを1段引き上げてきた。現行(2025年8月〜)では API 35(Android 15)未満のアップデートがすべて拒否される。

施行時期 要件 未対応の場合
2023年8月〜 API 33(Android 13)以上必須 アップロード拒否
2024年8月〜 API 34(Android 14)以上必須 アップロード拒否
2025年8月〜 API 35(Android 15)以上必須 アップロード拒否
2026年8月頃(予測) API 36(Android 16)以上必須 アップロード拒否

(出典:Google Play 対象 API レベル要件

このペースから API 36(Android 16)の強制化は 2026年8月頃が有力視されている。強制化される前に対応を完了させるため、2026年06月を社内の締め切りとして逆算したのがこの記事のスコープだ。Android 17 は Beta 3 で platform stability に到達しているので、同時期に別レーンで先回り確認を回しておくと正式版が来たときに慌てずに済む。

優先順位の整理

項目 期限 優先度 いまやること
targetSdkVersion 36(Android 16)対応 2026年06月まで 最優先 主要導線の回帰、CI 固定、リリース計画確定
Android 17 Beta 3 検証 今から前倒し 高・別レーン emulator と実機で互換性確認、behavior changes 棚卸し
Android 17 新機能採用 正式版以降 低め 影響範囲が小さい箇所から PoC

ツールの足場を先にそろえる

Android 16 対応でも Android 17 先行検証でも、最初に詰まるのは OS の API より build 周りのことが多い。足場を先に固める。

要素 基準 理由
Android Studio Panda 3 stable targetSdkVersion 36 対応の作業足場として安定している
AGP 9.1.0 R8 挙動差・lint 差分を吸収しやすい
JDK 17 AGP 9.1 の前提
Kotlin 2.3.20 安定版の基準をそろえる
plugins {
    id("com.android.application") version "9.1.0" apply false
    id("org.jetbrains.kotlin.android") version "2.3.20" apply false
}

CI の JDK 17 固定・AGP 更新・R8 差分の吸収は、Android 17 の準備を兼ねつつ Android 16 対応を通すための整地でもある。

補足:現場の Kotlin バージョン実態と移行コスト

表の「Kotlin 2.3.20」はあくまで推奨基準。実際の現場では 1.9.x 系がまだ多く残っている。日本の金融・公共・大規模案件は特に保守的で、「安定しているから上げない」判断が長く続きやすい。

下図は JetBrains の公開エコシステムデータおよびコミュニティ観察にもとづく 2026年初時点の推計

現場の Kotlin バージョン分布(2026年初・推計)

(推計値。正確な版別シェアは JetBrains Developer Ecosystem Survey の最新版を参照)

1.9.x から 2.x に上げる場合、Kotlin 単体ではなく Compose・Coroutines・AGP の一括更新になることが多い。K2 コンパイラへの切り替えで型推論の挙動が一部変わり、ビルドエラーが出るケースがある。「今の 1.9.x で動いているアプリを今すぐ上げる必要はない」という判断も現実的な選択肢。

現在の Kotlin Compose Compiler 方式 最低 AGP 升格時の主な注意
1.9.x 従来の compose_compiler_extension_version 8.x 現状維持可。ただし EOL 近い
2.0.x Compose Compiler Plugin(Kotlin plugin に統合) 8.4 以上 Plugin 方式への切り替え必須
2.1.x 同上 8.7 以上 K2 デフォルト化。Compose の安定度最良
2.3.x 同上 9.0 以上 2026年現在の最前線。AGP 9.1 前提

Android 17 で先に押さえたい動作変更

新機能より動作変更のほうが既存アプリへの影響が大きい。全アプリに効く変更に絞って先に確認する。

変更点 影響を受けやすいアプリ 先に確認するところ
usesCleartextTraffic 非推奨化の流れ HTTP を許可しているアプリ全般 検証環境・社内接続を network security config へ切り替え
URI 権限の暗黙付与廃止方向 共有・カメラ・添付ファイル渡しがあるアプリ 明示的な権限付与に書き直し
IME 可視性(回転後)の挙動変化 入力フォームを持つすべての画面 ログイン・申込・検索導線で回帰確認
バックグラウンドオーディオ制約強化 再生・通話・音声通知系アプリ フォアグラウンドサービス移行の要否確認

Android 16 ・17 同時対応のテスト優先度

Android 16 対応と Android 17 先行検証を並行するとき、「どちらの検証に何を必ず遭すべきか」が曖昧になりやすい。下表は「対応済みと見なせる条件」を紏展できるよう、テスト領域ごとの必須・優先度を定義する自分たちの QA 制御記刻として使う。

テスト領域 Android 16 本番 Android 17 先行
ログイン・会員導線 必須 必須
WebView 画面 必須 必須
push / 通知復帰 必須 優先
バックグラウンド処理 必須 優先
MDM / 企業端末制約 優先 優先
Android 16/17 の新機能採用(予測変換・Compose 新 API 等) 後回しでよい 余力があれば

日本の業務アプリに固有のリスク

海外発信の一般的な Android 対応記事ではほぼ触れられないが、日本の金融・公共・会員基盤系アプリには固有の引っかかりどころがある。「Android 16/17 が追加した新機能(通知チャネル変更・権限モデル刷新・Compose 新コンポーネント等)を積極的に取り込む」より「ログイン・決済・通知など既存の主要な画面フローが壊れていないか」を先に確認するプロジェクトは、下表の項目をチェックリストにして先に回すこと。

論点 詰まる理由 先にやる確認
WebView 会員・申込・決済導線でまだ多い 認証、Cookie、リダイレクト、表示崩れ
証明書・企業 Wi-Fi 社内・業務端末で詰まりやすい 通信失敗、証明書更新、社内 NW 動作
MDM 制約 企業配布アプリで影響大 権限、バックグラウンド、配布制御
push / バックグラウンド 会員・金融・運用通知に直結 復帰、遅延、強化後の動作確認
端末更改タイミング 利用者の OS バラつきが大きい 対応 OS 範囲、QA 端末計画の見直し

今やるならこの順番

  1. targetSdkVersion 36(Android 16)を含んだ更新を 2026年06月までにリリースする前提でリリース計画を確定する
  2. Android Studio・AGP・Kotlin・JDK の足場をそろえる
  3. Android 16 の主要導線テストと回帰を先に通す
  4. 並行で Android 17 専用ブランチを切って emulator と実機の検証レーンを立ち上げる
  5. behavior changes を security / media / connectivity から順に確認する
  6. targetSdk 37 を上げた CI を別で回す
Read more
パソコンのこと

Java 26 は入れるべき? 良さそうな点と注意点を現場向けに整理

1 Mins read

Java 26 が 2026/03/17 に GA。

今回も preview 系は多いんだけど、HTTP/3、G1 GC、仮想スレッドまわりなど、地味に効きそうな変更が結構ある。

逆に、古い API や昔の JVM フラグをそのまま抱えてる環境だと、上げた時に引っかかりそうな点も見えてきた。

特に Java 8 からだと差分が大きいので、Java 26 の新機能だけ見るより、どこでハマるかを先に見たほうがいい感じ。

ざっくり図

Java 8 から Java 26 への移行フロー
Java 8 から Java 26 へ上げる前に、まず LTS で中間整理を入れる流れ

Java 8 運用中
	|
	+-- 古い API / ライブラリ棚卸し
	|      - javax.xml.bind
	|      - Thread.stop
	|      - sun.*
	|      - 古い JVM フラグ
	|
	+-- まずは LTS で検証
	|      - Java 17 か 21 で一度テスト
	|
	+-- その後 Java 26 の差分確認
			 - HTTP/3
			 - G1 改善
			 - 仮想スレッド周辺
			 - セキュリティ既定値の変化

良さそうな点

java.net.http.HttpClient が HTTP/3 対応になった。

アプリ側のコードを大きく変えずに、HTTP/3 が使える余地が広がるのは素直に便利そう。

あとは G1 GC の同期削減、巨大オブジェクト回収の改善、AOT Object Cache の Any GC 対応など、性能系の修正がわりと堅い。

仮想スレッドも、クラス初期化待ちで carrier thread を握りっぱなしにしにくくなってるので、変な詰まり方を減らせそう。

地味にうれしいのはこのへん。

  • ProcessAutoCloseable 対応
  • UUID.ofEpochMillis() が追加されて UUIDv7 系の扱いがしやすい
  • ByteOrder が enum 化されて switch で扱いやすい

例えば HTTP Client は、こんな感じでコードの見た目を大きく変えずに恩恵を受けやすい。

var client = HttpClient.newBuilder()
	.version(HttpClient.Version.HTTP_3)
	.build();

var request = HttpRequest.newBuilder()
	.uri(URI.create("https://example.com/api/status"))
	.GET()
	.build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());

それと ProcessAutoCloseable になったので、外部コマンド実行の後始末も少し素直になる。

try (var process = new ProcessBuilder("java", "-version").start()) {
	var exitCode = process.waitFor();
	System.out.println("exit=" + exitCode);
}

注意したい点

まず Thread.stop() は削除済み。

昔の保守コードに残っていると、JDK 26 ではもうコンパイル段階で止まる。

Applet API も削除されているので、古い資料やサンプルをそのまま引っ張っている環境は当然ながら要注意。

それと、JVM フラグ整理も進んでいて、-XmaxjitcodesizeMaxRAMAggressiveHeap あたりを惰性で使っていると見直し対象になる。

RMI over TLS は endpoint identification が既定で効くので、証明書の SAN が雑な環境は通信失敗が出るかもしれない。

HttpRequest.Builder.timeout() がレスポンス本文受信まで含むようになった点も、既存の timeout 設計次第では体感差が出そう。

あと Java 8 のまま長く運用していた環境は、Java 26 へ一気に上げる前に、新旧対比でこのへんを意識したほうがいい。

  • Java 8 は classpath 前提で動いていたが、Java 9 以降のモジュール境界や内部 API 依存が表に出やすい
  • Java 11 で Java EE / CORBA 系モジュールが削除されているので、javax.xml.bind などが残っていると別途対応が要る
  • 反射やセキュリティ既定値が厳しくなっていて、昔は動いていたコードが警告や失敗になることがある
  • 古い TLS 設定、keystore、RMI 通信は上げた直後に事故りやすい

それと日本の業務システムだと、文字コードも地味に本丸。

特に銀行系や基幹系は、バックオフィスやホスト連携でいまだに Shift_JIS 系が前提のことがある。

ここで雑に「今どき UTF-8 でしょ」と寄せると、画面は動くのに帳票や外部連携だけ文字化け、みたいな嫌な事故が起きやすい。

Java 8 の時代は、Windows 上でたまたま default charset が windows-31j になっていて動いていたコードが結構ある。

でも JDK 18 以降は default charset が UTF-8 基本になっているので、new String(bytes)FileReader のような「暗黙の文字コード頼み」は、そのまま持っていくと差分になりやすい。

さらに実務では Shift_JISwindows-31j を同一視しすぎないほうがいい。

Java の charset 一覧上はどちらも使えるけど、windows-31j / MS932 は Windows 系拡張を含むので、丸数字、環境依存文字、IBM/NEC 拡張の扱いで期待値がズレることがある。

銀行系のファイル授受やホスト接続だと、相手が求めているのは「Shift_JIS と言いながら実質 CP932」なのか、「本当に Shift_JIS の範囲だけ」なのか、あるいは IBM 系ホストコードまで含むのかを先に確認したほうが安全。

日本語周りで見るなら、このへんは移行前チェックに入れておいたほうがいい。

  • バイト列変換で charset を明示しているか
  • Shift_JISwindows-31j を混同していないか
  • 丸数字、波ダッシュ、全角チルダ、機種依存文字、外字の round-trip を確認したか
  • 帳票 CSV、固定長ファイル、ホスト送受信の文字単位とバイト単位を取り違えていないか
  • 置換文字で握りつぶさず、変換不能文字を検知できるか

なので、Java 8 からなら「いきなり 26 本番」より、まず 17 か 21 の LTS でビルドとテストを通して、そこで古い依存を削ってから 26 を見るほうが現実的。

Java 26 自体は面白いんだけど、Java 8 からの差分を吸収する作業のほうが実務では重いはず。

上げる前に見るところ

まずは古い API とフラグを雑にでも洗うのが早い。

grep -R "Thread\.stop\|Xmaxjitcodesize\|AggressiveHeap\|MaxRAM" ./

Java 8 由来の依存もまとめて見たいなら、これも追加で流しておくと良さそう。

grep -R "javax\.xml\.bind\|javax\.activation\|CORBA\|sun\." ./

文字コード前提を雑に洗うなら、このへんも引っかけておくと見落としが減る。

grep -R "Shift_JIS\|MS932\|windows-31j\|Cp943\|Cp930\|EBCDIC\|file.encoding" ./

Java 側でも、暗黙の default charset に乗らず、変換不能文字を検知する書き方に寄せたほうが事故りにくい。

var charset = Charset.forName("windows-31j");
var encoder = charset.newEncoder()
	.onMalformedInput(CodingErrorAction.REPORT)
	.onUnmappableCharacter(CodingErrorAction.REPORT);

var bytes = encoder.encode(CharBuffer.wrap("顧客コード①"));
System.out.println(bytes.remaining());

ざっくり比較するとこんな感じ。

  • Java 8 から見た Java 26: 差分が大きいので移行案件
  • Java 17 から見た Java 26: 新機能評価と既定値差分の確認が中心
  • Java 21 から見た Java 26: 追従コストは比較的軽め

もう少し実務寄りに並べるとこう。

観点 Java 8 Java 17 Java 21 Java 26
現場での立ち位置 古い基盤がまだ多い まず移行先として堅い いまの主力候補 先行評価と追従候補
移行難易度 ここから上げるのが重い 8 からの受け皿にしやすい 17 からなら延長しやすい 21 以降からなら比較的軽い
気にする点 Java EE 系削除、内部 API 依存 反射や module 境界 仮想スレッド導入判断 HTTP/3、GC改善、既定値差分
向いている進め方 まず棚卸し 先に CI を通す 本番標準化しやすい 検証環境で差分確認

Java 8 の案件だと、Java 26 の新機能に目が行く前に、まず Java 8 時代の負債をどう剥がすかのほうが本題になりやすい。

逆にすでに Java 17 や 21 にいるなら、Java 26 は「全面移行」というより、性能改善や既定値変更をどう取り込むかを見るフェーズだと思う。

あとはこのあたりを CI で確認しておくと安心。

  • HttpClient の timeout やヘッダまわり
  • 証明書検証が絡む RMI / TLS 通信
  • jlink を使ったランタイム作成
  • XML Signature や古い keystore 依存
  • Shift_JIS / windows-31j / ホスト連携ファイルの round-trip テスト

preview / incubator 機能は面白いんだけど、本番投入というよりは評価用として見たほうがまだ自然かなという印象。

まとめ

Java 26 は派手な一撃というより、性能、標準 API、運用上の安全側変更が積まれている感じ。

普通の業務システムだと、HTTP/3、GC、仮想スレッド改善あたりは前向き。

一方で、古いコードや古い運用フラグが残っている現場ほど、先に棚卸ししてから上げたほうが事故は少なそう。

日本語環境なら、特に文字コードは後回しにしないほうがいい。

Shift_JIS 系やホスト連携が残っている現場では、Java 26 の良さを評価する前に、default charset 依存と日本語 round-trip をつぶすほうが優先度が高いはず。

特に Java 8 からなら、先に 17 か 21 で中間整理を入れて、そのうえで Java 26 の恩恵を取りに行くほうが筋が良さそう。

Read more
LinuxPHPWordpressパソコンのこと

Wordpress "mixed content the page at ' url ' was loaded over https" nginx reverse proxy

1 Mins read

Nginx のリバースプロキシ環境において、フロントエンドの Nginx が 443 (HTTPS) でリクエストを受け付け、内部では 80 (HTTP) でラウンドロビン方式の負荷分散を行っている場合、Chrome で Mixed Content エラー が発生することがあります。

この問題を解決するために、wp-config.php の冒頭に以下の設定を追加すると効果的です。

/** mixed content the page at ' url ' was loaded over https wordpress nginx */
/** プロキシ設定の場合、httpsでリダイレクトするように設定が必要! */
/** HTTP_X_FORWARDED_FOR の環境変数名はAWSなどお使いのサーバー環境により若干変更されている時があるので要確認すること */
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['HTTPS'] = 'on';
}

内部では 80 (HTTP)側の nginx.conf ファイルを操作できる方は、以下の設定でも対応可能です。

どちらかお好みでOK

location ~ \.php$ {
    include fastcgi_params;

    # mixed content the page at ' url ' was loaded over https wordpress nginx
    # プロキシ設定の場合、httpsでリダイレクトするように設定が必要!ここから
    fastcgi_param HTTPS on;
    fastcgi_param HTTP_X_FORWARDED_PROTO https;
    # ここまで

    fastcgi_intercept_errors on;
    fastcgi_pass php-fpm;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Read more
LinuxmacOSRubyパソコンのこと

Rails 7.0.8.7 Updateで起動エラー "Logger::Severity.constants.each do |severity|"

1 Mins read

Ruby 3.2.6

Ruby on Rails 7.0.8.7

起動でこける

原因はgem

gem 'concurrent-ruby', '1.3.5'

Gemfileの末尾に追記して、しばらく固定にしておく

gem 'concurrent-ruby', '1.3.4'

追記したらインストール

bundle install

# Fetching concurrent-ruby 1.3.4 (was 1.3.5)
# Installing concurrent-ruby 1.3.4 (was 1.3.5)

以下ログ

# gem 'concurrent-ruby', '1.3.5' では以下エラーになるので'1.3.4'固定にしておく
#
# bundler: failed to load command: puma (/app-root/vendor/bundle/ruby/3.2.0/bin/puma)
# /app-root/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8.7/lib/active_support/logger_thread_safe_level.rb:12:in `<module:LoggerThreadSafeLevel>': uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
#
# Logger::Severity.constants.each do |severity|
# ^^^^^^^^^^
Read more
iOSiPhone - iPadmacOSXcode

macOS 15 以降 キーチェーンアクセスのアイコンがユーティリティから無くなった

1 Mins read

Certificate更新しようと思ったら、キーチェーンアクセスのアイコンがない?

macOS Sequoia 15 以降、起動する方法が変わったらしい。。。

「 パスワード 」というアプリがメインで表示されており、エンジニアが必要とするキーチェーンアクセスは隠したようになってる

元情報は同じなんだろうが使い勝手が簡素化しているのがパスワードというアプリなんだろ

表示の仕方

Command + Space Key で Spotlight 出して「 key 」と打てばアイコンが出てくる

公式にも表示方法が書かれている

Read more