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