Skip to content

Commit 740ebd0

Browse files
committed
feat: Support customize signing levels
1 parent fe3e1c9 commit 740ebd0

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

api/android/revanced-library.api

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@ public final class app/revanced/library/ApkSigner$PrivateKeyCertificatePair {
2828
public final class app/revanced/library/ApkSigner$Signer {
2929
public final fun signApk (Lcom/android/tools/build/apkzlib/zip/ZFile;)V
3030
public final fun signApk (Ljava/io/File;)V
31-
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
31+
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/util/Set;)V
32+
public static synthetic fun signApk$default (Lapp/revanced/library/ApkSigner$Signer;Ljava/io/File;Ljava/io/File;Ljava/util/Set;ILjava/lang/Object;)V
3233
}
3334

3435
public final class app/revanced/library/ApkUtils {
3536
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
3637
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
3738
public final fun newPrivateKeyCertificatePair (Lapp/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
3839
public final fun readPrivateKeyCertificatePairFromKeyStore (Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
40+
public final fun readSigningLevels (Ljava/io/File;)Ljava/util/Set;
3941
public final fun sign (Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
4042
public final fun sign (Ljava/io/File;Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
4143
public final fun sign (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
42-
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
44+
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;Ljava/util/Set;)V
45+
public static synthetic fun signApk$default (Lapp/revanced/library/ApkUtils;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;Ljava/util/Set;ILjava/lang/Object;)V
4346
}
4447

4548
public final class app/revanced/library/ApkUtils$KeyStoreDetails {

api/jvm/revanced-library.api

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@ public final class app/revanced/library/ApkSigner$PrivateKeyCertificatePair {
2828
public final class app/revanced/library/ApkSigner$Signer {
2929
public final fun signApk (Lcom/android/tools/build/apkzlib/zip/ZFile;)V
3030
public final fun signApk (Ljava/io/File;)V
31-
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
31+
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/util/Set;)V
32+
public static synthetic fun signApk$default (Lapp/revanced/library/ApkSigner$Signer;Ljava/io/File;Ljava/io/File;Ljava/util/Set;ILjava/lang/Object;)V
3233
}
3334

3435
public final class app/revanced/library/ApkUtils {
3536
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
3637
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
3738
public final fun newPrivateKeyCertificatePair (Lapp/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
3839
public final fun readPrivateKeyCertificatePairFromKeyStore (Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
40+
public final fun readSigningLevels (Ljava/io/File;)Ljava/util/Set;
3941
public final fun sign (Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
4042
public final fun sign (Ljava/io/File;Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
4143
public final fun sign (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
42-
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
44+
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;Ljava/util/Set;)V
45+
public static synthetic fun signApk$default (Lapp/revanced/library/ApkUtils;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;Ljava/util/Set;ILjava/lang/Object;)V
4346
}
4447

4548
public final class app/revanced/library/ApkUtils$KeyStoreDetails {

src/commonMain/kotlin/app/revanced/library/ApkSigner.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,16 @@ object ApkSigner {
331331
signingExtension = null
332332
}
333333

334-
fun signApk(inputApkFile: File, outputApkFile: File) {
334+
fun signApk(inputApkFile: File, outputApkFile: File, signingLevels: Set<Int> = setOf()) {
335335
logger.info("Signing APK")
336336

337+
if (signingLevels.isNotEmpty() && signerBuilder != null) {
338+
signerBuilder.setV1SigningEnabled(signingLevels.contains(1))
339+
signerBuilder.setV2SigningEnabled(signingLevels.contains(2))
340+
signerBuilder.setV3SigningEnabled(signingLevels.contains(3))
341+
signerBuilder.setV4SigningEnabled(signingLevels.contains(4))
342+
}
343+
337344
signerBuilder?.setInputApk(inputApkFile)?.setOutputApk(outputApkFile)?.build()?.sign()
338345
}
339346

src/commonMain/kotlin/app/revanced/library/ApkUtils.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package app.revanced.library
22

33
import app.revanced.library.ApkSigner.newPrivateKeyCertificatePair
44
import app.revanced.patcher.PatcherResult
5+
import com.android.apksig.ApkVerifier
56
import com.android.tools.build.apkzlib.zip.AlignmentRules
67
import com.android.tools.build.apkzlib.zip.StoredEntry
78
import com.android.tools.build.apkzlib.zip.ZFile
@@ -153,20 +154,22 @@ object ApkUtils {
153154
* @param outputApkFile The file to save the signed apk to.
154155
* @param signer The name of the signer.
155156
* @param keyStoreDetails The details for the keystore.
157+
* @param signingLevels Signature levels, empty to default.
156158
*/
157159
fun signApk(
158160
inputApkFile: File,
159161
outputApkFile: File,
160162
signer: String,
161163
keyStoreDetails: KeyStoreDetails,
164+
signingLevels: Set<Int> = setOf(),
162165
) = ApkSigner.newApkSigner(
163166
signer,
164167
if (keyStoreDetails.keyStore.exists()) {
165168
readPrivateKeyCertificatePairFromKeyStore(keyStoreDetails)
166169
} else {
167170
newPrivateKeyCertificatePair(PrivateKeyCertificatePairDetails(), keyStoreDetails)
168171
},
169-
).signApk(inputApkFile, outputApkFile)
172+
).signApk(inputApkFile, outputApkFile, signingLevels)
170173

171174
@Deprecated("This method will be removed in the future.")
172175
private fun readOrNewPrivateKeyCertificatePair(
@@ -235,6 +238,27 @@ object ApkUtils {
235238
readOrNewPrivateKeyCertificatePair(signingOptions),
236239
)
237240

241+
/**
242+
* Read apk signature levels.
243+
*
244+
* Note: a well-signed apk is required.
245+
*/
246+
fun readSigningLevels(apkFile: File): Set<Int> {
247+
val verify = ApkVerifier.Builder(apkFile).build().verify()
248+
if (!verify.isVerified)
249+
return setOf()
250+
val result = mutableSetOf<Int>()
251+
if (verify.v1SchemeSigners.isNotEmpty())
252+
result.add(1)
253+
if (verify.v2SchemeSigners.isNotEmpty())
254+
result.add(2)
255+
if (verify.v3SchemeSigners.isNotEmpty())
256+
result.add(3)
257+
if (verify.v4SchemeSigners.isNotEmpty())
258+
result.add(4)
259+
return result
260+
}
261+
238262
/**
239263
* Options for signing an apk.
240264
*

0 commit comments

Comments
 (0)