diff --git a/extensions/all/misc/adb/hide-adb/build.gradle.kts b/extensions/all/misc/adb/hide-adb/build.gradle.kts
new file mode 100644
index 000000000..18568df5c
--- /dev/null
+++ b/extensions/all/misc/adb/hide-adb/build.gradle.kts
@@ -0,0 +1,16 @@
+android {
+ namespace = "app.revanced.extension"
+
+ defaultConfig {
+ minSdk = 21
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+dependencies {
+ compileOnly(libs.annotation)
+}
diff --git a/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml b/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..15e7c2ae6
--- /dev/null
+++ b/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java b/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java
new file mode 100644
index 000000000..b64cf28e4
--- /dev/null
+++ b/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java
@@ -0,0 +1,28 @@
+package app.revanced.extension.all.hide.adb;
+
+import android.content.ContentResolver;
+import android.provider.Settings;
+
+import java.util.Arrays;
+import java.util.List;
+
+@SuppressWarnings("unused")
+public final class HideAdbPatch {
+ private static final List SPOOF_SETTINGS = Arrays.asList("adb_enabled", "adb_wifi_enabled", "development_settings_enabled");
+
+ public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException {
+ if (SPOOF_SETTINGS.contains(name)) {
+ return 0;
+ }
+
+ return Settings.Global.getInt(cr, name);
+ }
+
+ public static int getInt(ContentResolver cr, String name, int def) {
+ if (SPOOF_SETTINGS.contains(name)) {
+ return 0;
+ }
+
+ return Settings.Global.getInt(cr, name, def);
+ }
+}
diff --git a/patches/api/patches.api b/patches/api/patches.api
index 414342e4e..72c53e50a 100644
--- a/patches/api/patches.api
+++ b/patches/api/patches.api
@@ -2,6 +2,10 @@ public final class app/revanced/patches/all/misc/activity/exportall/ExportAllAct
public static final fun getExportAllActivitiesPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
}
+public final class app/revanced/patches/all/misc/adb/HideAdbPatchKt {
+ public static final fun getHideAdbStatusPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
public final class app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatchKt {
public static final fun baseSpoofBuildInfoPatch (Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch;
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt
new file mode 100644
index 000000000..61a7c9dfb
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt
@@ -0,0 +1,57 @@
+package app.revanced.patches.all.misc.adb
+
+import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
+import app.revanced.patcher.patch.bytecodePatch
+import app.revanced.patches.all.misc.transformation.transformInstructionsPatch
+import app.revanced.util.getReference
+import com.android.tools.smali.dexlib2.Opcode
+import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
+import com.android.tools.smali.dexlib2.iface.reference.MethodReference
+import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference
+import com.android.tools.smali.dexlib2.util.MethodUtil
+
+private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/all/spoof/adb/SpoofAdbPatch;"
+
+private val SETTINGS_GLOBAL_GET_INT_METHOD_REFERENCE = ImmutableMethodReference(
+ "Landroid/provider/Settings\$Global;",
+ "getInt",
+ emptyList(),
+ "I"
+)
+
+@Suppress("unused")
+val hideAdbStatusPatch = bytecodePatch(
+ name = "Hide ADB status",
+ description = "Hides enabled development settings and/or ADB.",
+ use = false,
+) {
+ extendWith("extensions/all/misc/adb/hide-adb.rve")
+
+ dependsOn(
+ transformInstructionsPatch(
+ filterMap = filterMap@{ classDef, method, instruction, instructionIndex ->
+ val reference = instruction
+ .takeIf { it.opcode == Opcode.INVOKE_STATIC }
+ ?.getReference()
+ ?.takeIf { MethodUtil.methodSignaturesMatch(SETTINGS_GLOBAL_GET_INT_METHOD_REFERENCE, it) }
+ ?: return@filterMap null
+
+ Triple(instruction as Instruction35c, instructionIndex, reference.parameterTypes)
+ },
+ transform = { method, entry ->
+ val (instruction, index, parameterTypes) = entry
+ val parameterString = parameterTypes.joinToString(separator = "")
+
+ val registerString = when (parameterTypes.size) {
+ 2 -> "v${instruction.registerC}, v${instruction.registerD}"
+ else -> "v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}"
+ }
+
+ method.replaceInstruction(
+ index,
+ "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->getInt($parameterString)I"
+ )
+ }
+ )
+ )
+}