8

Dex ファイルを変換/計測したい。変換の目標には、コード カバレッジの測定が含まれます。ソースファイルは利用できないことに注意してください。したがって、Dex のインストルメント化が唯一のオプションです。

目標を達成するためのツールを作成するための例として参照できる既存のコード ベースがあるかどうか疑問に思っています。

私は、Smali プロジェクトと、Smali 上に構築された他の多くのプロジェクトについて知っています。ただし、これらのプロジェクトはいずれも、私の目的に適した例ではありません。

smali コードまたは dexlib 表現を自動的に変換するコードを探しています。そこから smali が生成されます。後者のオプションは、smali を生成するオーバーヘッドを回避できるため、私の目的には適しています。

4

5 に答える 5

3

たくさんのコードですが、dxのDexMergerはdexファイルを変換するサンプルプログラムです。前方参照を機能させるには、出力のサイズを推測する必要があるため、非常に複雑になります。

また、dalvik命令を書き直すためのインフラストラクチャを作成する必要があります。DexMergerのInstructionTransformerは、浅い書き換えを行います。つまり、あるマッピングから別のマッピングへのオフセットを調整します。コードカバレッジを測定するには、おそらく命令の書き換えをはるかに高度にする必要があります。

于 2012-10-20T16:00:49.300 に答える
2

(記録のために、私はここで自分の質問に答えています)

結局、自分の要件に合ったツールは見つかりませんでした。そこで、DexLib に基づいてEllaという独自のツールを構築することになりました。コード カバレッジの測定、メソッド トレースの記録など、すぐに使用できる機能がいくつかありますが、他の種類の変換を行うように簡単に拡張できます。

于 2015-08-03T02:38:43.357 に答える
1

場合によっては、smali 自体が dex ファイルを再アセンブルする際に、少量の命令の書き換えを行います。ターゲットが範囲外の場合、const-string を const-string/jumbo に置き換えたり、goto 命令を「より大きな」命令に置き換えたりするようなものです。これには、命令リスト内の命令を潜在的に大きなものに置き換えること、および対応するオフセットを修正することが含まれます。

CodeItem.fixInstructionsは、これを担当するメソッドです。


さらに、asmdex ライブラリがあります。私はあまり詳しくありませんが、あなたがやりたいことに関連しているように思えます。

于 2012-10-20T17:28:01.600 に答える
0

少し遅れていることは承知していますが、まだ興味がある場合や、他の読者のために. ASMDEXはすでに言及されています。そして、それがあなたが達成しようとしていることに対する現時点での最善の策だと思います。

新しいレジスタの追加については、org.ow2.asmdex.util.RegisterShiftMethodAdapter クラスを参照してください。完璧ではありません!実際のところ、レジスタを追加するときに既存の 4 ビット命令を変更すると、一部のレジスタが最終的に 0xF になり、4 ビットに収まらなくなるという恐ろしい事態が発生します。

しかし、それは良いスタートになるはずです。

于 2013-04-05T19:19:44.560 に答える