web-dev-qa-db-ja.com

スマリコードとはAndroid

Dalvik VM、dex、Smaliについて少し学習します。

私はsmaliについて読んだことがありますが、それでもコンパイラのチェーンのどこにあるのかを明確に理解することはできません。そしてその目的。
ここでいくつかの質問:

  1. 私が知っているように、他の仮想マシンと同様にdalvikはバイトコードを実行します。Androidの場合、dexバイトコードです。
  2. Smaliとは何ですか? Android OSまたはDalvik Vmは直接動作しますか、それともちょうど同じdexバイトコードですが人間にとってより読みやすいですか?
  3. それはWindows用のディスサンブラー(OllyDbgなど)のようなもので、異なるマシンコード(D3、5Fなど)で構成されるプログラム実行可能ファイルであり、各マシンコードに適切なアセンブリコマンドがありますが、Dalvik Vmもソフトウェアなので、smaliはバイトコードの可読表現です
  4. 新しいART環境があります。それはまだバイトコードを使用していますか、それとも直接ネイティブコードを実行しますか?

前もって感謝します。

25
user4598738

アプリケーションコードを作成すると、apkファイルには.dexファイルが含まれ、バイナリDalvikバイトコードが含まれます。これは、プラットフォームが実際に理解する形式です。ただし、バイナリコードの読み取りや変更は簡単ではないため、人間が読み取れる表現との間で変換するツールがあります。最も一般的な人間が読める形式は、Smaliとして知られています。これは、あなたが言及した逆アセンブラーと本質的に同じです。

たとえば、Javaのようなコードを実行するコードがあるとします

int x = 42

これが最初の変数であると仮定すると、メソッドのdexコードには16進シーケンスが含まれている可能性が高い

13 00 2A 00

Baksmaliを実行すると、次の行を含むテキストファイルが取得されます。

const/16 v0, 42

バイナリコードよりも明らかに読みやすいです。しかし、プラットフォームはsmaliについて何も知らず、バイトコードを簡単に操作できるようにするためのツールにすぎません。

DalvikとARTは、どちらもdalvikバイトコードを含む.dexファイルを取ります。アプリケーション開発者には完全に透過的です。唯一の違いは、アプリケーションをインストールして実行したときに舞台裏で何が起こるかです。

39
Antimony