1

調査の一環として、特定の .apk ファイルの dalvik バイトコードを計測し、計測されたバイトコードで動作する変更された .apk を取得する必要があります。

Windows 7でJava 1.6でプログラミングしています。

入力

  • 元の変更されていないclasses.dexdalvik バイトコードを含む元の .apk ファイル。
  • .apkの計測classes.dex済みバイトコード (はい、バイトコードは既に計測済みであると想定しています)。

望ましい出力

  • classes.dexオリジナルの代わりにインストルメント化されたバイトコードを含む .apk ファイル。

問題文

Java ソースコードから目的の出力を取得する最も簡単な方法は何ですか?

4

1 に答える 1

5

2016 年 4 月 12 日更新

元の回答のステップ2について:

の現在のバージョンのソースは、こちらの公式リポジトリにあり、なぜそれを使用すべきかを説明するコメントApkBuilder、公式リポジトリにもあります。

ローカルの Android SDK インストールでは、クラスは次の場所にあるようですandroid-sdk/tools/lib/sdklib.jar


元の回答12年11月30日

ステップ 1: 元の classes.dex を削除する

カスタム ファイルを使用して .apk を再構築するにはclasses.dex、最初に元のファイルを削除する必要がありclasses.dexます。これは、 Android SDKaapt.exeインストール ディレクトリのツールを使用して簡単に実行できます。たとえば、次の場所にあります。c:\Program Files (x86)\Android\android-sdk\platform-tools\aapt.exe

コマンド:

aapt.exe remove <path-to-the-apk> classes.dex 

ファイルを削除します。

ステップ 2: .apk を再構築する

(...)\android-sdk\tools\apkbuilder.batスクリプトは非推奨であるため、.apk のビルドについては多くの混乱があります。詳細については、このディスカッションを参照してください。

舞台裏で、ApkBuilderMain非推奨でない を呼び出すスクリプトが呼び出しますApkBuilder

利用できなくなった非公式のソースに基づいて、次のコード スニペットを思いつきました。

  /**
   * Builds the {@code sourceApk} with bytecode merged from {@code classesDex}. The built .apk file has the same
   * name as {@code sourceApk} and is put in {@code outputDir}.<br/>
   * <br/>
   * <b>Precondition:</b> The {@code sourceApk} doesn't contain {@code classes.dex}, so the {@code classesDex} can be
   * merged into it.
   */  
  private static File buildApk(File sourceApk, File classesDex, File outputDir) throws Exception
  {

    File outputApk;
    try {
      outputApk = new File(outputDir, sourceApk.getName());
      ApkBuilder builder = new ApkBuilder(outputApk, sourceApk, classesDex, ApkBuilder.getDebugKeystore(), null);
      builder.sealApk();
    } catch (ApkCreationException e) {
      throw new Exception(e);
    } catch (SealedApkException e) {
      throw new Exception(e);
    }

    return outputApk;
  }  
于 2012-11-30T22:15:47.237 に答える