Skip to content

Commit 17623b0

Browse files
refactor
1 parent 07c5f3c commit 17623b0

File tree

4 files changed

+67
-36
lines changed

4 files changed

+67
-36
lines changed

extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@
3131

3232
@SuppressWarnings("unused")
3333
public class GmsCoreSupport {
34-
public static final String PACKAGE_NAME_YOUTUBE = "com.google.android.youtube";
35-
public static final String PACKAGE_NAME_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music";
36-
3734
private static final String GMS_CORE_PACKAGE_NAME
3835
= getGmsCoreVendorGroupId() + ".android.gms";
3936
private static final Uri GMS_CORE_PROVIDER
@@ -53,6 +50,20 @@ public class GmsCoreSupport {
5350
@Nullable
5451
private static volatile Boolean DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED;
5552

53+
private static String getOriginalPackageName() {
54+
return null; // Modified during patching.
55+
}
56+
57+
/**
58+
* @return If the current package name is the same as the original unpatched app.
59+
* If `GmsCore support` was not included during patching, this returns true;
60+
*/
61+
public static boolean isPackageNameOriginal() {
62+
String originalPackageName = getOriginalPackageName();
63+
return originalPackageName == null
64+
|| originalPackageName.equals(Utils.getContext().getPackageName());
65+
}
66+
5667
private static void open(String queryOrLink) {
5768
Logger.printInfo(() -> "Opening link: " + queryOrLink);
5869

@@ -113,11 +124,10 @@ public static void checkGmsCore(Activity context) {
113124
// Verify the user has not included GmsCore for a root installation.
114125
// GmsCore Support changes the package name, but with a mounted installation
115126
// all manifest changes are ignored and the original package name is used.
116-
String packageName = context.getPackageName();
117-
if (packageName.equals(PACKAGE_NAME_YOUTUBE) || packageName.equals(PACKAGE_NAME_YOUTUBE_MUSIC)) {
127+
if (isPackageNameOriginal()) {
118128
Logger.printInfo(() -> "App is mounted with root, but GmsCore patch was included");
119-
// Cannot use localize text here, since the app will load
120-
// resources from the unpatched app and all patch strings are missing.
129+
// Cannot use localize text here, since the app will load resources
130+
// from the unpatched app and all patch strings are missing.
121131
Utils.showToastLong("The 'GmsCore support' patch breaks mount installations");
122132

123133
// Do not exit. If the app exits before launch completes (and without
@@ -250,8 +260,8 @@ private static String getGmsCoreDownload() {
250260
};
251261
}
252262

253-
// Modified by a patch. Do not touch.
254263
private static String getGmsCoreVendorGroupId() {
255-
return "app.revanced";
264+
// Modified during patching.
265+
throw new IllegalStateException();
256266
}
257267
}

extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package app.revanced.extension.shared.patches;
22

3-
import static app.revanced.extension.shared.GmsCoreSupport.PACKAGE_NAME_YOUTUBE;
4-
import static app.revanced.extension.shared.GmsCoreSupport.PACKAGE_NAME_YOUTUBE_MUSIC;
5-
63
import android.content.ComponentName;
74
import android.content.Context;
85
import android.content.pm.PackageManager;
96

107
import java.util.ArrayList;
118
import java.util.List;
129

10+
import app.revanced.extension.shared.GmsCoreSupport;
1311
import app.revanced.extension.shared.Logger;
1412
import app.revanced.extension.shared.Utils;
1513
import app.revanced.extension.shared.settings.BaseSettings;
@@ -81,15 +79,15 @@ private static int numberOfCustomNamesIncludingDummyAliases() {
8179
*/
8280
public static void setBranding() {
8381
try {
82+
if (GmsCoreSupport.isPackageNameOriginal()) {
83+
Logger.printInfo(() -> "App is root mounted. Cannot dynamically change app icon");
84+
return;
85+
}
86+
8487
Context context = Utils.getContext();
8588
PackageManager pm = context.getPackageManager();
8689
String packageName = context.getPackageName();
8790

88-
if (packageName.equals(PACKAGE_NAME_YOUTUBE) || packageName.equals(PACKAGE_NAME_YOUTUBE_MUSIC)) {
89-
Logger.printInfo(() -> "App is root mounted. Cannot change dynamically change app icon");
90-
return;
91-
}
92-
9391
BrandingTheme selectedBranding = BaseSettings.CUSTOM_BRANDING_ICON.get();
9492
final int numberOfCustomNames = numberOfCustomNames();
9593
final int selectedNameIndex = BaseSettings.CUSTOM_BRANDING_NAME.get();

patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
package app.revanced.patches.shared.misc.gms
22

33
import app.revanced.patcher.fingerprint
4+
import app.revanced.patches.shared.misc.gms.EXTENSION_CLASS_DESCRIPTOR
45
import com.android.tools.smali.dexlib2.AccessFlags
56

67
const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId"
78

8-
internal val gmsCoreSupportFingerprint = fingerprint {
9-
custom { _, classDef ->
10-
classDef.endsWith("GmsCoreSupport;")
11-
}
12-
}
13-
149
internal val googlePlayUtilityFingerprint = fingerprint {
1510
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
1611
returns("I")
@@ -28,3 +23,21 @@ internal val serviceCheckFingerprint = fingerprint {
2823
parameters("L", "I")
2924
strings("Google Play Services not available")
3025
}
26+
27+
internal val gmsCoreSupportFingerprint = fingerprint {
28+
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
29+
returns("Ljava/lang/String;")
30+
parameters()
31+
custom { method, classDef ->
32+
method.name == "getGmsCoreVendorGroupId" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
33+
}
34+
}
35+
36+
internal val originalPackageNameExtensionFingerprint = fingerprint {
37+
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
38+
returns("Ljava/lang/String;")
39+
parameters()
40+
custom { methodDef, classDef ->
41+
methodDef.name == "getOriginalPackageName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
42+
}
43+
}

patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
package app.revanced.patches.shared.misc.gms
22

33
import app.revanced.patcher.Fingerprint
4-
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
4+
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
55
import app.revanced.patcher.extensions.InstructionExtensions.instructions
66
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
7-
import app.revanced.patcher.patch.*
7+
import app.revanced.patcher.patch.BytecodePatchBuilder
8+
import app.revanced.patcher.patch.BytecodePatchContext
9+
import app.revanced.patcher.patch.Option
10+
import app.revanced.patcher.patch.Patch
11+
import app.revanced.patcher.patch.ResourcePatchBuilder
12+
import app.revanced.patcher.patch.ResourcePatchContext
13+
import app.revanced.patcher.patch.bytecodePatch
14+
import app.revanced.patcher.patch.resourcePatch
15+
import app.revanced.patcher.patch.stringOption
816
import app.revanced.patches.all.misc.packagename.changePackageNamePatch
917
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
1018
import app.revanced.patches.all.misc.resources.addResources
1119
import app.revanced.patches.all.misc.resources.addResourcesPatch
1220
import app.revanced.patches.shared.misc.gms.Constants.ACTIONS
1321
import app.revanced.patches.shared.misc.gms.Constants.AUTHORITIES
1422
import app.revanced.patches.shared.misc.gms.Constants.PERMISSIONS
15-
import app.revanced.util.*
23+
import app.revanced.util.getReference
24+
import app.revanced.util.returnEarly
1625
import com.android.tools.smali.dexlib2.Opcode
1726
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c
1827
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@@ -23,6 +32,8 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
2332
import org.w3c.dom.Element
2433
import org.w3c.dom.Node
2534

35+
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/GmsCoreSupport;"
36+
2637
private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$"
2738

2839
/**
@@ -201,19 +212,18 @@ fun gmsCoreSupportPatch(
201212
googlePlayUtilityFingerprint.method.returnEarly(0)
202213
}
203214

215+
// Set original and patched package names for extension to use.
216+
originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName)
217+
204218
// Verify GmsCore is installed and whitelisted for power optimizations and background usage.
205-
mainActivityOnCreateFingerprint.method.apply {
206-
addInstructions(
207-
0,
208-
"invoke-static/range { p0 .. p0 }, Lapp/revanced/extension/shared/GmsCoreSupport;->" +
209-
"checkGmsCore(Landroid/app/Activity;)V",
210-
)
211-
}
219+
mainActivityOnCreateFingerprint.method.addInstruction(
220+
0,
221+
"invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" +
222+
"checkGmsCore(Landroid/app/Activity;)V"
223+
)
212224

213225
// Change the vendor of GmsCore in the extension.
214-
gmsCoreSupportFingerprint.classDef.methods
215-
.single { it.name == GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME }
216-
.replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"")
226+
gmsCoreSupportFingerprint.method.returnEarly(gmsCoreVendorGroupId!!)
217227

218228
executeBlock()
219229
}

0 commit comments

Comments
 (0)