DUICUO

HarmonyOSオープンソースサードパーティコンポーネントの移行 - Bilibiliのオープンソース弾幕スクリーンライブラリエンジン(パート2)

[[385215]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHarmonyOSテクノロジーコミュニティ。

https://harmonyos..com

序文

このエピソードでは、弾丸スクリーン ライブラリを例にして、オープンソースのサードパーティ コンポーネントを Android から HarmonyOS に移行する方法を紹介します。

この記事を読めば、「箇条書きコメントライブラリの移行方法」を理解できるだけでなく、興味のあるオープンソースのサードパーティ製 Android コンポーネントの移行も試すことができます。

このコンテンツは 2 つの部分で構成されており、主に、オープンソースのサードパーティ ソフトウェアの移行の本質と、オープンソースのサードパーティ ソフトウェアの移行を完了する方法について説明します。

1. エッセンス

サードパーティ コンポーネントは、Android/HarmonyOS SDK メソッドを使用して特定の機能を実行し、ユーザーが呼び出すための統一されたインターフェースを提供するミドルウェアです。

Android サードパーティ製アプリケーションを HarmonyOS に移行するには、以下の手順が必要です。上向きのインターフェースは変更せず(機能出力とインターフェースはユーザーの利便性を考慮し同一)、下向きのメソッドを Android から HarmonyOS に切り替えます。つまり、Android 基盤 SDK が提供するメソッドから、HarmonyOS 基盤 SDK が提供するメソッドに変更することになります。次の図は、このプロセスを説明するために、弾丸スクリーンライブラリを例として使用しています。

図1: 弾丸スクリーンライブラリコンポーネントの移行の概略図

弾幕ライブラリ コンポーネントのオリジナル バージョン (https://github.com/bilibili/DanmakuFlameMaster) では、任意のファイルを開いてインポート情報を表示できます。

図2: DrawHandler.java

ご覧のとおり、このファイルには「import android.xxxx」というパッケージ名が多数使用されています。これは、コンポーネントが特定の機能を実現するためにAndroid独自のAPI呼び出しを多数含んでいることを示しています。したがって、必要なのは、HarmonyOSのAPIを呼び出すことで同じ機能を実現することです。AndroidとHarmonyOSは、​​基盤となるアーキテクチャと通信メカニズムが異なるため、単純な1対1の置き換え関係ではありません。

2. 方法

実際の移行プロセスでは、AndroidとHarmonyOSのパッケージ名、クラス名、メソッド名が異なる場合があります。移行の難易度に応じて、4つのシナリオが考えられます。

1. 異なるパッケージ名、同じクラス名

AndroidとHarmonyOSの間でパッケージ名のみが異なり、クラス名、インターフェース、メソッドは同じままである比較的単純なクラスがいくつかあります。このようなクラスでは、下の画像に示すように、ファイルをインポートした後にパッケージ名を置き換えるだけで済みます。

2. 異なるクラス名、同じメソッド名

一部のクラスは Android と HarmonyOS でパッケージ名とクラス名が変更されていますが、下の図に示すように、インターフェースは同じままです。

図4: ソースコードの例

この時点で、変更されていないメソッド名を手がかりにして、同じ機能を持つクラスを検索して一致させるため、Android と HarmonyOS の両方の開発ドキュメントを参照する必要があります。

アンドロイド:

https://developer.android.google.cn/reference/packages

ハーモニーOS:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/overview-0000001054518434

上記2つの単純なシナリオは、実際の移行プロセスではほとんど発生しません。HarmonyOSシステムでは、基本ライブラリのごく一部のみがAndroidに類似したインターフェースを提供しており、その他のライブラリはAndroidとは大きく異なります。

3. パッケージ名、クラス名、メソッドが完全に異なります。

現時点では、Androidで呼び出される対応するインターフェースをHarmonyOS内で直接見つけることはできません。対応するHarmonyOSモジュール内で同様の使用方法を探す前に、Androidインターフェース(メディア、権限、ビューなど)の機能実装とモジュール区分を完全に理解するために、ある程度のソースコード読解力が必要です。

図5: ソースコードの例

これは典型的な例です。コメントアウトされているメソッドはAndroidのメソッドで、下のメソッドはHarmonyOSのメソッドです。変数RECT(Class:RectFloat)の初期化に異なるアプローチが使用されていることがわかります。

4. 機能の書き換え

最初の3つの方法は、AndroidとHarmonyOSにそれぞれ対応するインターフェースがあるため、それらを理解、検索、そして一致させるだけで済みます。機能実装が全く異なる場合は、HarmonyOSの対応する関数を書き換えるために、ある程度のコード読解力と書き換え能力が必要です。弾丸スクリーンライブラリを例に挙げましょう。

---マルチスレッド通信:

Android と HarmonyOS は同様のマルチスレッド通信メカニズムを備えていますが、その使用方法は大きく異なります。

解決策: 機能を書き直します。

図6: Androidのマルチスレッド通信ロジック

図7: HarmonyOSのマルチスレッド通信ロジック

ご覧のとおり、マルチスレッド通信の基本ロジックはどちらのバージョンでも同じです。2つのスレッドが通信するには、以下の4つのステップが必要です。

1. 通信イニシエーターは、イベントを送信する(および情報自体を運ぶ)ための構造体(またはクラス)を構築(またはインスタンス化)する必要があります。

2. 情報を運ぶこの構造化オブジェクトが情報受信者に到着すると、まずメッセージ キューに入り、処理を待機します。

3. 構造化オブジェクトがキューから取得されると、メッセージ受信者のメッセージ処理ロジックに入ります。

4. 処理が完了すると、メッセージ受信者はフィードバック (コールバック) を生成し、処理結果をメッセージ送信者に返します。

しかし、詳しく見てみると、AndroidとHarmonyOSの処理内容には大きな違いがあることがわかります。Androidでは、このメカニズムを使用するには、まず新しいHandlerThreadを作成し、次に新しいLooperを作成してこれらをバインドし、最後にThread.startを使用して実行し、メッセージの送信と取得の処理を実装する必要があります。HarmonyOSでは、これははるかにシンプルで、下の図に示すように、単一のイベントランナーで同じ機能を実現できます。

図8: ソースコードの例

---UIセクション

HarmonyOSのUIはAndroidとは様々な方法で構築されているため、インターフェースを直接置き換えてAndroidと同様のUI機能を実現することはできません。そのため、HarmonyOSのビルド方法に基づいて、対応する関数を書き換える必要があります。

解決策: 機能を書き直す

OHOSP/AOSP のカスタム レンダリング機能の比較を例に挙げます。

図9: OHOSP/AOSPカスタム描画機能の比較

Androidでは、描画時にdraw()メソッドを直接呼び出してキャンバスをビューに描画します。一方、HarmonyOSでは、現在のコンポーネントにdrawtaskを追加し、drawtask内のondrawメソッドをオーバーライドすることでキャンバスの描画を完了します。

Android の実装は次のとおりです。

図10: Androidはカスタム描画機能を実装している

ハーモニーOS:

図11: HarmonyOSはカスタム描画機能を有効にします

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHarmonyOSテクノロジーコミュニティ。

https://harmonyos..com