GolangでAndroidアプリを高速化

画像



モバイルアプリケーションの開発は、あなたがやりたいことと、デバイスプラットフォームがあなたにできることとの間の妥協です。 この記事では、Golangを使用してAndroidアプリケーションの機能を強化する方法について説明します。



ここでは、秘密のアンドロイドAPIのリークは見つかりません。 使用されるメカニズムは、標準(またはほぼ標準)のAndroidおよびGolangツールであり、その説明は公式サイトおよび専門フォーラムにあります。 しかし、単一の行動計画の形で、そしてロシア語でさえ-これは初めて、Habr専用に発行されます。



背景



いずれかのアプリケーションのユーザーからの多数のリクエストにより、テキスト予測が開発されました。 予測は、 基数ツリーアルゴリズムによって提供され、別のAndroidライブラリに実装されました。 アルゴリズムは、経済的なリソース消費とともに良好なパフォーマンスを示しました-1.5 MBのメモリ消費で数十ミリ秒の結果を生成しました。 完全なパフォーマンス指標。 しかし、これはJVM上のライブラリの分離テストでのみ行われました。



ライブラリをアプリケーションに接続するときに問題が発生しました。 Androidでは、予測アルゴリズムの速度が低下し始め、結果の出力が7秒にドラッグされました。 わあ! はい。7秒で、単語を手動で入力し、削除して、正しく入力できます。 そのような予測は良くありませんでした。



分析では、コードの問題は明らかになりませんでした。 アルゴリズムは完璧に機能し、厳密に割り当てられたメモリ量で消費され、無関係なプロセスに気を取られず、すべてが非同期であり、ハードウェアリソースが十分にありました。 結論は1つだけでした。Androidのdalvik仮想マシンのパフォーマンスはJVMとは異なり、dalvik内ではこのコードはブレーキをかけられます。



次に、予測アルゴリズムをダルビックから除外することが決定されました。 このJava Native Interface用のJNIがあります。 JavaからC / C ++で記述されたライブラリメソッドを呼び出すことができるメカニズム。 また、C / C ++ライブラリから、javaメソッドを呼び出します。



解決策



ネイティブライブラリを作成するために、Goが選択されました。 C / C ++とは異なり、経験があるからです。 Golangは驚くべき機能ですが、複雑さをさらに高めるため、この方法には困難が伴います。 純粋なC / C ++の場合、 NDKを使用し、 Android開発者の Webサイトに記載されている指示に従うだけで十分です。 Golangの場合、Android向けのgolangのコンパイルについて詳しく学ぶ必要がありますここから開始できます



危険と冒険に満ちた道を前に築きました。 しかし、今ではこの道はすでに完了しており、喜んで彼の計画を共有します。



計画



Android開発環境:



Golang開発環境:



golangライブラリの開発。



golangライブラリをandroid * .aarライブラリにコンパイルします。



* .aarライブラリをアプリケーションに接続する:

まず、* .aarライブラリをAndroid開発マシンに転送します。 さらにIDEによって異なります。



日食の場合:



Android Studioの場合:



Androidからネイティブライブラリメソッドを呼び出す。



結果



アルゴリズムをネイティブライブラリに転送した後、予測はJVMよりもさらに速く動作し始めました-結果は10ミリ秒未満で返されます。 リソースの一部がネイティブコードの側に転送されたため、ガベージコレクションの数も減少しました。



JNI実装の効果は予想を上回りました。 これらのインジケータにより、キーボードがリリースされました。



おわりに



golangを使用してAndroidアプリケーションを高速化することはまったく理論ではありませんが、市場アプリケーションで既に使用されている実際の機能です。



もちろん、これはアプリケーションの開発を複雑にします;ツールの動物園は倍になります。 しかし、これにより興味深いソリューションを実装することができます。



Go 1.5のリリースにより、gomobileツールキットによりandroid-golangの統合がさらにアクセスしやすくなり、プロセス全体が2チームに削減されることが期待されます。



All Articles