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;
}