まず、次の空のアプリのプロセスのスレッド数を理解しましょう。
ミニワールドでアプリのスレッドを分析する前に、空のアプリとスレッドの状況を理解しましょう。
空のアプリには約 27 スレッドがあります。
FinalizerDaemon スレッド、FinalizerWatchd スレッド、RenderThread、メイン スレッド、ReferenceQueued、HeapTaskDaemon、SignalCatcher、GCDaemon、hwuiTask を含む空のアプリ。
ゲーム内プロセスのスレッドステータス
ゲームプロセスのスレッド数は約 200 です。
これらのスレッドがどのモジュールや SDK から来たのかを調べるために、エピックフックスレッドを使用して、呼び出されたときにコールスタックを出力することが考えられます。
ここでは、mobpush によってプッシュされたスレッドを例として取り上げます。
Mobpush SDK スレッド、M- プレフィックスが付いたスレッド名:
スレッド名とコールスタックに従って、各モジュール/SDK の状況をカウントするために、主要なスレッドユーザーの SDK をいくつか示します。
プッシュ SDK によってもたらされたスレッド
x5 ブラウザ SDK によってもたらされたスレッド
広告によってもたらされたスレッド:
現在のゲームにおけるスレッド最適化の難しい点:
- Android のメッセージ非同期スレッド: HandlerThread または looper を備えたスレッドは常駐スレッドを占有しているため、処理できません。
- 広告 SDK および x5 にはホットロードされた外部 Dex があり、最適化できません。
- C++ で動作する pthread ライブラリ (つまりゲーム側) は、現時点では監視および処理できません。
リーダーは、スレッド数を最適化し、スレッド数を削減するというプレッシャーにもさらされています。
スレッド最適化スキーム
スレッド OOM の発生をさらに減らすために、スレッド プール (常駐コア スレッド) を時間の経過とともに破壊する戦略が採用されます。
1. 独自のビジネスに合わせてスレッド プールを最適化する
- kotlin coroutine や rxjava などを使用して常駐スレッド プールを減らすようにしてください。
- スレッドプールコンポーネントのスレッドプールについては、コアスレッドをクローズするように設定することもできます
Booster を使用して、サードパーティ SDK またはオープン ソース ライブラリのスレッド プールを最適化します。
重要なポイント: アイドル状態のコア スレッドを終了させ、次回タスクが発生したときにスレッドを再度作成します。これはスレッドの収束に効果的なソリューションです。Booster は、APK 全体のスレッド コードを置き換えて最適化します。
ルートディレクトリのビルドで使用する方法:
classpath "com.didiglobal.booster:booster-transform-thread:$booster_version"
コンパイルされた APK をチェックすることで、ブースターがスレッドに対してどのような論理操作を実行するかがわかります。
1. 問題の追跡を容易にするために各スレッドの名前を追加しました
2. keepAliveTime>0 の一部のスレッドについては、終了を許可するコア スレッドの数を設定します。
ThreadPoolExecutor の匿名クラスを置き換えて、コア スレッドがタイムアウトできるようにします。
AsyncTask スレッド プール設定では、タイムアウト後にコア スレッドが期限切れになることを許可します。
Executor の newCachedThreadPool()、newSingleThreadExecutor()、および newScheduledThreadPool() の 3 つのスレッド プールを最適化し、コア スレッドが時間の経過とともに終了できるようにします。
キーポイント: アイドル状態のコアスレッドを終了させ、次回タスクが発生したときにスレッドを再作成するこれは、スレッドの収束に効果的なソリューションです。Booster は、APK 全体のスレッドコードを置き換えて最適化します。
最適化された効果
上記の方法により、ゲーム内のスレッド数は約 192 で安定し、常駐コア スレッドの数を 10 以上削減できます。
後の段階では、マルチプロセス方式の使用も検討し、大規模なスレッド ユーザーの SDK を Web プロセスなどの別のプロセスに配置して、メイン プロセスのスレッド負荷を軽減します。スレッドは 1M の仮想メモリを占有します。
スレッドを最適化するためにハッキング テクノロジーを検討する場合は、Tencent のマトリックスと Ali Ali のオープンソース Patrons を使用してさらに最適化できます。