More complete stub sources

This commit is contained in:
topjohnwu 2021-01-22 20:45:37 -08:00
parent 5798536559
commit 2e0f7a82fa
12 changed files with 65 additions and 25 deletions

View File

@ -20,6 +20,7 @@ object Config {
val version: String = get("version") ?: commitHash val version: String = get("version") ?: commitHash
val versionCode: Int get() = get("magisk.versionCode")!!.toInt() val versionCode: Int get() = get("magisk.versionCode")!!.toInt()
val stubVersion: String get() = get("magisk.stubVersion")!!
} }
class MagiskPlugin : Plugin<Project> { class MagiskPlugin : Plugin<Project> {

View File

@ -27,6 +27,7 @@ android.injected.testOnly=false
kapt.incremental.apt=true kapt.incremental.apt=true
# Magisk # Magisk
magisk.stubVersion=16
magisk.versionCode=21401 magisk.versionCode=21401
magisk.ndkVersion=21d magisk.ndkVersion=21d
magisk.fullNdkVersion=21.3.6528147 magisk.fullNdkVersion=21.3.6528147

View File

@ -9,7 +9,7 @@ android {
applicationId = "com.topjohnwu.magisk" applicationId = "com.topjohnwu.magisk"
versionCode = 1 versionCode = 1
versionName = Config.version versionName = Config.version
buildConfigField("int", "STUB_VERSION", "16") buildConfigField("int", "STUB_VERSION", Config.stubVersion)
buildConfigField("String", "DEV_CHANNEL", Config["DEV_CHANNEL"] ?: "null") buildConfigField("String", "DEV_CHANNEL", Config["DEV_CHANNEL"] ?: "null")
buildConfigField("boolean", "CANARY", if (canary) "true" else "false") buildConfigField("boolean", "CANARY", if (canary) "true" else "false")
} }

View File

@ -8,12 +8,12 @@
<uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" />
<application <application
android:name="a.e" android:name="a.Q"
android:appComponentFactory=".DelegateComponentFactory" android:appComponentFactory="a.z"
tools:ignore="GoogleAppIndexingWarning,MissingApplicationIcon,UnusedAttribute"> tools:ignore="GoogleAppIndexingWarning,MissingApplicationIcon,UnusedAttribute">
<!-- Splash --> <!-- Splash -->
<activity android:name="a.c"> <activity android:name="a.u7">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -25,11 +25,11 @@
</activity> </activity>
<!-- Main --> <!-- Main -->
<activity android:name="a.b" /> <activity android:name="xt.R" />
<!-- Superuser --> <!-- Superuser -->
<activity <activity
android:name="a.m" android:name="lt5.a"
android:directBootAware="true" android:directBootAware="true"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:exported="false" android:exported="false"
@ -42,7 +42,7 @@
<!-- Receiver --> <!-- Receiver -->
<receiver <receiver
android:name="a.h" android:name="a.r"
android:directBootAware="true" android:directBootAware="true"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
@ -58,16 +58,24 @@
</receiver> </receiver>
<!-- DownloadService --> <!-- DownloadService -->
<service android:name="a.j" /> <service android:name="d.s" />
<!-- FileProvider --> <!-- FileProvider -->
<provider <provider
android:name="a.p" android:name="a.ii"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
android:directBootAware="true" android:directBootAware="true"
android:exported="false" android:exported="false"
android:grantUriPermissions="true" /> android:grantUriPermissions="true" />
<!-- WorkManager -->
<service
android:name="w.d"
android:directBootAware="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<!-- Hardcode GMS version --> <!-- Hardcode GMS version -->
<meta-data <meta-data
android:name="com.google.android.gms.version" android:name="com.google.android.gms.version"

View File

@ -2,5 +2,4 @@ package a;
import com.topjohnwu.magisk.DelegateApplication; import com.topjohnwu.magisk.DelegateApplication;
public class e extends DelegateApplication { public class Q extends DelegateApplication {}
}

View File

@ -2,5 +2,4 @@ package a;
import com.topjohnwu.magisk.FileProvider; import com.topjohnwu.magisk.FileProvider;
public class p extends FileProvider { public class ii extends FileProvider {}
}

View File

@ -2,5 +2,4 @@ package a;
import com.topjohnwu.magisk.dummy.DummyReceiver; import com.topjohnwu.magisk.dummy.DummyReceiver;
public class h extends DummyReceiver { public class r extends DummyReceiver {}
}

View File

@ -2,5 +2,4 @@ package a;
import com.topjohnwu.magisk.DownloadActivity; import com.topjohnwu.magisk.DownloadActivity;
public class c extends DownloadActivity { public class u7 extends DownloadActivity {}
}

View File

@ -0,0 +1,5 @@
package a;
import com.topjohnwu.magisk.DelegateComponentFactory;
public class z extends DelegateComponentFactory {}

View File

@ -37,7 +37,7 @@ public class DelegateComponentFactory extends AppComponentFactory {
public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) public Activity instantiateActivity(ClassLoader cl, String className, Intent intent)
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (delegate != null) if (delegate != null)
return delegate.instantiateActivity(loader, className, intent); return delegate.instantiateActivity(loader, Mapping.get(className), intent);
return create(className, DownloadActivity::new); return create(className, DownloadActivity::new);
} }
@ -45,7 +45,7 @@ public class DelegateComponentFactory extends AppComponentFactory {
public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent)
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (delegate != null) if (delegate != null)
return delegate.instantiateReceiver(loader, className, intent); return delegate.instantiateReceiver(loader, Mapping.get(className), intent);
return create(className, DummyReceiver::new); return create(className, DummyReceiver::new);
} }
@ -53,7 +53,7 @@ public class DelegateComponentFactory extends AppComponentFactory {
public Service instantiateService(ClassLoader cl, String className, Intent intent) public Service instantiateService(ClassLoader cl, String className, Intent intent)
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (delegate != null) if (delegate != null)
return delegate.instantiateService(loader, className, intent); return delegate.instantiateService(loader, Mapping.get(className), intent);
return create(className, DummyService::new); return create(className, DummyService::new);
} }
@ -62,7 +62,7 @@ public class DelegateComponentFactory extends AppComponentFactory {
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (loader == null) loader = cl; if (loader == null) loader = cl;
if (delegate != null) if (delegate != null)
return delegate.instantiateProvider(loader, className); return delegate.instantiateProvider(loader, Mapping.get(className));
return create(className, DummyProvider::new); return create(className, DummyProvider::new);
} }
@ -76,4 +76,5 @@ public class DelegateComponentFactory extends AppComponentFactory {
return factory.create(); return factory.create();
} }
} }
} }

View File

@ -11,10 +11,8 @@ import com.topjohnwu.magisk.utils.DynamicClassLoader;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.HashMap;
public class InjectAPK { public class InjectAPK {
@ -70,8 +68,7 @@ public class InjectAPK {
private static DynAPK.Data dynData() { private static DynAPK.Data dynData() {
DynAPK.Data data = new DynAPK.Data(); DynAPK.Data data = new DynAPK.Data();
data.version = BuildConfig.STUB_VERSION; data.version = BuildConfig.STUB_VERSION;
// Public source code does not do component name obfuscation data.classToComponent = Mapping.inverseMap;
data.classToComponent = new HashMap<>();
return data; return data;
} }

View File

@ -0,0 +1,31 @@
package com.topjohnwu.magisk;
import java.util.HashMap;
import java.util.Map;
public class Mapping {
private static Map<String, String> map = new HashMap<>();
public static Map<String, String> inverseMap;
static {
map.put("a.Qzw", "a.e");
map.put("a.u7", "a.c");
map.put("a.ii", "a.p");
map.put("a.r", "a.h");
map.put("xt.R", "a.b");
map.put("lt5.a", "a.m");
map.put("d.s", "a.j");
map.put("w.d", "androidx.work.impl.background.systemjob.SystemJobService");
inverseMap = new HashMap<>(map.size());
for (Map.Entry<String, String> e : map.entrySet()) {
inverseMap.put(e.getValue(), e.getKey());
}
}
public static String get(String name) {
String n = map.get(name);
return n != null ? n : name;
}
}