4

libs/armeabi フォルダーに共有ライブラリーを配置しています。を使用してロードされます

System.loadLibrary("library_name.so");

ライブラリのサイズは約 3MB です。ロード時間は非常に長いです。20秒近く続くこともあります。私のGUIをブロックします。別のスレッドに入れようとしましSystem.loadLibrary("library_name.so");たが、GUI がまだブロックされています。他のアプリではさらに大きな .so ファイルを使用していることは知っていますが、読み込み時間はそれほど長くありません。何が問題なのですか?

編集

3MB はデバッグ バージョンのサイズです。リリース版は800KB程度ですが、問題は同じです。いくつかの追加情報:

  • .so には、循環接続されている 2 つの C++ ライブラリが含まれています
  • 実行arm-linux-androideabi-nm -D -C -g library_name.soすると、多くの関数と変数が表示されます
  • もう使わLOCAL_WHOLE_STATIC_LIBRARIESない
  • を使用して取得したセクション ヘッダー テーブルを次に示しますarm-linux-androideabi-readelf-tool
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

  [ 0]                   NULL            00000000 000000 000000 00      0   0  0

  [ 1] .dynsym           DYNSYM          00000114 000114 00b400 10   A  2   1  4

  [ 2] .dynstr           STRTAB          0000b514 00b514 015b0c 00   A  0   0  1

  [ 3] .hash             HASH            00021020 021020 004d1c 04   A  1   0  4

  [ 4] .rel.dyn          REL             00025d3c 025d3c 006e98 08   A  1   0  4

  [ 5] .rel.plt          REL             0002cbd4 02cbd4 000468 08   A  1   6  4

  [ 6] .plt              PROGBITS        0002d03c 02d03c 0006b0 00  AX  0   0  4

  [ 7] .text             PROGBITS        0002d6f0 02d6f0 08e6e0 00  AX  0   0  8

  [ 8] .ARM.extab        PROGBITS        000bbdd0 0bbdd0 00bad0 00   A  0   0  4

  [ 9] .ARM.exidx        ARM_EXIDX       000c78a0 0c78a0 005b80 08  AL  7   0  4

  [10] .rodata           PROGBITS        000cd420 0cd420 005cc0 00   A  0   0  4

  [11] .data.rel.ro.loca PROGBITS        000d46d8 0d36d8 0006e4 00  WA  0   0  4

  [12] .fini_array       FINI_ARRAY      000d4dbc 0d3dbc 000008 00  WA  0   0  4

  [13] .init_array       INIT_ARRAY      000d4dc4 0d3dc4 00009c 00  WA  0   0  4

  [14] .data.rel.ro      PROGBITS        000d4e60 0d3e60 00384c 00  WA  0   0  8

  [15] .dynamic          DYNAMIC         000d86ac 0d76ac 000100 08  WA  2   0  4

  [16] .got              PROGBITS        000d87ac 0d77ac 000854 00  WA  0   0  4

  [17] .data             PROGBITS        000d9000 0d8000 000648 00  WA  0   0  8

  [18] .bss              NOBITS          000d9648 0d8648 047271 00  WA  0   0  8

  [19] .comment          PROGBITS        00000000 0d8648 000026 01  MS  0   0  1

  [20] .note.gnu.gold-ve NOTE            00000000 0d8670 00001c 00      0   0  4

  [21] .ARM.attributes   ARM_ATTRIBUTES  00000000 0d868c 00002d 00      0   0  1

  [22] .shstrtab         STRTAB          00000000 0d86b9 0000d8 00      0   0  1
4

2 に答える 2

1

共有ライブラリでエクスポートされる関数の数を減らしてみてください。使用できます

arm-linux-androideabi-nm -D -C -g library_name.so

そのリストが不必要に長いかどうかを確認し、使用しないものを削除します (それらを静的と宣言します)。nmのマニュアルを参照し$man nmて、その使用方法と解釈につ​​いて読むことができます。

多くの関数を使用する必要がある場合は、名前マングリングやルックアップに頼るのではなく、 RegisterNatives()を使用して関数を登録しますJava_your_path_YourClass_yourFunction

stripライブラリにシンボルが含まれている場合は、(arm-linux-androideabi-strip) ライブラリを試すこともできます。

UI のブロックを回避するために、共有ライブラリを別のスレッドの早い段階でロードして、それを待つことができます。

静的ライブラリを公開することが最終的に必要でない場合は、LOCAL_WHOLE_STATIC_LIBRARIES を使用しません。

LOCAL_WHOLE_STATIC_LIBRARIES

  • これらは、リンカーがデッド コードを削除することを許可せずにモジュールに含めるスタティック ライブラリです。
  • これは、静的ライブラリを共有ライブラリに追加し、静的ライブラリのコンテンツを共有ライブラリから公開する場合に最も役立ちます。

ビルドの問題を回避する代わりに、その問題を修正してみてください。

于 2013-02-20T07:34:31.583 に答える
1

問題は、一部のコンストラクターでの静的初期化であり、完了するまでに時間がかかります

于 2013-03-18T08:55:56.730 に答える