diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt index 5d181481c..31e51a9d3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt @@ -32,20 +32,16 @@ fun baseAdsPatch( description = "baseAdsPatch" ) { execute { - setOf( - sslGuardFingerprint, - videoAdsFingerprint, - ).forEach { fingerprint -> - fingerprint.methodOrThrow().apply { - addInstructionsWithLabels( - 0, """ - invoke-static {}, $classDescriptor->$methodDescriptor()Z - move-result v0 - if-nez v0, :show_ads - return-void - """, ExternalLabel("show_ads", getInstruction(0)) - ) - } + + videoAdsFingerprint.methodOrThrow().apply { + addInstructionsWithLabels( + 0, """ + invoke-static {}, $classDescriptor->$methodDescriptor()Z + move-result v0 + if-nez v0, :show_ads + return-void + """, ExternalLabel("show_ads", getInstruction(0)) + ) } musicAdsFingerprint.methodOrThrow().apply { @@ -66,22 +62,6 @@ fun baseAdsPatch( ) } - advertisingIdFingerprint.matchOrThrow().let { - it.method.apply { - val insertIndex = it.stringMatches!!.first().index - val insertRegister = getInstruction(insertIndex).registerA - - addInstructionsWithLabels( - insertIndex, """ - invoke-static {}, $classDescriptor->$methodDescriptor()Z - move-result v$insertRegister - if-nez v$insertRegister, :enable_id - return-void - """, ExternalLabel("enable_id", getInstruction(insertIndex)) - ) - } - } - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/ads/Fingerprints.kt index 6853546b4..9ec138962 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/ads/Fingerprints.kt @@ -4,24 +4,6 @@ import app.revanced.util.fingerprint.legacyFingerprint import app.revanced.util.or import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.util.MethodUtil - -internal val advertisingIdFingerprint = legacyFingerprint( - name = "advertisingIdFingerprint", - returnType = "V", - strings = listOf("a."), - customFingerprint = { method, classDef -> - MethodUtil.isConstructor(method) && - classDef.fields.find { it.type == "Ljava/util/Random;" } != null - } -) - -internal val sslGuardFingerprint = legacyFingerprint( - name = "sslGuardFingerprint", - returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - strings = listOf("Cannot initialize SslGuardSocketFactory will null"), -) internal val musicAdsFingerprint = legacyFingerprint( name = "musicAdsFingerprint", diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/gms/Fingerprints.kt index 29cd4178b..5023fbac1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/gms/Fingerprints.kt @@ -25,16 +25,6 @@ internal val castContextFetchFingerprint = legacyFingerprint( strings = listOf("Error fetching CastContext.") ) -internal val castDynamiteModuleFingerprint = legacyFingerprint( - name = "castDynamiteModuleFingerprint", - strings = listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl") -) - -internal val castDynamiteModuleV2Fingerprint = legacyFingerprint( - name = "castDynamiteModuleV2Fingerprint", - strings = listOf("Failed to load module via V2: ") -) - internal val googlePlayUtilityFingerprint = legacyFingerprint( name = "castContextFetchFingerprint", returnType = "I", @@ -54,6 +44,12 @@ internal val serviceCheckFingerprint = legacyFingerprint( strings = listOf("Google Play Services not available") ) +internal val gmsServiceBrokerFingerprint = legacyFingerprint( + name = "gmsServiceBrokerFingerprint", + returnType = "V", + strings = listOf("mServiceBroker is null, client disconnected") +) + internal val primesApiFingerprint = legacyFingerprint( name = "primesApiFingerprint", returnType = "V", diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/gms/GmsCoreSupportPatch.kt index f23b5411f..3aa74bb52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/gms/GmsCoreSupportPatch.kt @@ -104,6 +104,18 @@ fun gmsCoreSupportPatch( required = true, ) + val disableGmsServiceBroker by booleanOption( + key = "disableGmsServiceBroker", + default = false, + title = "Disable GmsService Broker", + description = """ + Disabling GmsServiceBroker will somewhat improve crashes caused by unimplemented GmsCore services. + + For YouTube, the 'Spoof streaming data' setting is required. + """.trimIndentMultiline(), + required = true, + ) + val packageNameYouTubeOption = stringOption( key = "packageNameYouTube", default = DEFAULT_PACKAGE_NAME_YOUTUBE, @@ -293,11 +305,12 @@ fun gmsCoreSupportPatch( // Return these methods early to prevent the app from crashing. setOf( castContextFetchFingerprint, - castDynamiteModuleFingerprint, - castDynamiteModuleV2Fingerprint, googlePlayUtilityFingerprint, serviceCheckFingerprint, ).forEach { it.methodOrThrow().returnEarly() } + if (disableGmsServiceBroker == true) { + gmsServiceBrokerFingerprint.methodOrThrow().returnEarly() + } // Specific method that needs to be patched. transformPrimeMethod() @@ -352,10 +365,18 @@ fun gmsCoreSupportPatch( /** * A collection of permissions, intents and content provider authorities * that are present in GmsCore which need to be transformed. + * + * NOTE: The following were present, but it seems like they are not needed to be transformed: + * - com.google.android.gms.chimera.GmsIntentOperationService + * - com.google.android.gms.phenotype.internal.IPhenotypeCallbacks + * - com.google.android.gms.phenotype.internal.IPhenotypeService + * - com.google.android.gms.phenotype.PACKAGE_NAME + * - com.google.android.gms.phenotype.UPDATE + * - com.google.android.gms.phenotype */ private object Constants { /** - * All permissions. + * A list of all permissions. */ val PERMISSIONS = setOf( // C2DM / GCM @@ -439,9 +460,11 @@ private object Constants { "com.google.android.gms.feedback.internal.IFeedbackService", // cast - "com.google.android.gms.cast.firstparty.START", "com.google.android.gms.cast.service.BIND_CAST_DEVICE_CONTROLLER_SERVICE", + // chimera + "com.google.android.gms.chimera", + // fonts "com.google.android.gms.fonts", @@ -481,6 +504,9 @@ private object Constants { // auth "com.google.android.gms.auth.accounts", + // chimera + "com.google.android.gms.chimera", + // fonts "com.google.android.gms.fonts",