(57)【要約】【課題】既存のアプリケーションへの変更を加えずに、特定のハードウェアに特化した適切なライブラリを利用した処理を実現すること。【解決手段】モジュール置換システムは、所定のモジュールを参照するネイティブコードを含むアプリケーションと、所定のモジュールの処理内容が対象ハードウェア向けに実装された置換用モジュールと、所定のモジュールから置換される置換用モジュールを定義した置換定義情報と、を予め保存するストレージと、対象ハードウェア上でのアプリケーションの起動指示に基づくネイティブコードのメモリへのロード中に、ネイティブコード及び置換定義情報に基づいて置換用モジュールを特定する特定部と、特定された置換用モジュールをメモリへロードするロード部と、メモリにロードされるネイティブコードにおける所定のモジュールの参照箇所に、置換用モジュールのロード先のアドレスを書き込むアドレス置換部と、を備える。【選択図】図１
2017111656.tif 000002
【特許請求の範囲】
【請求項１】
所定のモジュールを参照するネイティブコードを含むアプリケーションと、
前記所定のモジュールの処理内容が対象ハードウェア向けに実装された置換用モジュールと、
前記所定のモジュールから置換される前記置換用モジュールを定義した置換定義情報と、
を予め保存するストレージと、
前記対象ハードウェア上での前記アプリケーションの起動指示に基づく前記ネイティブコードのメモリへのロード中に、前記ネイティブコード及び前記置換定義情報に基づいて前記置換用モジュールを特定する特定部と、
前記特定された置換用モジュールを前記メモリへロードするロード部と、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込むアドレス置換部と、
を備えるモジュール置換システム。
【請求項２】
前記置換定義情報は、
前記所定のモジュールの識別情報と前記置換用モジュールの前記ストレージ内のアドレス情報とを対応付けて定義しており、
前記特定部は、
前記置換定義情報に基づいて、前記ネイティブコードから参照される前記所定のモジュールの識別情報に対応付けられた前記置換用モジュールの前記アドレス情報を特定し、
前記ロード部は、前記ストレージの前記アドレス情報から前記置換用モジュールを読み出して、前記メモリへロードする
請求項１に記載のモジュール置換システム。
【請求項３】
前記置換定義情報は、
置換対象のアプリケーションの識別情報と、複数の前記対象ハードウェアの識別情報とを含む第１のテーブルと、
前記対象ハードウェアごとの前記置換用モジュールの前記ストレージ内のアドレス情報を含む複数の第２のテーブルと、を含み、
前記特定部は、
前記第１のテーブルに含まれる前記置換対象のアプリケーションの識別情報に基づき、前記起動指示されたアプリケーションが置換対象か否かを判定し、
前記置換対象と判定された場合に、前記第１のテーブルに含まれる前記対象ハードウェアの識別情報に基づいて、前記複数の第２のテーブルの中から前記起動指示された前記対象ハードウェアに対応するテーブルを特定し、
前記ロード部は、
前記特定された第２のテーブルに含まれる前記置換用モジュールの前記アドレス情報に基づいて前記ストレージから前記メモリへ当該置換用モジュールをロードする
請求項１又は２に記載のモジュール置換システム。
【請求項４】
前記ネイティブコードは、コード部と、所定の共有ライブラリ内の関数を前記所定のモジュールとして呼び出す関数コール部とを含み、
前記置換用モジュールは、前記所定の共有ライブラリ内の関数の処理内容が前記対象ハードウェア向けに実装された関数であり、
前記特定部は、前記ネイティブコードの前記関数コール部から前記所定の共有ライブラリ内の関数の呼び出し箇所を特定し、
前記アドレス置換部は、前記メモリにおける前記ネイティブコード内の前記特定された関数の呼び出し箇所に、前記置換用モジュールにおける関数のロード先のアドレスを書き込む
請求項１乃至３のいずれか１項に記載のモジュール置換システム。
【請求項５】
前記所定のモジュールは、所定の静的ライブラリにおける関数であり、
前記置換用モジュールは、前記所定の静的ライブラリにおける関数の処理内容が前記対象ハードウェア向けに実装された関数であり、
前記特定部は、前記ネイティブコードの中から前記所定の静的ライブラリにおける関数の呼び出し箇所を特定し、前記特定された呼び出し箇所を共有ライブラリにおける関数の呼び出し形式に修正し、
前記アドレス置換部は、前記メモリ内の前記修正後の呼び出し形式における関数の呼び出し箇所に、前記置換用モジュールのロード先のアドレスを書き込む、
請求項１乃至４のいずれか１項に記載のモジュール置換システム。
【請求項６】
前記所定のモジュールは、複数の関数を含む所定のライブラリファイルであり、
前記置換用モジュールは、前記所定のライブラリファイルに含まれる複数の関数の処理内容が前記対象ハードウェア向けに実装された複数の関数を含む置換用ライブラリファイルであり、
前記置換定義情報は、前記所定のライブラリファイルから置換される前記置換用ライブラリファイルを定義している、
請求項１乃至３のいずれか１項に記載のモジュール置換システム。
【請求項７】
前記ネイティブコードは、複数の関数を含む異なる複数のライブラリファイルを前記所定のモジュールとして参照し、
前記置換用モジュールは、前記複数のライブラリファイルのそれぞれに含まれる関数のうち少なくとも一部の処理内容が前記対象ハードウェア向けに実装された関数であり、
前記置換定義情報は、前記複数のライブラリファイルのそれぞれに含まれる関数のうち少なくとも一部から置換される関数を前記置換用モジュールとして定義している、
請求項１乃至３のいずれか１項に記載のモジュール置換システム。
【請求項８】
対象ハードウェア上で、所定のモジュールを参照するネイティブコードを含むアプリケーションの起動指示を受け付け、
前記起動指示に基づく前記ネイティブコードのメモリへのロードを開始し、
前記ロード中に、前記所定のモジュールの処理内容が対象ハードウェア向けに実装され、前記所定のモジュールから置換される置換用モジュールを定義した置換定義情報と、前記ネイティブコードとに基づいて前記置換用モジュールを特定し、
前記特定された置換用モジュールを前記メモリへロードし、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込む
モジュール置換方法。
【請求項９】
対象ハードウェア上で、所定のモジュールを参照するネイティブコードを含むアプリケーションの起動指示を受け付ける処理と、
前記起動指示に基づく前記ネイティブコードのメモリへのロードを開始する処理と、
前記ロード中に、前記所定のモジュールの処理内容が対象ハードウェア向けに実装され、前記所定のモジュールから置換される置換用モジュールを定義した置換定義情報と、前記ネイティブコードとに基づいて前記置換用モジュールを特定する処理と、
前記特定された置換用モジュールを前記メモリへロードする処理と、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込む処理と、
をコンピュータに実行させるモジュール置換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モジュール置換システム、方法及びプログラムに関する。
【背景技術】
【０００２】
スマートフォン等の携帯端末装置は、Ａｎｄｒｏｉｄ（登録商標）等のソフトウェアプラットフォーム（フレームワーク）上で所定のアプリケーションを動作させる。例えば、スマートフォンにインストール可能なＡｎｄｒｏｉｄ（登録商標）上で実行可能なＡｎｄｒｏｉｄ（登録商標）アプリケーションには、以下の２つのタイプが存在する。
１）Ｊａｖａ（登録商標）言語のみで作成されたＶｉｒｔｕａｌ  Ｍａｃｈｉｎｅ上で動作するＡｎｄｒｏｉｄ（登録商標）アプリケーション
２）Ｃ／Ｃ＋＋言語で作成されたＣＰＵ（Central Processing Unit）のＮａｔｉｖｅコード（プログラム）で動作するＮａｔｉｖｅアプリケーション
【０００３】
これらアプリケーションは、インストールパッケージとしてＡＰＫ（Application PacKage）ファイルに圧縮された状態で構成されている。Ｎａｔｉｖｅアプリケーションは、開発環境であるＡｎｄｒｏｉｄ（登録商標）  ＳＤＫ（Software Development Kit）とＡｎｄｒｏｉｄ（登録商標）  ＮＤＫ（Native Development Kit）を通してビルドを行うことで、ＡＰＫファイルを生成することができる。ＡＰＫファイルの中には、Ｎａｔｉｖｅアプリケーションの本体であるＮａｔｉｖｅコードが共有ライブラリ（．ｓｏ）として内部に含まれる。そして、共有ライブラリ内で、静的ライブラリ又は動的ライブラリ（共有ライブラリ）内の関数を呼び出すコードが記述されている。静的ライブラリや動的ライブラリは、Ｎａｔｉｖｅコードの共有ライブラリとリンクしてＡＰＫファイルに含まれる。Ｎａｔｉｖｅコードの共有ライブラリは、ＡＰＫをスマートフォンにインストールしたときにストレージ（フラッシュメモリ等）内に格納される。ＡＰＫをインストールした後、アプリケーションを実行する際にＮａｔｉｖｅコードを実行可能にするために、フレームワークにおいてＪａｖａ（登録商標）のＳｙｓｔｅｍクラスが持つSystem.loadLibrary()メソッドによりメモリ（ＲＡＭ等）にロードされる。
使用例：System.loadLibrary(“unity”);  // Nativeコードである libunity.so をロード
【０００４】
ここで、特許文献１には、対象プロセッサにより実行可能な対象コードを目的プロセッサが実行可能な目的コードに変換する間に、目的プロセッサがネイティブコードと組み合わせてプログラムコードを実行する方法に関する技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特表２００８−５４６０８５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
Ａｎｄｒｏｉｄ（登録商標）アプリケーションを始めとする携帯端末装置向けのアプリケーションは、市場にある様々なスマートフォン等の携帯端末装置で動作することを前提に開発及び動作確認された上で、配布されている。ところが、携帯端末装置は機種ごとに搭載されるプロセッサ及び周辺機器並びにドライバソフトウェアの仕様が異なるため、アプリケーションの実装内容によっては、一部の機種で処理速度が遅いことや処理の最適化が不十分であることや、消費電力が過剰であるなどの問題がある。その理由は、アプリケーションに含まれるＮａｔｉｖｅコードについては、ハードウェアへの依存性が高く、機種ごとの違いが起こり易いためである。
【０００７】
ここで、アプリケーションに含まれるＮａｔｉｖｅコードが呼び出す関数ライブラリが静的ライブラリや、アプリケーションベンダーが作成した動的ライブラリである場合、本来であれば、アプリケーションベンダーがライブラリに関するソースコードの修正を行って再ビルドを行い、修正版のＡＰＫファイルを配布する必要がある。しかしながら、多数の携帯端末装置の一部の機種をサポートするために、アプリケーション自体の修正を行うことは、アプリケーションベンダーの負担が大きい。その理由は、ＡＰＫファイル内で静的ライブラリや動的ライブラリがＮａｔｉｖｅコードにリンクされているため、アプリケーションベンダーがライブラリを個別に修正して差し替えることができないためである。
【０００８】
また、アプリケーションに含まれるＮａｔｉｖｅコードが呼び出す関数ライブラリがハードウェアベンダーから提供される外部の共有ライブラリである場合、ハードウェアベンダーが機種に合わせて共有ライブラリの関数の実装を修正する必要がある。しかしながら、当該共有ライブラリを利用する他のアプリケーションの動作にも影響するため、それらの動作検証も必要となる。よって、携帯端末装置を提供するハードウェアベンダーの負担が大きい。
【０００９】
以上のことから複数の携帯端末装置向けアプリケーションについて一部の機種に特化した改修を行うことは困難が伴うという問題がある。
【００１０】
本発明は、このような問題を解決するためになされたものであり、既存のアプリケーションへの変更を加えずに、特定のハードウェアに特化した適切なライブラリを利用した処理を実現するためのモジュール置換システム、方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の第１の態様にかかるモジュール置換システムは、
所定のモジュールを参照するネイティブコードを含むアプリケーションと、
前記所定のモジュールの処理内容が対象ハードウェア向けに実装された置換用モジュールと、
前記所定のモジュールから置換される前記置換用モジュールを定義した置換定義情報と、
を予め保存するストレージと、
前記対象ハードウェア上での前記アプリケーションの起動指示に基づく前記ネイティブコードのメモリへのロード中に、前記ネイティブコード及び前記置換定義情報に基づいて前記置換用モジュールを特定する特定部と、
前記特定された置換用モジュールを前記メモリへロードするロード部と、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込むアドレス置換部と、
を備える。
【００１２】
本発明の第２の態様にかかるモジュール置換方法は、
対象ハードウェア上で、所定のモジュールを参照するネイティブコードを含むアプリケーションの起動指示を受け付け、
前記起動指示に基づく前記ネイティブコードのメモリへのロードを開始し、
前記ロード中に、前記所定のモジュールの処理内容が対象ハードウェア向けに実装され、前記所定のモジュールから置換される置換用モジュールを定義した置換定義情報と、前記ネイティブコードとに基づいて前記置換用モジュールを特定し、
前記特定された置換用モジュールを前記メモリへロードし、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込む。
【００１３】
本発明の第３の態様にかかるモジュール置換プログラムは、
対象ハードウェア上で、所定のモジュールを参照するネイティブコードを含むアプリケーションの起動指示を受け付ける処理と、
前記起動指示に基づく前記ネイティブコードのメモリへのロードを開始する処理と、
前記ロード中に、前記所定のモジュールの処理内容が対象ハードウェア向けに実装され、前記所定のモジュールから置換される置換用モジュールを定義した置換定義情報と、前記ネイティブコードとに基づいて前記置換用モジュールを特定する処理と、
前記特定された置換用モジュールを前記メモリへロードする処理と、
前記メモリにロードされる前記ネイティブコードにおける前記所定のモジュールの参照箇所に、前記置換用モジュールのロード先のアドレスを書き込む処理と、
をコンピュータに実行させる。
【発明の効果】
【００１４】
本発明により、既存のアプリケーションへの変更を加えずに、特定のハードウェアに特化した適切なライブラリを利用した処理を実現し、アプリケーションベンダーやハードウェアベンダへの負担を軽減するためのモジュール置換システム、方法及びプログラムを提供することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施の形態１にかかるモジュール置換システムの構成を示すブロック図である。
【図２】関連技術において、ストレージにＮａｔｉｖｅアプリケーションがインストールされた状態を示す図である。
【図３】関連技術において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーションが起動されて、メモリにロードされた場合のプロセスメモリ空間の例を示す図である。
【図４】実施例１−１にかかる置換定義情報と置換用モジュール群の例を示す図である。
【図５】実施例１−１にかかるモジュール置換処理の流れを示すフローチャートである。
【図６】実施例１−１にかかるモジュール置換の例を説明するための概念図である。
【図７】実施例１−１にかかるモジュール置換の例を説明するための概念図である。
【図８】実施例１−１にかかるモジュール置換の例を説明するための概念図である。
【図９】実施例１−１にかかるモジュール置換の例を説明するための概念図である。
【図１０】実施例１−１において、ストレージにＮａｔｉｖｅアプリケーションがインストールされた状態を示す図である。
【図１１】実施例１−１において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーションが起動されて、メモリにロードされた場合のプロセスメモリ空間の例を示す図である。
【図１２】実施例１−２における静的ライブラリの呼び出しの置換処理の概念を示す図である。
【図１３】実施例２−１において、ストレージにＮａｔｉｖｅアプリケーションがインストールされた状態を示す図である。
【図１４】実施例２−１にかかる置換定義情報の例を示す図である。
【図１５】実施例２−１において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーションが起動されて、メモリにロードされた場合のプロセスメモリ空間の例を示す図である。
【図１６】実施例２−２にかかる置換定義情報の例を示す図である。
【発明を実施するための形態】
【００１６】
以下では、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。各図面において、同一要素には同一の符号が付されており、説明の明確化のため、必要に応じて重複説明は省略する。
【００１７】
＜発明の実施の形態１＞
図１は、本発明の実施の形態１にかかるモジュール置換システム１００の構成を示すブロック図である。モジュール置換システム１００は、ソフトウェアプラットフォーム（フレームワーク）上で所定のアプリケーション（組込み用ソフトウェア）を動作させることができるものである。例えば、モジュール置換システム１００は、スマートフォン等の携帯端末装置であり、Ａｎｄｒｏｉｄ（登録商標）のフレームワークが稼働するものとする。または、モジュール置換システム１００は、テレビ等の設置型の端末装置であり、Ｔｉｚｅｎ（登録商標）のフレームワークが稼働するものであってもよい。
【００１８】
モジュール置換システム１００は、ストレージ１１０と、メモリ１２０と、プロセッサ１３０と、通信部１４０とを備える。ストレージ１１０は、例えば、フラッシュメモリ等の記憶装置であり、アプリケーションがインストールされる領域を含む。ストレージ１１０は、Ｎａｔｉｖｅアプリケーション１１１と、置換用モジュール１１２と、置換定義情報１１３とを予め保存する。
【００１９】
Ｎａｔｉｖｅアプリケーション１１１は、所定のモジュールを参照するネイティブコードを含むアプリケーションプログラムである。尚、Ｎａｔｉｖｅアプリケーション１１１には、非ネイティブコード、例えばＪａｖａ（登録商標）コード等が含まれていても良い。所定のモジュールは、ライブラリファイルやライブラリの関数等のコードである。ネイティブコードは、所定のモジュールを介したモジュール置換システム１００内の周辺機器等へのアクセス処理を含む。所定のモジュールが静的ライブラリ又はアプリケーションベンダーが作成した動的ライブラリである場合、ネイティブコードは、静的ライブラリ又は動的ライブラリとリンクされており、これらが一体となった共有ライブラリファイル（.so）として提供される。または、所定のモジュールがシステムにより提供される外部の共有ライブラリの場合、ネイティブコードは、外部の共有ライブラリへの参照を含む共有ライブラリファイルとして提供される。ネイティブコードは、例えば、Ｎａｔｉｖｅアプリケーション１１１は、携帯端末装置の周辺機器を利用したアプリケーション、具体的には、携帯端末装置に搭載されたカメラの操作に関連するアプリケーション等が挙げられるがこれに限定されない。
【００２０】
置換用モジュール１１２は、所定のモジュールの処理内容が対象ハードウェア向けに実装されたプログラムファイルである。つまり、置換用モジュール１１２は、他のハードウェアにおける所定のモジュールの処理と同等の結果が得られ、対象ハードウェア向けに処理速度や消費電力等が最適化されるように、カスタマイズされて実装されたモジュールである。所定のモジュールがライブラリファイルである場合、置換用モジュール１１２も対応するライブラリファイルであり、所定のモジュールがライブラリの関数等である場合、置換用モジュール１１２も対応する関数単位のファイルとなる。
【００２１】
置換定義情報１１３は、所定のモジュールから置換される置換用モジュール１１２を定義した情報である。置換定義情報１１３は、ストレージ１１０内のネイティブコードが参照する所定のモジュールが対象ハードウェアにおいては置換対象であり、置換用モジュール１１２に置き換えることを示す情報である。置換定義情報１１３は、例えば、置換対象のアプリケーション識別情報、対象ハードウェアであるターゲットのリスト（例えば、ターゲット識別情報（機種、対象ハードウェアのモデル番号（型番）等）、ターゲットごとの置換対象のモジュールのリスト等を含めてよい。
【００２２】
メモリ１２０は、プロセッサ１３０における作業領域であり、例えば、ＲＡＭ等である。そのため、プロセッサ１３０により実行されるアプリケーションは、起動時にストレージ１１０からメモリ１２０にロードされる。
【００２３】
プロセッサ１３０は、フレームワーク上で所定のアプリケーションを実行する制御装置である。プロセッサ１３０は、例えば、ＣＰＵやＭＰＵ等であるとよい。プロセッサ１３０は、特定部１３１と、ロード部１３２と、アドレス置換部１３３とを備える。特定部１３１は、対象ハードウェア（すなわち、モジュール置換システム１００）上でのＮａｔｉｖｅアプリケーション１１１の起動指示に基づくネイティブコードのメモリ１２０へのロード中に、ネイティブコード及び置換定義情報１１３に基づいて置換用モジュール１１２を特定する。ロード部１３２は、特定された置換用モジュール１１２をメモリ１２０へロードする。アドレス置換部１３３は、メモリ１２０にロードされるネイティブコードにおける所定のモジュールの参照箇所に、置換用モジュール１１２のロード先のアドレスを書き込む。通信部１４０は、モジュール置換システム１００の外部との無線又は有線の通信を行う。
【００２４】
このように、本実施の形態１により、既存のＮａｔｉｖｅアプリケーション１１１への変更を加えずに、特定のハードウェアに特化した適切なライブラリ（置換用モジュール１１２）を利用した処理を実現し、アプリケーションベンダーやハードウェアベンダーへの負担を軽減することができる。
【００２５】
尚、図示しないが、ストレージ１１０には、ＯＳ（Operating System）、フレームワーク、ＶＭ（Virtual Machine）、共有ライブラリ、本発明の実施の形態にかかるモジュール置換プログラム等も保存されている。そして、プロセッサ１３０がＯＳ等やモジュール置換プログラムをメモリ１２０に読み込み、実行することにより、本発明の実施の形態にかかる特定部１３１、ロード部１３２及びアドレス置換部１３３を実現できる。
【００２６】
また、置換定義情報１１３は、所定のモジュールの識別情報と置換用モジュール１１２のストレージ１１０内のアドレス情報とを対応付けて定義しておき、特定部１３１は、置換定義情報１１３に基づいて、ネイティブコードから参照される所定のモジュールの識別情報に対応付けられた置換用モジュール１１２のアドレス情報を特定し、ロード部１３２は、ストレージ１１０のアドレス情報から置換用モジュール１１２を読み出して、メモリ１２０へロードすることが望ましい。これにより、対象モジュールに対応する置換モジュールを正確にロードできる。
【００２７】
＜実施例１−１＞
ここで、本実施の形態１の実施例１−１として、所定のモジュールがアプリケーションベンダーにより開発された動的ライブラリである場合について説明する。尚、実施例１−１は、所定のモジュールがシステムにより提供された外部の共有ライブラリである場合についても同様に適用できる。
【００２８】
まず、本実施例１−１の適用前のＮａｔｉｖｅアプリケーションのロードについて説明する。図２は、関連技術において、ストレージ１１０にＮａｔｉｖｅアプリケーション１１１ａがインストールされた状態を示す図である。尚、ストレージ１１０内の他の保存内容については図示を省略している。ここで、Ｎａｔｉｖｅアプリケーション１１１ａには、非ネイティブコード１１１１ａと、ネイティブコード１１１２ａと、動的ライブラリ１１１３ａとが含まれている。そして、ネイティブコード１１１２ａは、動的ライブラリ１１１３ａへの参照を含む。そのため、開発時にビルドされたＡＰＫファイル（Ｎａｔｉｖｅアプリケーション１１１ａ）内で、動的ライブラリ１１１３ａは、ネイティブコード１１１２ａにリンクされて一体となっていることを示す。
【００２９】
図３は、関連技術において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーション１１１ａが起動されて、メモリ１２０にロードされた場合のプロセスメモリ空間の例を示す図である。尚、メモリ１２０内の他のプロセス（非ネイティブコード１１１１ａ等）については図示を省略している。ここで、ネイティブコード１１１２ａは、ＥＬＦ（Executable and Linking Format）形式で生成されているものとする。すなわち、ネイティブコード１１１２ａは、処理内容のコードであるコード部と、ＰＬＴ（Procedure Linkage Table）部と、ＧＯＴ（Global Offset Table）部とを少なくとも含む。ＧＯＴ部には、動的ライブラリ１１１３ａ内の関数への参照箇所が含まれているものとする。但し、ネイティブコード１１１２ａの形式は一例であり、これ以外が含まれていてもよい。
【００３０】
そして、Ｎａｔｉｖｅアプリケーション１１１ａが起動されると、ネイティブコード１１１２ａ及び動的ライブラリ１１１３ａがメモリ１２０にロードされ、ＧＯＴ部からの参照箇所には、メモリ１２０内の動的ライブラリ１１１３ａの参照先の関数のアドレスが書き込まれる。
【００３１】
次に、本実施例１−１を適用した場合のＮａｔｉｖｅアプリケーションのロードについて説明する。まず、図４は、実施例１−１にかかる置換定義情報１１３ａと置換用モジュール群１１２ａの例を示す図である。置換定義情報１１３ａは、対象アプリテーブルＴＡ１と、対象関数テーブルＴＦ１〜ＴＦｎとを含む。置換用モジュール群１１２ａは、対象関数テーブルＴＦ１〜ＴＦｎに登録された複数の関数の夫々に対応する置換対象の関数プログラムの集合を示す。
【００３２】
対象アプリテーブルＴＡ１は、例えば、”App Name”、"num of target"、"Target info #1"〜"Target info #n"の属性と対応するデータを有する。”App Name”は、アプリケーション識別情報として、例えば、”AndroidManifest.xml”内のpackage=“AppName”や、対象のネイティブコードのファイル名（例えば、“libApp.so”）を用いることができる。"num of target"は、対象ターゲットの種類の数ｎ、"Target info #1"〜"Target info #n"は、対象ターゲットの情報、例えば、対象ターゲットの型番（モデル番号）と各対象関数テーブルへのリンクアドレス等が含まれる。
【００３３】
対象関数テーブルＴＦ１〜ＴＦｎのそれぞれは、“num of Func”、“Func table [0]”・・・の属性と対応するデータを有する。“num of Func”は、該当するターゲットにおける置換対象の関数モジュールの数、“Func table [0]”等は、対象関数のアドレス情報、例えば、置換対象の関数名、オフセットアドレス、コードサイズ等を含む。つまり、置換対象の関数の数は、対象ターゲットごとに異なり、同じ関数名であっても対象ターゲットごとに実装内容をカスタマイズすることができる。
【００３４】
図５は、実施例１−１にかかるモジュール置換処理の流れを示すフローチャートである。また、図６〜９は、実施例１−１にかかるモジュール置換の例を説明するための概念図である。そして、以下の説明においては、適宜、図６〜９を参照する。まず、モジュール置換システム１００は、ユーザ等からアプリケーションの起動指示を受け付ける。例えば、モジュール置換システム１００は、モジュール置換システム１００の一例であるスマートフォンを所持するユーザから、当該スマートフォン上でインストール済みのＮａｔｉｖｅアプリケーション１１１のアイコンをタップする操作を受け付ける。これに応じて、モジュール置換システム１００は、指示されたＮａｔｉｖｅアプリケーション１１１（“Ａｐｐ．Ａ”）の起動を開始する（Ｓ１０１、図６）。
【００３５】
次に、モジュール置換システム１００は、Ｎａｔｉｖｅアプリケーション１１１内のネイティブコードのロードを開始する（Ｓ１０２）。例えば、モジュール置換システム１００は、“Ａｐｐ．Ａ”のプロセスを生成し、ロード部１３２は、ネイティブコードをメモリ１２０へロードし始める（図６）。ここで、モジュール置換システム１００は、Ｎａｔｉｖｅアプリケーション１１１が置換対象のアプリケーションであるか否かを判定する（Ｓ１０３）。例えば、モジュール置換システム１００は、Ｎａｔｉｖｅアプリケーション１１１のアプリケーション識別情報“Ａｐｐ．Ａ”が、対象アプリテーブルＴＡ１に登録された”App Name”と一致するか否かを判定する。ステップＳ１０３において一致しない場合、置換処理を終了し、通常通りアプリケーションの起動処理を継続する。
【００３６】
ステップＳ１０３において一致する場合、モジュール置換システム１００は、対象ハードウェアに対応する関数テーブルを読み出す（Ｓ１０４）。例えば、モジュール置換システム１００は、対象アプリテーブルＴＡ１の"Target info #1"〜"Target info #n"の対象ターゲットの情報の中から自身の型番と一致するものを特定し、対象関数テーブルＴＦ１〜ＴＦｎの中から、特定した対象ターゲットの情報に対応する対象関数テーブルを読み出す。例えば、モジュール置換システム１００は、“Target #1”の対象関数テーブルＴＦ１を読み出す（図６）。
【００３７】
そして、特定部１３１は、読み出した関数テーブルから置換対象の関数を特定する（Ｓ１０５、図７）。例えば、特定部１３１は、対象関数テーブルＴＦ１の“Func table [0]”・・・の関数名を特定する。そして、ロード部１３２は、特定した関数モジュールをメモリ１２０へロードする（Ｓ１０６）。例えば、ロード部１３２は、“Func table [0]”・・・の対象関数のアドレス情報に基づいて、ストレージ１１０に保存された置換定義情報１１３をメモリ１２０へロードする。
【００３８】
その後、アドレス置換部１３３は、ネイティブコードのＧＯＴのアドレスにロードした関数ライブラリのアドレスを書き込む（Ｓ１０７、図８）。すなわち、アドレス置換部１３３は、メモリ１２０におけるネイティブコード内の所定のモジュールの参照箇所に、置換用モジュール１１２のロード先のアドレスを書き込む。その結果、その後、libA.soが実行され、関数コールがされた時に、ＰＬＴを経由してＧＯＴから置換後の関数が呼び出されて、実行される（図９）。
【００３９】
ここで、図１０は、実施例１−１において、ストレージ１１０にＮａｔｉｖｅアプリケーション１１１ａがインストールされた状態を示す図である。ここではさらに、置換定義情報１１３ａ及び置換用モジュール群１１２ａが保存されていることを示す。そして、図１１は、実施例１−１において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーション１１１ａが起動されて、メモリ１２０にロードされた場合のプロセスメモリ空間の例を示す図である。ここでは、置換用モジュール群１１２ａのメモリ領域も確保され、その上、ネイティブコード１１１２ａのＧＯＴ参照先が” func@SharedA’”に書き換えられていることを示す。そのため、“App A”の実行において関数“SharedA”が呼び出される代わりに“SharedA’”が呼び出されて実行される。そのため、対象ハードウェアにおけるＮａｔｉｖｅアプリケーション１１１ａの処理において、高速化、最適化、消費電力効率化を実現できる。そして、そのためのアプリケーションベンダー及びハードウェアベンダーの負担を軽減できる。
【００４０】
尚、実施例１−１は、次のように表現することもできる。すなわち、置換定義情報１１３は、置換対象のアプリケーションの識別情報と、複数の対象ハードウェアの識別情報とを含む第１のテーブル（対象アプリテーブル）と、対象ハードウェアごとの置換用モジュールのストレージ１１０内のアドレス情報を含む複数の第２のテーブル（対象関数てーブル）と、を含み、特定部１３１は、第１のテーブルに含まれる置換対象のアプリケーションの識別情報に基づき、起動指示されたアプリケーションが置換対象か否かを判定し、置換対象と判定された場合に、第１のテーブルに含まれる対象ハードウェアの識別情報に基づいて、複数の第２のテーブルの中から起動指示された対象ハードウェアに対応するテーブルを特定し、ロード部は、特定された第２のテーブルに含まれる置換用モジュールのアドレス情報に基づいてストレージ１１０からメモリ１２０へ当該置換用モジュールをロードする。これにより、対象ハードウェアごとに異なる置換用モジュールを置換することを容易に実現でき、対象ハードウェアごとに最適にカスタマイズしたモジュールにより処理することができる。
【００４１】
さらに、前記ネイティブコードは、コード部と、所定の共有ライブラリ内の関数を前記所定のモジュールとして呼び出す関数コール部とを含み、前記置換用モジュールは、前記所定の共有ライブラリ内の関数の処理内容が前記対象ハードウェア向けに実装された関数であり、前記特定部は、前記ネイティブコードの前記関数コール部から前記所定の共有ライブラリ内の関数の呼び出し箇所を特定し、前記アドレス置換部は、前記メモリにおける前記ネイティブコード内の前記特定された関数の呼び出し箇所に、前記置換用モジュールにおける関数のロード先のアドレスを書き込むことが望ましい。これにより、関数単位の置換が容易に実現でき、きめ細かく管理できる。さらに、置換を行う関数を必要最小限にすることで、省メモリ化を実現できる。
【００４２】
＜実施例１−２＞
続いて、本実施の形態１の実施例１−２として、所定のモジュールが静的ライブラリである場合について説明する。図１２は、実施例１−２における静的ライブラリの呼び出しの置換処理の概念を示す図である。まず、ネイティブコード１１１２ｂは、静的ライブラリを呼び出す場合、関数コールにより直接、関数が呼び出す形式となっている。つまり、動的ライブラリのようにＥＬＦ形式は用いられない。そこで、本実施例１−２では、ネイティブコード１１１２ｂ内の静的ライブラリへの関数コールの箇所１１１２１ｂについて、ＰＬＴ部及びＧＯＴ部を介して呼び出すように修正した上で、ＧＯＴ部からの関数の呼び出し箇所を置換用モジュールのアドレスに置換するものとする。
【００４３】
そのための処理として例えば、モジュール置換システム１００は、ネイティブコード１１１２ｂのロード時に、置換定義情報１１３を参照して置換対象の関数コールの箇所１１１２１ｂを特定する（Ｓ２０１）。そして、関数コールの箇所１１１２１ｂをＰＬＴ経由の処理にパッチする（Ｓ２０２）。そして、ＮａｔｉｖｅコードにＰＬＴ部及びＧＯＴ部を追加する（Ｓ２０３及びＳ２０４）。その後、ＧＯＴ部の関数の呼び出しアドレスを、ステップＳ１０６でロードした置換用の関数モジュールのアドレスに書き換える（Ｓ２０５）。
【００４４】
このように本実施例１−２においても、所定のモジュールを置換用のモジュールに置き換えて実行させることができ、実施例１−１と同様の効果を奏することができる。さらに、本実施例１−２では、アドレス置換部の処理を動的ライブラリと同様にしているため、実施例１−１の改良により実現が可能であり、置換定義情報も同様に用いることができる。よって、動的ライブラリ及び静的ライブラリのいずれについても一部が共通する置換処理のロジックを用いることができ、モジュール置換システム１００の処理も効率化できる。
【００４５】
尚、実施例１−２は、次のように表現することもできる。すなわち、前記所定のモジュールは、所定の静的ライブラリにおける関数であり、前記置換用モジュールは、前記所定の静的ライブラリにおける関数の処理内容が前記対象ハードウェア向けに実装された関数であり、前記特定部は、前記ネイティブコードの中から前記所定の静的ライブラリにおける関数の呼び出し箇所を特定し、前記特定された呼び出し箇所を共有ライブラリにおける関数の呼び出し形式に修正し、前記アドレス置換部は、前記メモリ内の前記修正後の呼び出し形式における関数の呼び出し箇所に、前記置換用モジュールのロード先のアドレスを書き込む。このように、共有ライブラリにおける関数の呼び出し形式に例えば、PLT部やGOT部を追加することで共有ライブラリの置換処理に追加して実現ができ、処理の共通化を図ることができる。
【００４６】
＜発明の実施の形態２＞
本発明の実施の形態２は、実施の形態１の変形例であり、ネイティブコードが複数のライブラリファイルを参照する場合を対象としたものである。
【００４７】
＜実施例２−１＞
実施例２−１では、ネイティブコードが２種類のライブラリファイルを参照し、それぞれのライブラリファイル単位で対象ハードウェア向けに置換する場合について説明する。図１３は、実施例２−１において、ストレージ１１０にＮａｔｉｖｅアプリケーション１１１ｂがインストールされた状態を示す図である。ここで、Ｎａｔｉｖｅアプリケーション１１１ｂには、非ネイティブコード１１１１ｂと、ネイティブコード１１１２ｂと、動的ライブラリ１１１３ａとが含まれている。そして、ネイティブコード１１１２ｂは、動的ライブラリ１１１３ａ及び外部共有ライブラリ１１４への参照を含む。そのため、開発時にビルドされたＡＰＫファイル（Ｎａｔｉｖｅアプリケーション１１１ｂ）内で、動的ライブラリ１１１３ａは、ネイティブコード１１１２ａにリンクされて一体となっており、一方、外部共有ライブラリ１１４は含まれていないことを示す。外部共有ライブラリ１１４は、ストレージ１１０に別途保存されているものとする。
【００４８】
また、ストレージ１１０には、置換定義情報１１３ｂ及び置換用ライブラリファイル１１２ｂ、並びに、置換定義情報１１３ｃ及び置換用ライブラリファイル１１２ｃが保存されているものとする。置換定義情報１１３ｂには、動的ライブラリ１１１３ａを置換用ライブラリファイル１１２ｂへ置換するための定義がされており、置換定義情報１１３ｃには、外部共有ライブラリ１１４を置換用ライブラリファイル１１２ｃへ置換するための定義がされているものとする。
【００４９】
図１４は、実施例２−１にかかる置換定義情報１１３ｂの例を示す図である。置換定義情報１１３ｂは、対象アプリテーブルＴＡ１ａと、対象ライブラリテーブルＴＬ１〜ＴＬｎとを含む。尚、対象ライブラリテーブルＴＬ１〜ＴＬｎのそれぞれに登録された複数のライブラリファイルは図示を省略する。ここで、対象アプリテーブルＴＡ１ａの"Target info #1"〜"Target info #n"には、各対象ライブラリテーブルへのリンクアドレス等が含まれる。そして、対象ライブラリテーブルＴＬ１〜ＴＬｎのそれぞれは、“Model No.”、“Lib name A”、“Link addr A1”・・・の属性と対応するデータを有する。“Model No.”は、対象ターゲットの情報、例えば、対象ターゲットの型番（モデル番号）を示す。“Lib name A”は、置換対象のライブラリファイル名であり、“Link addr A1”は、置換対象のライブラリファイルのアドレス情報である。
【００５０】
そのため、実施例２−１にかかるモジュール置換処理は、実施例１−１における置換対象の関数モジュールをライブラリファイルとして適用することで、実現可能である。図１５は、実施例２−１において、対象ハードウェアにおいてＮａｔｉｖｅアプリケーション１１１ｂが起動されて、メモリ１２０にロードされた場合のプロセスメモリ空間の例を示す図である。ここでは、置換用ライブラリファイル１１２ｂ及び１１２ｃのメモリ領域も確保され、その上、ネイティブコード１１１２ｂのＧＯＴ参照先が”func@SharedA’”及び”func@SharedX’”に書き換えられていることを示す。そのため、“App A”の実行においてライブラリ“libSharedA.so”及び“libSharedX.so”が呼び出される代わりにライブラリ“libSharedA’.so”及び“libSharedX’.so”が呼び出されて実行される。そのため、対象ハードウェアにおけるＮａｔｉｖｅアプリケーション１１１ｂの処理において、高速化、最適化、消費電力効率化を実現できる。そして、そのためのアプリケーションベンダー及びハードウェアベンダーの負担を軽減できる。
【００５１】
尚、実施例２−１は、次のように表現することもできる。すなわち、前記所定のモジュールは、複数の関数を含む所定のライブラリファイルであり、前記置換用モジュールは、前記所定のライブラリファイルに含まれる複数の関数の処理内容が前記対象ハードウェア向けに実装された複数の関数を含む置換用ライブラリファイルであり、前記置換定義情報は、前記所定のライブラリファイルから置換される前記置換用ライブラリファイルを定義している。このように、実施例２−１では、ライブラリファイル単位の差替えとなるため、置換定義情報１１３ｂの設定は容易となり、ハードウェアベンダーにとっての運用も容易であり、負担がさらに軽減できる。
【００５２】
＜実施例２−２＞
実施例２−２では、実施例２−１と同様のネイティブコードにおいて、ライブラリファイル内の関数ごとに置換する場合について説明する。図１６は、実施例２−２にかかる置換定義情報１１３ｄの例を示す図である。置換定義情報１１３ｄは、対象アプリテーブルＴＡ１ａと、対象ライブラリテーブルＴＬ１ａと、対象関数テーブルＴＦ１〜ＴＦｎとを含む。尚、対象ライブラリテーブルＴＬ１以外の対象ライブラリテーブル、及び、対象関数テーブルＴＦ１〜ＴＦｎのそれぞれに登録された複数の関数モジュールは、図示を省略する。対象アプリテーブルＴＡ１ａは、図１４と同様である。また、対象ライブラリテーブルＴＬ１ａは、“Link addr A1”等において、対象関数テーブルＴＦ１〜ＴＦｎへのリンクアドレスが設定されている。対象関数テーブルＴＦ１〜ＴＦｎは、ライブラリファイル単位である点を除き、図４と同様である。
【００５３】
そのため、実施例２−２にかかるモジュール置換処理は、実施例１−１及び２−１を組み合わせることで、ライブラリファイルごとに、関数単位の置換が実現可能である。また、実施例２−２は、次のように表現することもできる。すなわち、前記ネイティブコードは、複数の関数を含む異なる複数のライブラリファイルを前記所定のモジュールとして参照し、前記置換用モジュールは、前記複数のライブラリファイルのそれぞれに含まれる関数のうち少なくとも一部の処理内容が前記対象ハードウェア向けに実装された関数であり、前記置換定義情報は、前記複数のライブラリファイルのそれぞれに含まれる関数のうち少なくとも一部から置換される関数を前記置換用モジュールとして定義している。これにより、ライブラリファイルごとに、関数単位の置換が容易に実現でき、きめ細かく管理できる。さらに、置換を行う関数を必要最小限にすることで、省メモリ化を実現できる。
【００５４】
＜その他の実施の形態＞
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更及び組み合わせすることが可能である。
【符号の説明】
【００５５】
１００  モジュール置換システム
１１０  ストレージ
１１１  Ｎａｔｉｖｅアプリケーション
１１１ａ  Ｎａｔｉｖｅアプリケーション
１１１１ａ  非ネイティブコード
１１１２ａ  ネイティブコード
１１１２ｂ  ネイティブコード
１１１３ａ  動的ライブラリ
１１２  置換用モジュール
１１２ａ  置換用モジュール群
１１２ｂ  置換用ライブラリファイル
１１２ｃ  置換用ライブラリファイル
１１３  置換定義情報
１１３ａ  置換定義情報
１１３ｂ  置換定義情報
１１３ｃ  置換定義情報
１１３ｄ  置換定義情報
１１４  外部共有ライブラリ
１２０  メモリ
１３０  プロセッサ
１３１  特定部
１３２  ロード部
１３３  アドレス置換部
１４０  通信部
ＴＡ１  対象アプリテーブル
ＴＡ１ａ  対象アプリテーブル
ＴＦ１  対象関数テーブル
ＴＦｎ  対象関数テーブル
ＴＬ１  対象ライブラリテーブル
ＴＬｎ  対象ライブラリテーブル
ＴＬ１ａ  対象ライブラリテーブル
【図１】
2017111656.tif 000003
【図２】
2017111656.tif 000004
【図３】
2017111656.tif 000005
【図４】
2017111656.tif 000006
【図５】
2017111656.tif 000007
【図６】
2017111656.tif 000008
【図７】
2017111656.tif 000009
【図８】
2017111656.tif 000010
【図９】
2017111656.tif 000011
【図１０】
2017111656.tif 000012
【図１１】
2017111656.tif 000013
【図１２】
2017111656.tif 000014
【図１３】
2017111656.tif 000015
【図１４】
2017111656.tif 000016
【図１５】
2017111656.tif 000017
【図１６】
2017111656.tif 000018