1

作为我研究的一部分,我需要检测任何给定 .apk 文件的 dalvik 字节码,并使用检测过的字节码获得工作的、修改过的 .apk。

我在 Windows 7 下使用 Java 1.6 编程。

输入

  • 原始的 .apk 文件,带有原始的、未更改的classes.dexdalvik 字节码。
  • .apk的检测classes.dex字节码(是的,我们假设我们已经检测了字节码)。

期望的输出

  • 带有检测字节码的 .apk 文件,classes.dex而不是原始文件。

问题陈述

从 Java 源代码获取所需输出的最直接方法是什么?

4

1 回答 1

5

2016 年 4 月 12 日更新

关于原始答案的第2步:

当前版本的来源ApkBuilder可以在官方 repo中找到,解释为什么应该使用它的评论也可以在官方 repo中找到。

在您本地的 Android SDK 安装中,这些类似乎存在于android-sdk/tools/lib/sdklib.jar


原始答案 2012 年 11 月 30 日

第一步:删除原来的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由于脚本已被弃用,因此构建 .apks 存在很多困惑。有关详细信息,请参阅此讨论

在幕后脚本调用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 回答