Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Tomoya Miwa
November 08, 2024
Programming
470
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
Tomoya Miwa
November 08, 2024
More Decks by Tomoya Miwa
See All by Tomoya Miwa
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
8.2k
Re:VIEWで書いた「Compose で Android の edge-to-edge に対応する」をRoo Codeで発表資料にしてもらった
tomoya0x00
0
690
できる!ComposeでCollapsingToolbar
tomoya0x00
0
1.1k
Compose の LazyColumn パフォーマンス改善で取り組んだこと
tomoya0x00
0
2.5k
ComposeのMutableStateってどうやってLocal Unit Testすれば良いの??
tomoya0x00
0
1.2k
意外と簡単?Navigation rail導入のお話
tomoya0x00
0
1.6k
Kotlin Coroutines Flow を触ってみた話し
tomoya0x00
2
900
Android for Carsのお話し
tomoya0x00
1
1.1k
熟成されたアプリのmulti module化(halfway)
tomoya0x00
2
1k
Other Decks in Programming
See All in Programming
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
100
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
390
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
710
Vite+ Unified Toolchain for the Web
naokihaba
0
290
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
120
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
2
580
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Featured
See All Featured
Abbi's Birthday
coloredviolet
2
8k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The untapped power of vector embeddings
frankvandijk
2
1.8k
A designer walks into a library…
pauljervisheath
211
24k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Code Review Best Practice
trishagee
74
20k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
How to make the Groovebox
asonas
2
2.2k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Transcript
Compose 1.7 の TextField はPOBox Plus で日本語変換でき ない tomoya0x00 2024/11/08
DroidKaigi.collect { #13@Tokyo }
自己紹介 tomoya0x00 X( 旧Twitter), GitHub, Zenn Pixel 9 Pro Fold
便利
技術書典17 の 新刊 技術書典17 で弊社の新刊を 出しました! 無料 edge-to-edge について詳 しく書きました
技術書典17 の 新刊 技術書典17 で弊社の新刊を 出しました! 無料 edge-to-edge について詳 しく書きました
Compose 1.7 を使用していますか?
POBox Plus の日本語入力問題で困り ましたか?
Zenn の記事をご覧になりましたか? Compose 1.7 のTextField はPOBox Plus で日本語変換できない https://zenn.dev/tomoya0x00/articles/be40d5f2aa4e54
この問題の最新の情報を共有
この問題の最新の情報を共有 Addressed an issue that prevented TextField from functioning correctly
when using the POBox Japanese Keyboard on certain older Sony devices. (Ia9b99, b/373743376) Compose UI 1.8.0-alpha05 に修正が取りこまれた
そのうち、Stable 版にも修正が取りこ まれるはず Yes, this fix is planned to be
included in a future 1.7.x release.
今回お話しすること
時系列でどのようにこの問題に対処し たかをお話しします もしかしたら、似たような問題に立ち向かうときに参考になるかも 最終的な回避方法は同タイトルのZenn の記事と同じです https://zenn.dev/tomoya0x00/articles/be40d5f2aa4e54
ある金曜日の夕方…
" 正常に文字入力できない" という問 合せが急増
" 正常に文字入力できない" という問 合せが急増 Compose 1.7 にした最新版アプリを100% 配信にして、3 日ほど経過してい た
漢字変換ができず、濁点や半濁点なども打てない トグル入力が出来ない 『あ』を三回押すと『う』ではなく『あああ』になってしまう 現象報告があるのXperia 端末のみ ただし、新しめのXperia 端末では報告無し
hotfix 対応が必要
Xperia 端末でしか起きないのなら、 Xperia プリインIME との組み合わせで 発生する問題かも?
Xperia プリインのIME
POBox Plus 2019 年頃までのXperia にプ リインされていたIME 慣れ親しんだPOBox Plus を 新しいXperia
に手動でイン ストールしてご利用されてい るケースもある
これまでに得た情報で原因を推測 Compose1.6 のアプリでは日本語入力の問題は発生していなかった 少なくとも、大きな問題になるほどの問合せは発生していない Compose1.7 にしたアプリを100% 配信にしてから、お問い合わせが急増し ている つまり、Compose1.7 +
POBox Plus の組み合わせで日本語入力に問題が発生 している
Compose1.7.2 から1.7.3 へのアップデ ートでなおる可能性もありそう Fixed exception thrown when the IME
is active on an external View and the Next action is used to enter focus on the ComposeView. The clearFocus() behavior aligns with View behavior on API < 28, where clearFocus() can cause the default View to be focused. 意外と簡単に修正できるかも?(フラグ)
何はともあれ、まずは問題が再現す る環境の確保が必要
たまたま、お義母さんから頂いた古 い端末が、Xperia 端末(Android 5.0 ) でPOBox Plus もプリインされていた
原因の推測が正しいかの検証 Compose1.7 なアプリでは現象が再現した Compose1.6 なアプリでは再現せず なので、Compose 1.7 から発生している問題である事が確定
どうやってhotfix 対応するのか?
どうやってhotfix 対応するのか? Compoes1.7.3 で修正されているか試す Compose1.7.x のまま、問題を回避できる方法を探す Compose1.6 に戻す
Compoes1.7.3 で修正されているか試 す
Compoes1.7.3 で修正されているか試 す:効果無し
Compose1.7.x のまま、問題を回避で きる方法を探す
Compose1.7.x のまま、問題を回避で きる方法を探す Compose のTextField を単純にAndroid View のEditText に置き換えると、問 題を回避できる事は確認できた
素のEditText のままで試したので、デザインは適用作業は必要 日本語入力をサポートしているComposable は3 箇所なので、EditText 化す る箇所はそんなに多くない
久々にレイアウトXML などを触って Compose 版と同様なデザイン・挙動 をEditText 版で実現
日本語入力対応のTextField をEditText に置き換えてhotfix 対応完了
日本語入力対応のTextField をEditText に置き換えてhotfix 対応完了
None
突然のANR EditText のタップでANR 発生する画面での再現率 100% LazyList で多数のアイテムを 表示している画面で発生
なぜANR が発生するのか? アプリ側のコードが何回も実行されて起きているわけでは無さそう 無駄なRecomposition が大量に発生しているわけでは無さそう
もしかして、Compose1.7 の不具 合… ?
ANR in focus search with Compose 1.7.2 Priority: P4 のまま進捗無し
https://issuetracker.google.com/issues/369354336
hotfix 対応としてEditText 化+ANR 問題 回避は厳しい…
泣く泣くCompose1.6 に戻してhotfix 対応としてリリース ripple やnavigation 周りの変更があるため、400 行超えの変更をrevert
hotfix 対応を乗り越えて、週明け
改めて状況整理 Compose1.7 のTextField はPOBox Plus で日本語変換できない Compose1.7 でEdiText を表示してタップするとANR が起きる
hotfix 対応としてCompose .6 に戻した
どうにかしてCompose1.7 を使いたい Compose1.7 ではCompose のクラッシュ不具合がかなり修正されている Compose1.6 を今後も使い続けるのは厳しい Compose のアップデートに取り残されてしまう
基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus
での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus
での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
Google に問題を報告 TextField で日本語変換できない https://issuetracker.google.com/issues/373743376 @yuyuyuyuyuri さんに対応して貰った(再現アプリは簡単に作れた) EdiText タップでANR 発生
https://issuetracker.google.com/issues/369354336 Issue はすでに存在するが、再現方法がわからないからか進展が無い 弊社アプリでは再現するのでこれを元に再現アプリをつくって共有する
EdiText タップでANR 再現アプリ作成
EdiText タップでANR 再現アプリ作成 幸い、弊社のアプリでは100% 再現できる しかし、弊社アプリのソースをそのままGoogle に共有はできない ANR 発生の要素を特定して再現アプリとして別のアプリを作る必要がある
EdiText タップでANR 再現アプリ作成 - ANR 発生要素の特定 弊社アプリを弄ってシンプルにしていき、ANR 発生要素に当たりをつける LazyColumn でもLazyVerticalGrid
でも発生する LazyList の表示アイテム数が減ると、メインスレッド占有時間は減る LazyList の表示アイテムがclickable だと、メインスレッド占有時間が増え るっぽい
EdiText タップでANR 再現アプリ作成 - 再現アプリの実装 EditText + LazyColumn だけでは再現せず 弊社アプリはEditText
の下にButton がを配置していたので、これを再現ア プリに足したら100% 再現できるようになった Isssue Tracker でこの再現アプリを共有 優先度を上げて欲しいというお願いをした:P4 -> P1 https://github.com/tomoya0x00/nowinandroid/tree/issue_edittext_anr
基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus
での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
Compose1.7 のままワークアラウンド 導入 EditText 化無しで問題の回避に挑戦 EditText 化ANR 問題の回避に挑戦
Compose1.7 のままワークアラウンド 導入 EditText 化無しで問題の回避に挑戦 EditText 化ANR 問題の回避に挑戦
EditText 化無しで問題の回避に挑戦 Compose1.7 からTextField の実装が変わっている BasicTextField2 がBasicTextField にリネームされている 昔のBasicTextField に実装を戻せば、問題を回避できるかもしれない
Compose1.6 のTextField の実装をCompose1.7 に移植してみる
古いTextField を移植 40 個以上のファイルを移植 しかし、効果は無し もっと低レイヤーで発生してい る問題っぽい
Compose1.7 のままワークアラウンド 導入 EditText 化無しで問題の回避に挑戦 EditText 化ANR 問題の回避に挑戦
EditText 化ANR 問題の回避に挑戦 なぜANR が起きているのか?を解析 100% 再現できるアプリがあるので、現象を解析しやすい 解析結果を元に回避方法を探る
EditText 化ANR 問題の回避に挑戦 なぜANR が起きているのか?を解析 100% 再現できるアプリがあるので、現象を解析しやすい 解析結果を元に回避方法を探る
なぜANR が起きているのか?を解析 どこにfocus を当てるかを探していそう androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.findBestCandidate-4WY_MpI(TwoD androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.searchChildren-4C6V_qg(TwoDime androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.access$searchChildren-4C6V_qg( androidx.compose.ui.focus.TwoDimensionalFocusSearchKt$generateAndSearchChildren$1.in androidx.compose.ui.focus.TwoDimensionalFocusSearchKt$generateAndSearchChildren$1.in ~~
省略 ~~ androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.generateAndSearchChildren-4C6V androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa androidx.compose.ui.focus.FocusTraversalKt.focusSearch-0X8WOeE(FocusTraversal.kt:109 androidx.compose.ui.focus.FocusOwnerImpl.focusSearch-ULY8qGw(FocusOwnerImpl.kt:247) androidx.compose.ui.platform.AndroidComposeView.focusSearch(AndroidComposeView.andro
None
なぜANR が起きているのか?を解析 メインスレッドが常に動き続けている メモリも大量に消費し、GC が発生しまくっている 仮説:メインスレッドでfocus 先を探し続けておりANR が発生する
仮説の検証:メインスレッドでfocus 先を探し続けておりANR が発生する TwoDimensionalFocusSearch 内にnot suspend なbreakpoint を追加してロ グ出力 ひたすらfocus
先を探して探索処理を繰り返していることが判明 LazyList の中も展開して(現在は非表示の箇所も) 、探索している LazyList に渡すアイテム数が増えるとfocus 探索時間が増えてANR となる 最終的にはfocus 先を決定できずに諦めていそう
EditText 化ANR 問題の回避に挑戦 なぜANR が起きているのか?を解析 100% 再現できるアプリがあるので、現象を解析しやすい 解析結果を元に回避方法を探る
解析結果を元に回避方法を探る 回避案1: 手動でrequestFocus してみる focus 先をうまく探せないのなら、focus 先を指定してrequestFocus すれ ば良いのでは?
回避案1: 手動でrequestFocus してみる 結果はNG あくまでfocus が当たった後になぜか再度focus 先を探しにいっているの で、このアプローチではダメ EditText にfocus
が当たった後、InputMethodManager 経由で再度focus 先を探しにいっている EditText の下方向に対してEditText を探しに行っているので、見つかる はずがない
解析結果を元に回避方法を探る 回避案1: 手動でrequestFocus してみる 回避案2: AndroidComposeView を差し替えてfocusSearch をブロックす る InputMethodManager
経由のfocus 探す処理は無駄なのでブロックした い
回避案2 :AndroidComposeView を差 し替えれば回避できるのでは? 以前に似たようなアプローチを他の問題で適用したことがある 新しめのFire タブレットの一部で、Compose アプリのタップ位置がずれ る https://zenn.dev/tomoya0x00/articles/e9c0558e5d8e16
結果はNG AndroidComposeView をCompose 側のソースコード変更無しに差し替える のが難しそう
改めて回避策について考える あくまでAndroidComposeView#focusSearch が呼ばれるのを防げば良い すでにfocus が当たったあとに無駄に次のfocus 先を探しているだけなの で、何もしなくて良い
解析結果を元に回避方法を探る 回避案1: 手動でrequestFocus してみる 回避案2: AndroidComposeView を差し替えてfocusSearch をブロックする 回避案3 :独自のViewGroup
を間に挟んでfocusSearch をブロックする InputMethodManager 経由のfocus 探す処理は無駄なのでブロックした い
回避案3 :独自のViewGroup を間に挟 んでfocusSearch をブロックする EditText を独自のViewGroup で包めば、focusSearch をブロックできるので は?
<WorkaroundFocusSearchLayout> <EditText/> </WorkaroundFocusSearchLayout>
回避案3 :独自のViewGroup を間に挟 んでfocusSearch をブロックする focusSearch でnull を返すだけ focus に問題が発生しそうですが、軽く動かした限りは問題なさそう
複数の子View が存在しなければたぶん大丈夫? class WorkaroundFocusSearchLayout : FrameLayout { // constructor は省略してます override fun focusSearch(focused: View?, direction: Int): View? { return null } }
これでめでたしめでたし
これでめでたしめでたし
キーボードが表示されない EditText に対してrequestFocus してもキーボードが表示されない EditText に対してはSoftwareKeyboardController#show しても何も起きない 昔ながらのInputMethodManager#showSoftInput で解決
今度こそめでたしめでたし
今度こそめでたしめでたし
キーボードが 隠れない Android 8.0 な端末でキーワ ード検索を実行してもキー ボードが表示されたままと なる clearFocus するとsetFocus
さ れる
キーボードが隠れない Issue Tarcker に登録済み FocusManager.clearFocus() sets focus the first AndroidViewBinding
https://issuetracker.google.com/issues/374031296 clearFocus の使用を避け、サイズが小さなSpacer にfocus を当てて代用する
キーボードが隠れない focus を外したいときにfocus を当てる先のSpacer を配置 Spacer は高さ・幅共に1px 以上のサイズが必要 どちらかが0px のComposable
にfocus を当てるとクラッシュする val dummyFocusRequester = remember { FocusRequester() } Spacer( modifier = Modifier .fillMaxWidth() .height(1.dp) .focusRequester(dummyFocusRequester) .focusable(), )
キーボードが隠れない workaroundFocusManager を作る clearFocus でSpacer にrequestFocus val workaroundFocusManager: FocusManager =
remember( focusManager, dummyFocusRequester, ) { object : FocusManager { override fun moveFocus(focusDirection: FocusDirection): Boolean = focusManager.moveFocus(focusDirection) override fun clearFocus(force: Boolean) { dummyFocusRequester.requestFocus() } } }
キーボードが隠れない workaroundFocusManager をLocalFocusManager として配る CompositionLocalProvider( LocalFocusManager provides workaroundFocusManager, ) {
... }
無事にEditText 化してリリース!!!
改めて現在の状態を共有 2024/11/08 現在、Compose1.7.x のTextField はPOBox Plus で日本語変換で きない Compose UI
1.8.0-alpha05 には修正が取りこまれた 待っていれば1.7.x 系にも修正が適用されるはず… ? Compose1.7.x でEditText を使うには様々な問題がある タップでANR 発生、キーボード表示されない、clearFocus でsetFocus
まとめ 一つの問題を回避しようとしたら、他の様々な問題がでてきて大変だった まずは再現できる環境をつくれると、解析できるし回避策も検討しやすい AndroidX などの問題に気付いたら、ぜひIssue Tracker に投稿を! 同じ問題で困る人が減る Compose1.7.x は他にもAndroid
View 関係の問題があるかもしれないので、 十分なテストを推奨 いくつかのAndroid バージョンで動かした方が良い