diff --git a/app/src/main/java/a/e.java b/app/src/main/java/a/e.java index da51b8f55..56396b034 100644 --- a/app/src/main/java/a/e.java +++ b/app/src/main/java/a/e.java @@ -2,6 +2,14 @@ package a; import com.topjohnwu.magisk.App; +import java.util.Map; + public class e extends App { - /* stub */ + public e() { + super(); + } + + public e(Map map) { + super(map); + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/App.kt b/app/src/main/java/com/topjohnwu/magisk/App.kt index 3a3f6961c..8c448a784 100644 --- a/app/src/main/java/com/topjohnwu/magisk/App.kt +++ b/app/src/main/java/com/topjohnwu/magisk/App.kt @@ -23,7 +23,12 @@ import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin import timber.log.Timber -open class App : Application() { +open class App() : Application() { + + constructor(map: Map) : this() { + isRunningAsStub = true + ClassMap.componentMap = map + } init { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) diff --git a/app/src/main/java/com/topjohnwu/magisk/ClassMap.kt b/app/src/main/java/com/topjohnwu/magisk/ClassMap.kt index adf76b4b6..79217a2d2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ClassMap.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ClassMap.kt @@ -1,5 +1,8 @@ package com.topjohnwu.magisk +import android.content.ComponentName +import android.content.Context +import android.content.Intent import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.receiver.GeneralReceiver import com.topjohnwu.magisk.model.update.UpdateCheckService @@ -9,7 +12,8 @@ import com.topjohnwu.magisk.ui.flash.FlashActivity import com.topjohnwu.magisk.ui.surequest.SuRequestActivity object ClassMap { - private val map = mapOf( + + private val classMap = mapOf( App::class.java to a.e::class.java, MainActivity::class.java to a.b::class.java, SplashActivity::class.java to a.c::class.java, @@ -20,7 +24,21 @@ object ClassMap { SuRequestActivity::class.java to a.m::class.java ) - operator fun >get(c: Class<*>): T { - return map.getOrElse(c) { throw IllegalArgumentException() } as T - } + // This will be set if running as guest app + var componentMap: Map? = null + + operator fun get(c: Class<*>) = classMap.getOrElse(c) { throw IllegalArgumentException() } +} + +fun Class<*>.cmp(pkg: String = BuildConfig.APPLICATION_ID): ComponentName { + val name = ClassMap[this].name + return ComponentName(pkg, ClassMap.componentMap?.get(name) ?: name) +} + +fun Context.intent(c: Class<*>): Intent { + val cls = ClassMap[c] + return ClassMap.componentMap?.let { + val className = it.getOrElse(cls.name) { cls.name } + Intent().setComponent(ComponentName(this, className)) + } ?: Intent(this, cls) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt index 4fbf8c456..ae39a7fb9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt @@ -7,11 +7,11 @@ import android.content.Intent import android.os.Build import android.webkit.MimeTypeMap import androidx.core.app.NotificationCompat -import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.R import com.topjohnwu.magisk.extensions.chooser import com.topjohnwu.magisk.extensions.exists import com.topjohnwu.magisk.extensions.provide +import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.model.entity.internal.Configuration.* import com.topjohnwu.magisk.model.entity.internal.Configuration.Flash.Secondary import com.topjohnwu.magisk.model.entity.internal.DownloadSubject @@ -140,8 +140,7 @@ open class DownloadService : RemoteFileService() { inline operator fun invoke(context: Context, argBuilder: Builder.() -> Unit) { val app = context.applicationContext val builder = Builder().apply(argBuilder) - val intent = Intent(app, ClassMap[DownloadService::class.java]) - .putExtra(ARG_URL, builder.subject) + val intent = app.intent(DownloadService::class.java).putExtra(ARG_URL, builder.subject) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { app.startForegroundService(intent) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/ManagerUpgrade.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/ManagerUpgrade.kt index 278edafb0..bc8e85dff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/ManagerUpgrade.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/ManagerUpgrade.kt @@ -1,10 +1,9 @@ package com.topjohnwu.magisk.model.download -import android.content.ComponentName import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.cmp import com.topjohnwu.magisk.extensions.DynamicClassLoader import com.topjohnwu.magisk.model.entity.internal.Configuration.APK.Restore import com.topjohnwu.magisk.model.entity.internal.Configuration.APK.Upgrade @@ -52,9 +51,7 @@ private fun RemoteFileService.restore(apk: File, id: Int) { // Make it world readable apk.setReadable(true, false) if (Shell.su("pm install $apk").exec().isSuccess) { - val component = ComponentName(BuildConfig.APPLICATION_ID, - ClassMap.get>(SplashActivity::class.java).name) - Utils.rmAndLaunch(packageName, component) + Utils.rmAndLaunch(packageName, SplashActivity::class.java.cmp()) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt b/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt index 587712370..f9c591304 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.model.receiver import android.content.ContextWrapper import android.content.Intent -import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.Info @@ -10,6 +9,7 @@ import com.topjohnwu.magisk.base.BaseReceiver import com.topjohnwu.magisk.data.database.PolicyDao import com.topjohnwu.magisk.data.database.base.su import com.topjohnwu.magisk.extensions.reboot +import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.internal.Configuration @@ -51,7 +51,7 @@ open class GeneralReceiver : BaseReceiver() { } when (action) { REQUEST -> { - val i = Intent(context, ClassMap[SuRequestActivity::class.java]) + val i = context.intent(SuRequestActivity::class.java) .setAction(action) .putExtra("socket", intent.getStringExtra("socket")) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index 848192ca6..24ec6658f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -7,11 +7,8 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import com.ncapdevi.fragnav.FragNavController import com.ncapdevi.fragnav.FragNavTransactionOptions -import com.topjohnwu.magisk.ClassMap -import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.* import com.topjohnwu.magisk.Const.Key.OPEN_SECTION -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.base.BaseFragment import com.topjohnwu.magisk.databinding.ActivityMainBinding @@ -61,7 +58,7 @@ open class MainActivity : BaseActivity(), Na override fun onCreate(savedInstanceState: Bundle?) { if (!SplashActivity.DONE) { - startActivity(Intent(this, ClassMap[SplashActivity::class.java])) + startActivity(intent(SplashActivity::class.java)) finish() } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt index 728720b1b..6a43ddb73 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.ui import android.app.Activity import android.content.Context -import android.content.Intent import android.os.Bundle import android.text.TextUtils import androidx.appcompat.app.AlertDialog @@ -62,7 +61,7 @@ open class SplashActivity : Activity() { // Setup shortcuts Shortcuts.setup(this) - val intent = Intent(this, ClassMap[MainActivity::class.java]) + val intent = intent(MainActivity::class.java) intent.putExtra(Const.Key.OPEN_SECTION, getIntent().getStringExtra(Const.Key.OPEN_SECTION)) DONE = true startActivity(intent) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt index 143db2a3e..cade5a5f1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt @@ -6,12 +6,12 @@ import android.net.Uri import android.os.Bundle import androidx.core.app.NotificationManagerCompat import androidx.core.net.toUri -import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.databinding.ActivityFlashBinding import com.topjohnwu.magisk.extensions.snackbar +import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.model.events.BackPressEvent import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.SnackbarEvent @@ -60,7 +60,7 @@ open class FlashActivity : BaseActivity() companion object { - private fun intent(context: Context) = Intent(context, ClassMap[FlashActivity::class.java]) + private fun intent(context: Context) = context.intent(FlashActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) private fun intent(context: Context, file: File) = intent(context).setData(file.toUri()) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt index fa57d6605..c06d4b487 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseFragment import com.topjohnwu.magisk.databinding.FragmentModulesBinding import com.topjohnwu.magisk.extensions.reboot +import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.model.events.OpenFilePickerEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.ui.flash.FlashActivity @@ -28,7 +29,7 @@ class ModulesFragment : BaseFragment() override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) { // Get the URI of the selected file - val intent = Intent(activity, ClassMap[FlashActivity::class.java]) + val intent = activity.intent(FlashActivity::class.java) intent.setData(data.data).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP) startActivity(intent) } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt b/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt index 1ed022ead..f70dc291f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.utils -import android.content.ComponentName import android.content.Context import android.widget.Toast import com.topjohnwu.magisk.* @@ -102,8 +101,7 @@ object PatchAPK { Config.suManager = pkg Config.export() - Utils.rmAndLaunch(BuildConfig.APPLICATION_ID, - ComponentName(pkg, ClassMap.get>(SplashActivity::class.java).name)) + Utils.rmAndLaunch(BuildConfig.APPLICATION_ID, SplashActivity::class.java.cmp(pkg)) return true } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt index 4e873aa8a..48ca4d3c1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt @@ -46,7 +46,7 @@ object Utils { .setRequiresDeviceIdle(true) .build() val request = PeriodicWorkRequest - .Builder(ClassMap[UpdateCheckService::class.java], 12, TimeUnit.HOURS) + .Builder(ClassMap[UpdateCheckService::class.java] as Class, 12, TimeUnit.HOURS) .setConstraints(constraints) .build() WorkManager.getInstance(context).enqueueUniquePeriodicWork( diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt b/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt index 38770a8d8..cb036d544 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt @@ -4,15 +4,11 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.Context -import android.content.Intent import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.TaskStackBuilder -import com.topjohnwu.magisk.ClassMap -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.* import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.model.receiver.GeneralReceiver import com.topjohnwu.magisk.ui.SplashActivity @@ -34,10 +30,10 @@ object Notifications { } fun magiskUpdate(context: Context) { - val intent = Intent(context, ClassMap[SplashActivity::class.java]) - intent.putExtra(Const.Key.OPEN_SECTION, "magisk") + val intent = context.intent(SplashActivity::class.java) + .putExtra(Const.Key.OPEN_SECTION, "magisk") val stackBuilder = TaskStackBuilder.create(context) - stackBuilder.addParentStack(ClassMap.get>(SplashActivity::class.java)) + stackBuilder.addParentStack(SplashActivity::class.java.cmp(context.packageName)) stackBuilder.addNextIntent(intent) val pendingIntent = stackBuilder.getPendingIntent(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, PendingIntent.FLAG_UPDATE_CURRENT) @@ -54,9 +50,9 @@ object Notifications { } fun managerUpdate(context: Context) { - val intent = Intent(context, ClassMap[GeneralReceiver::class.java]) - intent.action = Const.Key.BROADCAST_MANAGER_UPDATE - intent.putExtra(Const.Key.INTENT_SET_APP, Info.remote.app) + val intent = context.intent(GeneralReceiver::class.java) + .setAction(Const.Key.BROADCAST_MANAGER_UPDATE) + .putExtra(Const.Key.INTENT_SET_APP, Info.remote.app) val pendingIntent = PendingIntent.getBroadcast(context, Const.ID.APK_UPDATE_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) @@ -73,7 +69,7 @@ object Notifications { } fun dtboPatched(context: Context) { - val intent = Intent(context, ClassMap[GeneralReceiver::class.java]) + val intent = context.intent(GeneralReceiver::class.java) .setAction(Const.Key.BROADCAST_REBOOT) val pendingIntent = PendingIntent.getBroadcast(context, Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt b/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt index a97720bb8..2b9c13d2f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt @@ -25,10 +25,11 @@ object Shortcuts { private fun getShortCuts(context: Context): List { val shortCuts = mutableListOf() val root = Shell.rootAccess() + val intent = context.intent(SplashActivity::class.java) if (Utils.showSuperUser()) { shortCuts.add(ShortcutInfo.Builder(context, "superuser") .setShortLabel(context.getString(R.string.superuser)) - .setIntent(Intent(context, ClassMap[SplashActivity::class.java]) + .setIntent(Intent(intent) .putExtra(Const.Key.OPEN_SECTION, "superuser") .setAction(Intent.ACTION_VIEW) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)) @@ -39,7 +40,7 @@ object Shortcuts { if (root && Config.magiskHide) { shortCuts.add(ShortcutInfo.Builder(context, "magiskhide") .setShortLabel(context.getString(R.string.magiskhide)) - .setIntent(Intent(context, ClassMap[SplashActivity::class.java]) + .setIntent(Intent(intent) .putExtra(Const.Key.OPEN_SECTION, "magiskhide") .setAction(Intent.ACTION_VIEW) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)) @@ -50,7 +51,7 @@ object Shortcuts { if (!Config.coreOnly && root && Info.magiskVersionCode >= 0) { shortCuts.add(ShortcutInfo.Builder(context, "modules") .setShortLabel(context.getString(R.string.modules)) - .setIntent(Intent(context, ClassMap[SplashActivity::class.java]) + .setIntent(Intent(intent) .putExtra(Const.Key.OPEN_SECTION, "modules") .setAction(Intent.ACTION_VIEW) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)) @@ -59,7 +60,7 @@ object Shortcuts { .build()) shortCuts.add(ShortcutInfo.Builder(context, "downloads") .setShortLabel(context.getString(R.string.downloads)) - .setIntent(Intent(context, ClassMap[SplashActivity::class.java]) + .setIntent(Intent(intent) .putExtra(Const.Key.OPEN_SECTION, "downloads") .setAction(Intent.ACTION_VIEW) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)) diff --git a/stub/src/main/AndroidManifest.xml b/stub/src/main/AndroidManifest.xml index ec810354d..e29f2888d 100644 --- a/stub/src/main/AndroidManifest.xml +++ b/stub/src/main/AndroidManifest.xml @@ -16,8 +16,8 @@ @@ -25,7 +25,7 @@ @@ -37,23 +37,23 @@ @@ -68,7 +68,7 @@ map = new HashMap<>(6); + + // This mapping will be sent into the guest app + static Map inverseMap; + + static { + map.put(a.z.class.getName(), "a.c"); + map.put("a.x", "a.f"); + map.put("a.o", "a.b"); + map.put("a.g", "a.m"); + map.put(a.w.class.getName(), "a.h"); + map.put("a.v", "a.j"); + map.put("a.s", "androidx.work.impl.WorkManagerInitializer"); + + inverseMap = new HashMap<>(map.size()); + for (Map.Entry e : map.entrySet()) { + inverseMap.put(e.getValue(), e.getKey()); + } + } + + static String get(String name) { + String n = map.get(name); + return n != null ? n : name; + } + +} diff --git a/stub/src/main/java/com/topjohnwu/magisk/DelegateApplication.java b/stub/src/main/java/com/topjohnwu/magisk/DelegateApplication.java index e56d66ae8..83ef6879c 100644 --- a/stub/src/main/java/com/topjohnwu/magisk/DelegateApplication.java +++ b/stub/src/main/java/com/topjohnwu/magisk/DelegateApplication.java @@ -13,6 +13,7 @@ import com.topjohnwu.magisk.utils.DynamicClassLoader; import java.io.File; import java.lang.reflect.Method; +import java.util.Map; import static com.topjohnwu.magisk.DownloadActivity.TAG; @@ -44,7 +45,8 @@ public class DelegateApplication extends Application { Object df = cl.loadClass("a.a").newInstance(); // Create the delegate Application - delegate = (Application) cl.loadClass("a.e").newInstance(); + delegate = (Application) cl.loadClass("a.e").getConstructor(Map.class) + .newInstance(ComponentMap.inverseMap); // Call attachBaseContext without ContextImpl to show it is being wrapped Method m = ContextWrapper.class.getDeclaredMethod("attachBaseContext", Context.class); diff --git a/stub/src/main/java/com/topjohnwu/magisk/DelegateComponentFactory.java b/stub/src/main/java/com/topjohnwu/magisk/DelegateComponentFactory.java index 4a60ee911..f7f7e7a08 100644 --- a/stub/src/main/java/com/topjohnwu/magisk/DelegateComponentFactory.java +++ b/stub/src/main/java/com/topjohnwu/magisk/DelegateComponentFactory.java @@ -8,12 +8,15 @@ import android.app.Service; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.content.Intent; +import android.util.Log; import com.topjohnwu.magisk.dummy.DummyActivity; import com.topjohnwu.magisk.dummy.DummyProvider; import com.topjohnwu.magisk.dummy.DummyReceiver; import com.topjohnwu.magisk.dummy.DummyService; +import static com.topjohnwu.magisk.DownloadActivity.TAG; + @SuppressLint("NewApi") public class DelegateComponentFactory extends AppComponentFactory { @@ -22,39 +25,45 @@ public class DelegateComponentFactory extends AppComponentFactory { @Override public Application instantiateApplication(ClassLoader cl, String className) { - loader = cl; + if (loader == null) loader = cl; + Log.d(TAG, className); return new DelegateApplication(this); } @Override public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + Log.d(TAG, className); if (delegate != null) - return delegate.instantiateActivity(loader, className, intent); + return delegate.instantiateActivity(loader, ComponentMap.get(className), intent); return create(className, DummyActivity.class); } @Override public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + Log.d(TAG, className); if (delegate != null) - return delegate.instantiateReceiver(loader, className, intent); + return delegate.instantiateReceiver(loader, ComponentMap.get(className), intent); return create(className, DummyReceiver.class); } @Override public Service instantiateService(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + Log.d(TAG, className); if (delegate != null) - return delegate.instantiateService(loader, className, intent); + return delegate.instantiateService(loader, ComponentMap.get(className), intent); return create(className, DummyService.class); } @Override public ContentProvider instantiateProvider(ClassLoader cl, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + Log.d(TAG, className); + if (loader == null) loader = cl; if (delegate != null) - return delegate.instantiateProvider(loader, className); + return delegate.instantiateProvider(loader, ComponentMap.get(className)); return create(className, DummyProvider.class); } @@ -63,6 +72,7 @@ public class DelegateComponentFactory extends AppComponentFactory { */ private T create(String name, Class dummy) throws InstantiationException, IllegalAccessException { + Log.d(TAG, "create " + name); try { return (T) loader.loadClass(name).newInstance(); } catch (IllegalAccessException | InstantiationException | ClassNotFoundException ignored) {