如何在Android Studio中使用apksig库编程实现APK签名
Android 端使用 apksig 库实现 APK 签名完整示例
1. 导入依赖
在 app 模块的 build.gradle dependencies 块中添加 apksig 库依赖:
dependencies { // 选用和你项目AGP版本匹配的稳定版即可,这里以7.4.0为例 implementation 'com.android.tools.build:apksig:7.4.0' }
2. 加载密钥与X509证书
首先从你的密钥库(.jks/.keystore)中取出签名需要的私钥和证书对象,示例代码:
import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; // 密钥库参数,替换为你自己的配置 String keystorePath = "/sdcard/your_keystore.jks"; String keystorePwd = "your_keystore_password"; String alias = "your_key_alias"; String keyPwd = "your_key_password"; // 加载密钥库 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(new FileInputStream(keystorePath), keystorePwd.toCharArray()); // 获取私钥和证书 PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, keyPwd.toCharArray()); X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
如果你的私钥和证书是其他格式存储的,只需要按照对应格式解析得到 PrivateKey 和 X509Certificate 实例即可,不需要调整后续签名逻辑。
3. 核心APK签名逻辑
直接调用 apksig 提供的签名工具完成签名输出:
import com.android.apksig.ApkSigner; import com.android.apksig.apk.ApkFormatException; import java.io.File; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SignatureException; import java.util.ArrayList; import java.util.List; // 输入输出路径,替换为你自己的路径 File inputApk = new File("/sdcard/input.apk"); File outputSignedApk = new File("/sdcard/output_signed.apk"); // 构造签名者配置 List<ApkSigner.SignerConfig> signerConfigs = new ArrayList<>(); ApkSigner.SignerConfig signerConfig = new ApkSigner.SignerConfig.Builder() .setPrivateKey(privateKey) .setCertificates(List.of(cert)) .build(); signerConfigs.add(signerConfig); // 构造签名器,可按需开启/关闭不同签名方案 ApkSigner apkSigner = new ApkSigner.Builder(signerConfigs) .setInputApk(inputApk) .setOutputApk(outputSignedApk) .setV1SigningEnabled(true) // 开启v1签名,兼容Android 7.0以下 .setV2SigningEnabled(true) // 开启v2签名,Android 7.0+推荐 .setV3SigningEnabled(true) // 开启v3签名,Android 9.0+支持 .build(); // 执行签名 try { apkSigner.sign(); } catch (ApkFormatException | IOException | NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { e.printStackTrace(); // 处理签名异常 }
4. 必要配置说明
- 权限配置:需要在AndroidManifest中申请读写存储权限,Android 10及以上版本需要适配分区存储,确保可以读写输入输出APK文件
- 签名方案选择:如果你的签名APK需要兼容Android 6.0及更低版本,必须开启v1签名
- 依赖版本匹配:apksig库版本尽量和你项目的Android Gradle Plugin版本保持一致,避免兼容性问题
内容的提问来源于stack exchange,提问作者rax64
相关产品推荐
相关产品推荐

