From 604f1eab5b12ff5859d1c89138afc966ec02bc31 Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Wed, 29 Jul 2020 18:09:11 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E5=85=88=E6=8A=8A=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=8D=A1=E8=B5=B7=E6=9D=A5=E8=B7=91=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=BF=99=E5=87=A0=E4=B8=AA=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/Test/ApiTest/build.gradle | 1 + .../src/main/{java => aidl}/com/example/ApiTest/Binder1.aidl | 0 .../src/main/{java => aidl}/com/example/ApiTest/Binder2.aidl | 0 project/settings.gradle | 2 +- 4 files changed, 2 insertions(+), 1 deletion(-) rename project/Test/ApiTest/src/main/{java => aidl}/com/example/ApiTest/Binder1.aidl (100%) rename project/Test/ApiTest/src/main/{java => aidl}/com/example/ApiTest/Binder2.aidl (100%) diff --git a/project/Test/ApiTest/build.gradle b/project/Test/ApiTest/build.gradle index 107ff80a..996a2347 100644 --- a/project/Test/ApiTest/build.gradle +++ b/project/Test/ApiTest/build.gradle @@ -12,6 +12,7 @@ android { buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { + minSdkVersion 14 ndk { moduleName 'Test' stl 'stlport_static' diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/Binder1.aidl b/project/Test/ApiTest/src/main/aidl/com/example/ApiTest/Binder1.aidl similarity index 100% rename from project/Test/ApiTest/src/main/java/com/example/ApiTest/Binder1.aidl rename to project/Test/ApiTest/src/main/aidl/com/example/ApiTest/Binder1.aidl diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/Binder2.aidl b/project/Test/ApiTest/src/main/aidl/com/example/ApiTest/Binder2.aidl similarity index 100% rename from project/Test/ApiTest/src/main/java/com/example/ApiTest/Binder2.aidl rename to project/Test/ApiTest/src/main/aidl/com/example/ApiTest/Binder2.aidl diff --git a/project/settings.gradle b/project/settings.gradle index 9ceecac9..62dbe591 100644 --- a/project/settings.gradle +++ b/project/settings.gradle @@ -1,4 +1,4 @@ include ':Libraries:DroidPlugin' include ':TestPlugin' -//include ':Test:ApiTest' +include ':Test:ApiTest' rootProject.name = 'DroidPlugin' \ No newline at end of file From e3332d36d930e8e218a5d9650d8ad0693c5e344b Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Thu, 30 Jul 2020 16:22:23 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/Libraries/DroidPlugin/src/main/AndroidManifest.xml | 1 + .../com/morgoo/droidplugin/hook/handle/PluginCallback.java | 4 ++-- project/TestPlugin/src/main/AndroidManifest.xml | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml index b20527b3..a94c84ac 100644 --- a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml +++ b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml @@ -171,6 +171,7 @@ + diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java index 17f5243a..b59187b3 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java @@ -365,7 +365,7 @@ private boolean handleLaunchActivity(Message msg) { ActivityInfo targetActivityInfo = PluginManager.getInstance().getActivityInfo(targetComponentName, 0); if (targetActivityInfo != null) { - if (targetComponentName != null && targetComponentName.getClassName().startsWith("")) { + if (targetComponentName != null && targetComponentName.getClassName().startsWith(".")) { targetIntent.setClassName(targetComponentName.getPackageName(), targetComponentName.getPackageName() + targetComponentName.getClassName()); } @@ -446,7 +446,7 @@ private boolean isShortcutProxyActivity(Intent targetIntent) { ResolveInfo info = pm.resolveActivity(targetIntent, 0); if (info != null) { String name = info.activityInfo.name; - if (name != null && name.startsWith("")) { + if (name != null && name.startsWith(".")) { name = info.activityInfo.packageName + info.activityInfo.name; } return ShortcutProxyActivity.class.getName().equals(name); diff --git a/project/TestPlugin/src/main/AndroidManifest.xml b/project/TestPlugin/src/main/AndroidManifest.xml index 938f4336..521870bb 100644 --- a/project/TestPlugin/src/main/AndroidManifest.xml +++ b/project/TestPlugin/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ android:name="com.morgoo.droidplugin.PluginApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" + android:largeHeap="true" android:theme="@style/AppTheme"> Date: Thu, 30 Jul 2020 16:23:22 +0800 Subject: [PATCH 03/22] //https://github.com/DroidPluginTeam/DroidPlugin/issues/446 --- .../core/PluginProcessManager.java | 73 +++++++++++++------ 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java index 6056a498..f93e5609 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.core; @@ -37,6 +37,7 @@ import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; +import android.os.Build; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Handler; @@ -169,6 +170,29 @@ public static ClassLoader getPluginClassLoader(String pkg) throws IllegalAccessE } + public static void removeSettingsProvider() { + if (Build.VERSION.SDK_INT >= 28) { + try { + Object object = ActivityThreadCompat.currentActivityThread(); + Object mProviderMapObj = FieldUtils.readField(object, "mProviderMap"); + MethodUtils.invokeMethod(mProviderMapObj, "clear"); + Object mProviderRefCountMap = FieldUtils.readField(object, "mProviderRefCountMap"); + MethodUtils.invokeMethod(mProviderRefCountMap, "clear"); + + Object sProviderHolder = FieldUtils.readStaticField(Class.forName("android.provider.Settings$Global"), "sProviderHolder"); + FieldUtils.writeField(sProviderHolder, "mContentProvider", null); + sProviderHolder = FieldUtils.readStaticField(Class.forName("android.provider.Settings$System"), "sProviderHolder"); + FieldUtils.writeField(sProviderHolder, "mContentProvider", null); + sProviderHolder = FieldUtils.readStaticField(Class.forName("android.provider.Settings$Secure"), "sProviderHolder"); + FieldUtils.writeField(sProviderHolder, "mContentProvider", null); + + } catch (Exception e) { + Log.e("Android28Helper", "removeSettingsProvider", e); + } + } + + } + public static void preLoadApk(Context hostContext, ComponentInfo pluginInfo) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, PackageManager.NameNotFoundException, ClassNotFoundException { if (pluginInfo == null && hostContext == null) { return; @@ -177,6 +201,9 @@ public static void preLoadApk(Context hostContext, ComponentInfo pluginInfo) thr return; } + //https://github.com/DroidPluginTeam/DroidPlugin/issues/446 + removeSettingsProvider(); + /*添加插件的LoadedApk对象到ActivityThread.mPackages*/ boolean found = false; @@ -194,7 +221,7 @@ public static void preLoadApk(Context hostContext, ComponentInfo pluginInfo) thr } sPluginLoadedApkCache.put(pluginInfo.packageName, loadedApk); - /*添加ClassLoader LoadedApk.mClassLoader*/ + /*添加ClassLoader LoadedApk.mClassLoader*/ String optimizedDirectory = PluginDirHelper.getPluginDalvikCacheDir(hostContext, pluginInfo.packageName); String libraryPath = PluginDirHelper.getPluginNativeLibraryDir(hostContext, pluginInfo.packageName); @@ -209,7 +236,7 @@ public static void preLoadApk(Context hostContext, ComponentInfo pluginInfo) thr classloader = new PluginClassLoader(apk, optimizedDirectory, libraryPath, hostContext.getClassLoader().getParent()); } catch (Exception e) { } - if(classloader==null){ + if (classloader == null) { PluginDirHelper.cleanOptimizedDirectory(optimizedDirectory); classloader = new PluginClassLoader(apk, optimizedDirectory, libraryPath, hostContext.getClassLoader().getParent()); } @@ -365,7 +392,7 @@ private static Context getBaseContext(Context c) { sSkipService.add("tv_input"); sSkipService.add("jobscheduler"); sSkipService.add("sensorhub"); - + //NSDManager init初始化anr的问题 sSkipService.add("servicediscovery"); // sSkipService.add("usagestats"); From 92f93413745dc0450d8c6a30ed46e8288b8fdc69 Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Thu, 30 Jul 2020 18:12:38 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E8=BF=98=E6=B2=A1=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=A5=BD9.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../morgoo/droidplugin/hook/HookFactory.java | 56 +++++++------ .../hook/handle/PluginCallback.java | 82 +++++++++++++------ .../hook/handle/PluginInstrumentation.java | 78 +++++++++++++----- .../pm/parser/PackageParserApi21.java | 7 ++ 4 files changed, 155 insertions(+), 68 deletions(-) diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java index 138a3ceb..f3f54c83 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.hook; @@ -54,6 +54,7 @@ import com.morgoo.droidplugin.hook.proxy.InstrumentationHook; import com.morgoo.droidplugin.hook.proxy.LibCoreHook; import com.morgoo.droidplugin.hook.proxy.PluginCallbackHook; +import com.morgoo.droidplugin.hook.proxy.WebViewFactoryProviderHook; import com.morgoo.droidplugin.hook.xhook.SQLiteDatabaseHook; import com.morgoo.helper.Log; import com.morgoo.helper.utils.ProcessUtils; @@ -132,16 +133,20 @@ public final void installHook(Context context, ClassLoader classLoader) throws T installHook(new ISearchManagerBinderHook(context), classLoader); //for INotificationManager installHook(new INotificationManagerBinderHook(context), classLoader); - installHook(new IMountServiceBinderHook(context), classLoader); + if (VERSION.SDK_INT < VERSION_CODES.P) { + //先让这个不要抛出异常先 + installHook(new IMountServiceBinderHook(context), classLoader); + } installHook(new IAudioServiceBinderHook(context), classLoader); installHook(new IContentServiceBinderHook(context), classLoader); installHook(new IWindowManagerBinderHook(context), classLoader); if (VERSION.SDK_INT > VERSION_CODES.LOLLIPOP_MR1) { installHook(new IGraphicsStatsBinderHook(context), classLoader); } -// if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { -// installHook(new WebViewFactoryProviderHook(context), classLoader); -// } + if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { + //这个干吗关闭?? + installHook(new WebViewFactoryProviderHook(context), classLoader); + } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { installHook(new IMediaRouterServiceBinderHook(context), classLoader); } @@ -186,10 +191,11 @@ public final void installHook(Context context, ClassLoader classLoader) throws T if (VERSION.SDK_INT >= VERSION_CODES.M) { installHook(new IAppOpsServiceBinderHook(context), classLoader); } + //优先hook这个InstrumentationHook + installHook(new InstrumentationHook(context), classLoader); installHook(new IActivityManagerHook(context), classLoader); installHook(new IPackageManagerHook(context), classLoader); installHook(new PluginCallbackHook(context), classLoader); - installHook(new InstrumentationHook(context), classLoader); installHook(new LibCoreHook(context), classLoader); installHook(new SQLiteDatabaseHook(context), classLoader); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java index b59187b3..49e68ed9 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.hook.handle; @@ -41,6 +41,8 @@ import com.morgoo.droidplugin.stub.ShortcutProxyActivity; import com.morgoo.helper.Log; +import java.util.List; + public class PluginCallback implements Handler.Callback { @@ -241,9 +243,12 @@ public boolean handleMessage(Message msg) { } } - if (msg.what == LAUNCH_ACTIVITY) { + Log.i(TAG, "handleMessage msg.what:%d", msg.what); + + if (msg.what == LAUNCH_ACTIVITY || msg.what == 159/*for API 28*/) { return handleLaunchActivity(msg); - } /*else if (msg.what == INSTALL_PROVIDER) { + } + /*else if (msg.what == INSTALL_PROVIDER) { return handleInstallProvider(msg); } else if (msg.what == CREATE_BACKUP_AGENT) { //TODO 处理CREATE_BACKUP_AGENT @@ -349,10 +354,39 @@ public boolean handleMessage(Message msg) { // return false; // } + + private void handleActivity(Message msg) { + // 这里简单起见,直接取出TargetActivity; + try { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + return; + } + Object obj = msg.obj; + + + } catch (Exception e) { + e.printStackTrace(); + } + } + private boolean handleLaunchActivity(Message msg) { try { Object obj = msg.obj; - Intent stubIntent = (Intent) FieldUtils.readField(obj, "intent"); + Intent stubIntent = null; + //https://www.cnblogs.com/Jax/p/9521305.html + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + List mActivityCallbacks = (List) FieldUtils.readField(obj, "mActivityCallbacks"); + if (mActivityCallbacks.size() > 0) { + String className = "android.app.servertransaction.LaunchActivityItem"; + if (mActivityCallbacks.get(0).getClass().getCanonicalName().equals(className)) { + Object object = mActivityCallbacks.get(0); + stubIntent = (Intent) FieldUtils.readField(object, "mIntent"); + } + } + } + if (stubIntent == null) { + stubIntent = (Intent) FieldUtils.readField(obj, "intent"); + } //ActivityInfo activityInfo = (ActivityInfo) FieldUtils.readField(obj, "activityInfo", true); stubIntent.setExtrasClassLoader(mHostContext.getClassLoader()); Intent targetIntent = stubIntent.getParcelableExtra(Env.EXTRA_TARGET_INTENT); @@ -406,6 +440,8 @@ private boolean handleLaunchActivity(Message msg) { } } + handleActivity(msg); + if (!success) { Intent newTargetIntent = new Intent(); newTargetIntent.setComponent(targetIntent.getComponent()); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java index 2d82b602..2c6ae774 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.hook.handle; @@ -36,6 +36,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.os.IBinder; import android.os.RemoteException; import android.text.TextUtils; @@ -47,9 +48,11 @@ import com.morgoo.droidplugin.hook.proxy.IPackageManagerHook; import com.morgoo.droidplugin.pm.PluginManager; import com.morgoo.droidplugin.reflect.FieldUtils; +import com.morgoo.droidplugin.reflect.MethodUtils; import com.morgoo.helper.Log; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; /** * Created by Andy Zhang(zhangyong232@gmail.com) on 2014/12/5. @@ -318,5 +321,40 @@ public void callActivityOnNewIntent(Activity activity, Intent intent) { } } + //https://www.cnblogs.com/Jax/p/9521305.html + + /** + * if (mThread == null) { + * Log.e(TAG, "Uninitialized ActivityThread, likely app-created Instrumentation," + * + " disabling AppComponentFactory", new Throwable()); + * return AppComponentFactory.DEFAULT; + * } + * + * @param intent + * @return + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException + */ + public ActivityResult execStartActivity( + Context who, IBinder contextThread, IBinder token, Activity target, + Intent intent, int requestCode, Bundle options) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + + Log.d(TAG, "execStartActivity!"); + + return (ActivityResult) MethodUtils.invokeMethod(mTarget, "execStartActivity", + who, + contextThread, + token, + target, + intent, + requestCode, + options); + } + + public Activity newActivity(ClassLoader cl, String className, + Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { + return mTarget.newActivity(cl, className, intent); + } } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java index 6d4d0ce8..2bbda61b 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java @@ -111,6 +111,13 @@ public void parsePackage(File file, int flags) throws Exception { @Override public void collectCertificates(int flags) throws Exception { // public void collectCertificates(Package pkg, int flags) throws PackageParserException + if (VERSION.SDK_INT >= Build.VERSION_CODES.P) { + //http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/content/pm/PackageParser.java + Method method = MethodUtils.getAccessibleMethod(sPackageParserClass, "collectCertificates", + mPackage.getClass(), boolean.class); + method.invoke(mPackageParser, mPackage, flags == 1); + return; + } Method method = MethodUtils.getAccessibleMethod(sPackageParserClass, "collectCertificates", mPackage.getClass(), int.class); method.invoke(mPackageParser, mPackage, flags); From 45a79916ea0602ac4bea23abf9ef79a5501ab56f Mon Sep 17 00:00:00 2001 From: ziqi mo <709847739@qq.com> Date: Thu, 30 Jul 2020 22:32:21 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E9=80=82=E9=85=8D9.0=E6=89=93=E5=BC=80ac?= =?UTF-8?q?tivity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../morgoo/droidplugin/hook/HookFactory.java | 2 +- .../hook/handle/PluginCallback.java | 97 +++++++++++++++---- .../hook/handle/PluginInstrumentation.java | 37 ------- 3 files changed, 77 insertions(+), 59 deletions(-) diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java index f3f54c83..9cffe0ce 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java @@ -145,7 +145,7 @@ public final void installHook(Context context, ClassLoader classLoader) throws T } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { //这个干吗关闭?? - installHook(new WebViewFactoryProviderHook(context), classLoader); + //installHook(new WebViewFactoryProviderHook(context), classLoader); } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { installHook(new IMediaRouterServiceBinderHook(context), classLoader); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java index 49e68ed9..6fa2e9b5 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java @@ -41,6 +41,7 @@ import com.morgoo.droidplugin.stub.ShortcutProxyActivity; import com.morgoo.helper.Log; +import java.lang.reflect.Field; import java.util.List; @@ -245,7 +246,7 @@ public boolean handleMessage(Message msg) { Log.i(TAG, "handleMessage msg.what:%d", msg.what); - if (msg.what == LAUNCH_ACTIVITY || msg.what == 159/*for API 28*/) { + if (msg.what == LAUNCH_ACTIVITY || msg.what == 159/* >28 */) { return handleLaunchActivity(msg); } /*else if (msg.what == INSTALL_PROVIDER) { @@ -355,37 +356,76 @@ public boolean handleMessage(Message msg) { // } - private void handleActivity(Message msg) { + private boolean handleActivity(Message msg) { // 这里简单起见,直接取出TargetActivity; try { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - return; + Object mClientTransaction = msg.obj; + //https://blog.csdn.net/wby371427/article/details/103447375 + //https://www.cnblogs.com/Jax/p/9521305.html + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + //获取mClientTransaction中的List mActivityCallbacks + Field mactivityCallbacks = mClientTransaction.getClass().getDeclaredField("mActivityCallbacks"); + mactivityCallbacks.setAccessible(true); + List mActivityCallbacks = (List) mactivityCallbacks.get(mClientTransaction); + if (mActivityCallbacks.size() == 0) { + return false; + } + Class mLaunchActivityItemClass = Class.forName("android.app.servertransaction.LaunchActivityItem"); + Object mLaunchActivityItem = mActivityCallbacks.get(0); + //拿到LaunchActivityItem中的Intent + Field mIntentField = mLaunchActivityItemClass.getDeclaredField("mIntent"); + mIntentField.setAccessible(true); + Intent stubIntent = (Intent) mIntentField.get(mLaunchActivityItem); + + Intent targetIntent = stubIntent.getParcelableExtra(Env.EXTRA_TARGET_INTENT); + if (targetIntent != null) { + mIntentField.setAccessible(true); + mIntentField.set(mLaunchActivityItem, targetIntent); + } } - Object obj = msg.obj; - - } catch (Exception e) { e.printStackTrace(); } + if (mCallback != null) { + return mCallback.handleMessage(msg); + } else { + return false; + } } private boolean handleLaunchActivity(Message msg) { try { Object obj = msg.obj; Intent stubIntent = null; - //https://www.cnblogs.com/Jax/p/9521305.html + Object mLaunchActivityItemP = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - List mActivityCallbacks = (List) FieldUtils.readField(obj, "mActivityCallbacks"); - if (mActivityCallbacks.size() > 0) { - String className = "android.app.servertransaction.LaunchActivityItem"; - if (mActivityCallbacks.get(0).getClass().getCanonicalName().equals(className)) { - Object object = mActivityCallbacks.get(0); - stubIntent = (Intent) FieldUtils.readField(object, "mIntent"); - } + Object mClientTransaction = msg.obj; + Log.i(TAG, "mClientTransaction>>>" + mClientTransaction.getClass()); + //获取mClientTransaction中的List mActivityCallbacks + Field mactivityCallbacks = mClientTransaction.getClass().getDeclaredField("mActivityCallbacks"); + Log.i(TAG, "mactivityCallbacks>>>" + mactivityCallbacks.getClass()); + mactivityCallbacks.setAccessible(true); + List mActivityCallbacks = (List) mactivityCallbacks.get(mClientTransaction); + if (mActivityCallbacks == null || mActivityCallbacks.size() == 0) { + return false; } + Class mLaunchActivityItemClass = Class.forName("android.app.servertransaction.LaunchActivityItem"); + mLaunchActivityItemP = mActivityCallbacks.get(0); + Log.i(TAG, "mLaunchActivityItemP>>>" + mLaunchActivityItemP.getClass()); + //拿到LaunchActivityItem中的Intent + Field mIntentField = mLaunchActivityItemClass.getDeclaredField("mIntent"); + mIntentField.setAccessible(true); + stubIntent = (Intent) mIntentField.get(mLaunchActivityItemP); + Log.i(TAG, "stubIntent>>>" + stubIntent.getClass() + "," + stubIntent.toString()); +// Intent targetIntent = stubIntent.getParcelableExtra(Env.EXTRA_TARGET_INTENT); +// if (targetIntent != null) { +// mIntentField.setAccessible(true); +// mIntentField.set(mLaunchActivityItemP, targetIntent); +// } } if (stubIntent == null) { stubIntent = (Intent) FieldUtils.readField(obj, "intent"); + Log.i(TAG, "stubIntent null>>>" + stubIntent.getClass() + "," + stubIntent.toString()); } //ActivityInfo activityInfo = (ActivityInfo) FieldUtils.readField(obj, "activityInfo", true); stubIntent.setExtrasClassLoader(mHostContext.getClassLoader()); @@ -394,6 +434,9 @@ private boolean handleLaunchActivity(Message msg) { // 也会带上一个EXTRA_TARGET_INTENT的数据,就会导致这里误以为是启动插件Activity,所以这里要先做一个判断。 // 之前ShortcutProxyActivity错误复用了key,但是为了兼容,所以这里就先这么判断吧。 if (targetIntent != null && !isShortcutProxyActivity(stubIntent)) { + + Log.i(TAG, "targetIntent >>>" + targetIntent.getClass() + "," + targetIntent.toString()); + IPackageManagerHook.fixContextPackageManager(mHostContext); ComponentName targetComponentName = targetIntent.resolveActivity(mHostContext.getPackageManager()); ActivityInfo targetActivityInfo = PluginManager.getInstance().getActivityInfo(targetComponentName, 0); @@ -440,8 +483,6 @@ private boolean handleLaunchActivity(Message msg) { } } - handleActivity(msg); - if (!success) { Intent newTargetIntent = new Intent(); newTargetIntent.setComponent(targetIntent.getComponent()); @@ -449,12 +490,26 @@ private boolean handleLaunchActivity(Message msg) { if (stubActivityInfo != null) { newTargetIntent.putExtra(Env.EXTRA_STUB_INFO, stubActivityInfo); } - FieldUtils.writeDeclaredField(msg.obj, "intent", newTargetIntent); + //FieldUtils.writeDeclaredField(msg.obj, "intent", newTargetIntent); + if (mLaunchActivityItemP != null) { + FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mIntent", newTargetIntent); + } else { + FieldUtils.writeDeclaredField(msg.obj, "intent", newTargetIntent); + } } else { - FieldUtils.writeDeclaredField(msg.obj, "intent", targetIntent); + //FieldUtils.writeDeclaredField(msg.obj, "intent", targetIntent); + if (mLaunchActivityItemP != null) { + FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mIntent", targetIntent); + } else { + FieldUtils.writeDeclaredField(msg.obj, "intent", targetIntent); + } + } + //FieldUtils.writeDeclaredField(msg.obj, "activityInfo", targetActivityInfo); + if (mLaunchActivityItemP != null) { + FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mInfo", targetActivityInfo); + } else { + FieldUtils.writeDeclaredField(msg.obj, "activityInfo", targetActivityInfo); } - FieldUtils.writeDeclaredField(msg.obj, "activityInfo", targetActivityInfo); - Log.i(TAG, "handleLaunchActivity OK"); } else { Log.e(TAG, "handleLaunchActivity oldInfo==null"); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java index 2c6ae774..4e9972a1 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginInstrumentation.java @@ -320,41 +320,4 @@ public void callActivityOnNewIntent(Activity activity, Intent intent) { super.callActivityOnNewIntent(activity, intent); } } - - //https://www.cnblogs.com/Jax/p/9521305.html - - /** - * if (mThread == null) { - * Log.e(TAG, "Uninitialized ActivityThread, likely app-created Instrumentation," - * + " disabling AppComponentFactory", new Throwable()); - * return AppComponentFactory.DEFAULT; - * } - * - * @param intent - * @return - * @throws InstantiationException - * @throws IllegalAccessException - * @throws ClassNotFoundException - */ - public ActivityResult execStartActivity( - Context who, IBinder contextThread, IBinder token, Activity target, - Intent intent, int requestCode, Bundle options) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - - Log.d(TAG, "execStartActivity!"); - - return (ActivityResult) MethodUtils.invokeMethod(mTarget, "execStartActivity", - who, - contextThread, - token, - target, - intent, - requestCode, - options); - } - - - public Activity newActivity(ClassLoader cl, String className, - Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { - return mTarget.newActivity(cl, className, intent); - } } From 6e4508e1e2cb0a620e81c135add7cccceebc05ca Mon Sep 17 00:00:00 2001 From: ziqi mo <709847739@qq.com> Date: Thu, 30 Jul 2020 22:33:55 +0800 Subject: [PATCH 06/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 100 ++---------------------------------------------------- 1 file changed, 2 insertions(+), 98 deletions(-) diff --git a/readme.md b/readme.md index e21fea15..359ad063 100755 --- a/readme.md +++ b/readme.md @@ -10,101 +10,5 @@ It enables the host app run any third-party apk without installation, modificati ------- - - -## Problems to be solved: - - 1. Unable to send `Notification` with custom Resources,eg: - - a. Notification with custom RemoteLayout, which means `Notification`'s `contentView`,`tickerView`, - `bigContentView` and `headsUpContentView` must be null. - - b. Notification with icon customized by R.drawable.XXX. The framework will transform it to Bitmap instead. - - 2. Unable to define specified `Intent Filter` for the plugged app's `Service`、`Activity`、`BroadcastReceiver` - and `ContentProvider`. So the plugged app is invisible for the outside system and app. - - 3. Lack of `Hook` to the `Native` layer, thus apk (e.g. a majority of game apps) with `native` code cannot be loaded as plugin. - -## Features: - 1. Compatible to Android 2.3 and later versions - 2. Given its .apk file, the plugged app could be run either independently or as plugin of the host, **NO** source code needed. - 3. Unnecessary to register the plugged app's `Service`、`Activity`、`BroadcastReceiver`、`ContentProvider` in the host. - 4. The plugged app are recognized as *Installed* by the host and other plugged apps - 5. Very low level of code invasion, in deed just one line code to integrate DroidPlugin into the host app. - 6. Complete code level separation between host and plugged apps, only system level message passing method provide by Android allowed. - 7. All system API supported - 8. Resources management are also completely separated between host and plugged apps. - 9. Process management for plugged apps, idle processed of the plugged app will be timely recycled to guarantee minimum memory usage. - 10. Static broadcast of plugged app will be treated as dynamic, thus the static broadcasting will never be trigger if - the plugged app are not activated. - -## Usage: - -#### Integrate with the host apps - -It is very simple integrate Droid Plugin to your proejct: - -1. Import Droid Plugin project to your project as a lib. - -2. Include following attributes in host's `AndroidManifest.xml`: - - - - -3. Or, if you use customized `Application`,add following code in the methods `onCreate` and `attachBaseContext`: - - @Override - public void onCreate() { - super.onCreate(); - PluginHelper.getInstance().applicationOnCreate(getBaseContext()); //must be after super.onCreate() - } - - @Override - protected void attachBaseContext(Context base) { - PluginHelper.getInstance().applicationAttachBaseContext(base); - super.attachBaseContext(base); - } - -4. Modify the `authorityName` value in `Libraries\DroidPlugin\build.gradle` (suggested use your package name) - -#### Install、Uninstall or Upgrade the plugged app: - -1. **Install/Upgrade**, use this method: - - int PluginManager.getInstance().installPackage(String filepath, int flags); - - For installation, `filepath` set to path of the .apk file, and `flags` set to 0. - - For upgrade, `filepath` set to path of the .apk file, and `flags` set to `PackageManagerCompat.INSTALL_REPLACE_EXISTING`. - - -2. **Uninstall**, use this method: - - int PluginManager.getInstance().deletePackage(String packageName,int flags); - - `packageName` is package name of the plugged app,`flags = 0`。 - -3. **Activate** - - Just use android's API, same for communication between components. - -## FAQ - - [FAQ](https://github.com/DroidPluginTeam/DroidPlugin/wiki/FAQ "FAQ") - -## Remark: - -Please feel free to [report bugs](https://github.com/Qihoo360/DroidPlugin/issues) or ask for help via email. -QQ Group:318901026 - -##Who is using Droid Plugin? - - [360 App Store](http://sj.360.cn "360 App Store") - - -### Thanks: - - Translated by Ming Song(gnosoir@hotmail.com) +2020-7-30 +解决9.0启动activity From fc351d457931c781ad5bc5b5b4caaf78f730ef6b Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Fri, 31 Jul 2020 11:14:34 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BAcmake=E6=9D=A5?= =?UTF-8?q?=E7=BC=96=E8=AF=91=EF=BC=8C=E8=BF=98=E6=B2=A1=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=A5=BD=EF=BC=8C=E6=99=9A=E7=82=B9=E5=86=8D=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/Libraries/DroidPlugin/build.gradle | 2 +- .../Libraries/DroidPlugin/project.properties | 2 +- project/Test/ApiTest/CMakeLists.txt | 40 +++++++++++++++++++ project/Test/ApiTest/build.gradle | 29 ++++++++++---- project/Test/ApiTest/project.properties | 2 +- project/Test/ApiTest/src/main/cpp/Core.cpp | 5 +++ .../com/morgoo/nativec/NativeCHelper.java | 4 +- project/TestPlugin/build.gradle | 2 +- project/TestPlugin/project.properties | 2 +- project/build.gradle | 2 +- 10 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 project/Test/ApiTest/CMakeLists.txt diff --git a/project/Libraries/DroidPlugin/build.gradle b/project/Libraries/DroidPlugin/build.gradle index 7252a4ee..e42733f7 100644 --- a/project/Libraries/DroidPlugin/build.gradle +++ b/project/Libraries/DroidPlugin/build.gradle @@ -17,7 +17,7 @@ android { // 建议改为自己的 packageName + .droidplugin_stub ,防止跟其它本插件使用者冲突 def authorityName = "com.morgoo.droidplugin_stub" - minSdkVersion 9 + minSdkVersion 19 versionCode 1 versionName '1.0' diff --git a/project/Libraries/DroidPlugin/project.properties b/project/Libraries/DroidPlugin/project.properties index 6e18427a..4ab12569 100644 --- a/project/Libraries/DroidPlugin/project.properties +++ b/project/Libraries/DroidPlugin/project.properties @@ -11,4 +11,4 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-21 +target=android-19 diff --git a/project/Test/ApiTest/CMakeLists.txt b/project/Test/ApiTest/CMakeLists.txt new file mode 100644 index 00000000..01948562 --- /dev/null +++ b/project/Test/ApiTest/CMakeLists.txt @@ -0,0 +1,40 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +file(GLOB all_source src/main/cpp/*.cpp src/main/cpp/*.c src/main/cpp/*.h) + +message(STATUS "all_source = ${all_source}") + +add_library( # Sets the name of the library. + Test1 + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + ${all_source} ) + + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log) + + +target_link_libraries( # Specifies the target library. + Test1 + + # Links the target library to the log library + # included in the NDK. + ${log-lib}) \ No newline at end of file diff --git a/project/Test/ApiTest/build.gradle b/project/Test/ApiTest/build.gradle index 996a2347..91268d5d 100644 --- a/project/Test/ApiTest/build.gradle +++ b/project/Test/ApiTest/build.gradle @@ -12,17 +12,32 @@ android { buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { - minSdkVersion 14 - ndk { - moduleName 'Test' - stl 'stlport_static' - abiFilters 'armeabi', 'armeabi-v7a', 'x86' - ldLibs 'log' - cFlags '-DMY_LOG_LEVEL=LOG_VERBOSE' + minSdkVersion 19 + + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_static"//c++_static + + arguments '-DANDROID_ARM_NEON=TRUE', '-DANDROID_TOOLCHAIN=clang' + + cFlags '-D__STDC_FORMAT_MACROS' + + cppFlags '-fexceptions', '-frtti' + } + + ndk { +// abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a','x86_64' + } } } lintOptions { abortOnError false } + + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } } diff --git a/project/Test/ApiTest/project.properties b/project/Test/ApiTest/project.properties index 3453b875..e0b2711d 100644 --- a/project/Test/ApiTest/project.properties +++ b/project/Test/ApiTest/project.properties @@ -11,6 +11,6 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-21 +target=android-19 android.library.reference.1=../DroidPlugin manifestmerger.enabled=true diff --git a/project/Test/ApiTest/src/main/cpp/Core.cpp b/project/Test/ApiTest/src/main/cpp/Core.cpp index 721e0e66..32d21609 100644 --- a/project/Test/ApiTest/src/main/cpp/Core.cpp +++ b/project/Test/ApiTest/src/main/cpp/Core.cpp @@ -10,6 +10,11 @@ #define NATIVE_CLASS "com/morgoo/nativec/NativeCHelper" +//extern "C" +//JNIEXPORT jint JNICALL +//Java_com_morgoo_nativec_NativeCHelper_nativePing(JNIEnv* env){ +//} + int registerNativeMethodsAndSetup(JNIEnv* env) { jclass nativeClass = env->FindClass(NATIVE_CLASS); if (clearJniExpcetion(env, TAG) || !nativeClass) { diff --git a/project/Test/ApiTest/src/main/java/com/morgoo/nativec/NativeCHelper.java b/project/Test/ApiTest/src/main/java/com/morgoo/nativec/NativeCHelper.java index 4a5184b2..d94150cb 100644 --- a/project/Test/ApiTest/src/main/java/com/morgoo/nativec/NativeCHelper.java +++ b/project/Test/ApiTest/src/main/java/com/morgoo/nativec/NativeCHelper.java @@ -13,7 +13,7 @@ public class NativeCHelper { private static Throwable sThrowable; static { - tryLoadLibraryByName("Test"); + tryLoadLibraryByName("Test1"); } public static void tryLoadLibraryByName(String name) { @@ -41,7 +41,7 @@ public static boolean isSoLoaded() { } // ************************ Helper Start *******************************// - private final native static int nativePing(); + public native static int nativePing(); public final static int ping() { if (sSoLoaded) { diff --git a/project/TestPlugin/build.gradle b/project/TestPlugin/build.gradle index 02408408..ce97a3f5 100644 --- a/project/TestPlugin/build.gradle +++ b/project/TestPlugin/build.gradle @@ -30,7 +30,7 @@ android { } defaultConfig { - minSdkVersion 21 + minSdkVersion 19 versionCode 1 versionName '1.0' } diff --git a/project/TestPlugin/project.properties b/project/TestPlugin/project.properties index 3453b875..e0b2711d 100644 --- a/project/TestPlugin/project.properties +++ b/project/TestPlugin/project.properties @@ -11,6 +11,6 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-21 +target=android-19 android.library.reference.1=../DroidPlugin manifestmerger.enabled=true diff --git a/project/build.gradle b/project/build.gradle index 0db3f45f..1dabc6c2 100644 --- a/project/build.gradle +++ b/project/build.gradle @@ -5,7 +5,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:3.6.4' } } From adabf75a500ec5df8d6722aad25e25ce4dd6820c Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Fri, 31 Jul 2020 14:06:32 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E9=80=82=E9=85=8D=E5=A5=BD9.0=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E9=99=A4=E4=BA=86=E4=B8=80=E4=B8=AAbindservi?= =?UTF-8?q?ce=E5=BC=82=E5=B8=B8=EF=BC=8C=E5=90=8E=E9=9D=A2=E6=9C=89?= =?UTF-8?q?=E7=A9=BA=E5=9C=A8=E7=9C=8B=EF=BC=8C=E7=9C=8B=E7=9C=8B=E6=80=8E?= =?UTF-8?q?=E4=B9=88=E9=80=82=E9=85=8D10.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidplugin/core/PluginClassLoader.java | 83 ++++++++++--------- .../morgoo/droidplugin/hook/HookFactory.java | 2 +- .../WebViewFactoryProviderHookHandle.java | 54 +++++++----- .../compat/ContentProviderHolderCompat.java | 47 ++++++----- project/Test/ApiTest/build.gradle | 40 ++++----- .../com/example/ApiTest/ServiceTest1.java | 4 +- .../example/ApiTest/WebViewTestActivity.java | 2 +- 7 files changed, 125 insertions(+), 107 deletions(-) diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginClassLoader.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginClassLoader.java index 6c6de6d8..00f121cf 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginClassLoader.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginClassLoader.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.core; @@ -48,29 +48,30 @@ public PluginClassLoader(String apkfile, String optimizedDirectory, String libra @Override protected Class loadClass(String className, boolean resolve) throws ClassNotFoundException { - - if (Build.MANUFACTURER != null && sPreLoader.contains(Build.MANUFACTURER.toUpperCase())) { - try { - /** - * FUCK QIKU! - * 这里适配奇酷手机青春版。 - * 因为奇酷手机自己加载了自己修改过的的Support V4库,在插件中也用了这个库的时候,ClassLoader会优先加载奇酷手机自带的Support V4库。 - * 原因在于,奇酷手机没有预加载插件中打的Support V4库。详情可以研究super.loadClass(className, resolve)标准实现 - * 但是这可能会导致类不兼容,出现java.lang.IncompatibleClassChangeError。因为插件编译时使用的插件的Support V4,而奇酷手机则使 - * 用的是它修改过的Support V4。 - * - * SO,在Class Loader加载某个Class的时候,我们优先从自己的ClassLoader中加载Class,如果找不到,再从Parent Class Loader中去加载。 - * 这样修改后,Class的加载顺序就跟系统的不一样了。 - * - */ - Class clazz = findClass(className); - if (clazz != null) { - return clazz; - } - } catch (ClassNotFoundException e) { - Log.e("PluginClassLoader", "UCK QIKU:error", e); + //不判断设备类型,优先加载自己的dex类 +// if (Build.MANUFACTURER != null && sPreLoader.contains(Build.MANUFACTURER.toUpperCase())) { + try { + /** + * FUCK QIKU! + * 这里适配奇酷手机青春版。 + * 因为奇酷手机自己加载了自己修改过的的Support V4库,在插件中也用了这个库的时候,ClassLoader会优先加载奇酷手机自带的Support V4库。 + * 原因在于,奇酷手机没有预加载插件中打的Support V4库。详情可以研究super.loadClass(className, resolve)标准实现 + * 但是这可能会导致类不兼容,出现java.lang.IncompatibleClassChangeError。因为插件编译时使用的插件的Support V4,而奇酷手机则使 + * 用的是它修改过的Support V4。 + * + * SO,在Class Loader加载某个Class的时候,我们优先从自己的ClassLoader中加载Class,如果找不到,再从Parent Class Loader中去加载。 + * 这样修改后,Class的加载顺序就跟系统的不一样了。 + * + */ + Class clazz = findClass(className); + if (clazz != null) { + return clazz; } + } catch (ClassNotFoundException e) { + //不打印 +// Log.i("PluginClassLoader", "UCK QIKU:error", e); } +// } return super.loadClass(className, resolve); } } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java index 9cffe0ce..f3f54c83 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java @@ -145,7 +145,7 @@ public final void installHook(Context context, ClassLoader classLoader) throws T } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { //这个干吗关闭?? - //installHook(new WebViewFactoryProviderHook(context), classLoader); + installHook(new WebViewFactoryProviderHook(context), classLoader); } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { installHook(new IMediaRouterServiceBinderHook(context), classLoader); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/WebViewFactoryProviderHookHandle.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/WebViewFactoryProviderHookHandle.java index d744978d..4c8a691f 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/WebViewFactoryProviderHookHandle.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/WebViewFactoryProviderHookHandle.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.hook.handle; import android.content.Context; @@ -55,6 +55,8 @@ protected void init() { private static Class sContentMain; + private static Class sContextUtils; + private static void fixWebViewAsset(Context context) { try { if (sContentMain == null) { @@ -62,6 +64,12 @@ private static void fixWebViewAsset(Context context) { if (provider != null) { ClassLoader cl = provider.getClass().getClassLoader(); + try { + sContextUtils = Class.forName("org.chromium.base.ContextUtils", true, cl); + } catch (ClassNotFoundException e) { + Log.e(TAG, "fixWebViewAsset sContextUtils", e); + } + try { sContentMain = Class.forName("org.chromium.content.app.ContentMain", true, cl); } catch (ClassNotFoundException e) { @@ -75,13 +83,17 @@ private static void fixWebViewAsset(Context context) { } if (sContentMain == null) { - throw new ClassNotFoundException(String.format("Can not found class %s or %s in classloader %s", "org.chromium.content.app.ContentMain", "com.android.org.chromium.content.app.ContentMain", cl)); + //throw new ClassNotFoundException(String.format("Can not found class %s or %s in classloader %s", "org.chromium.content.app.ContentMain", "com.android.org.chromium.content.app.ContentMain", cl)); } } } if (sContentMain != null) { MethodUtils.invokeStaticMethod(sContentMain, "initApplicationContext", context.getApplicationContext()); } + + if (sContextUtils != null) { + MethodUtils.invokeStaticMethod(sContextUtils, "initApplicationContext", context.getApplicationContext()); + } } catch (Exception e) { Log.e(TAG, "fixWebViewAsset error", e); } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ContentProviderHolderCompat.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ContentProviderHolderCompat.java index 74b771a7..8019100b 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ContentProviderHolderCompat.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ContentProviderHolderCompat.java @@ -1,28 +1,29 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.helper.compat; import android.content.pm.ProviderInfo; +import android.os.Build; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -36,7 +37,11 @@ public class ContentProviderHolderCompat { public static Class Class() throws ClassNotFoundException { if (sClass == null) { - sClass = Class.forName("android.app.IActivityManager$ContentProviderHolder"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + sClass = Class.forName("android.app.ContentProviderHolder"); + } else { + sClass = Class.forName("android.app.IActivityManager$ContentProviderHolder"); + } } return sClass; } diff --git a/project/Test/ApiTest/build.gradle b/project/Test/ApiTest/build.gradle index 91268d5d..8e12a97c 100644 --- a/project/Test/ApiTest/build.gradle +++ b/project/Test/ApiTest/build.gradle @@ -14,30 +14,30 @@ android { defaultConfig { minSdkVersion 19 - externalNativeBuild { - cmake { - arguments "-DANDROID_STL=c++_static"//c++_static - - arguments '-DANDROID_ARM_NEON=TRUE', '-DANDROID_TOOLCHAIN=clang' - - cFlags '-D__STDC_FORMAT_MACROS' - - cppFlags '-fexceptions', '-frtti' - } - - ndk { -// abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a','x86_64' - } - } +// externalNativeBuild { +// cmake { +// arguments "-DANDROID_STL=c++_static"//c++_static +// +// arguments '-DANDROID_ARM_NEON=TRUE', '-DANDROID_TOOLCHAIN=clang' +// +// cFlags '-D__STDC_FORMAT_MACROS' +// +// cppFlags '-fexceptions', '-frtti' +// } +// +// ndk { +//// abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a','x86_64' +// } +// } } lintOptions { abortOnError false } - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } - } +// externalNativeBuild { +// cmake { +// path "CMakeLists.txt" +// } +// } } diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/ServiceTest1.java b/project/Test/ApiTest/src/main/java/com/example/ApiTest/ServiceTest1.java index 516f8459..5076e719 100644 --- a/project/Test/ApiTest/src/main/java/com/example/ApiTest/ServiceTest1.java +++ b/project/Test/ApiTest/src/main/java/com/example/ApiTest/ServiceTest1.java @@ -49,7 +49,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { Binder1 binder1 = Binder1.Stub.asInterface(service); msg = String.format("onServiceConnected,binder1=%s,pind(2016)=%s,pingStr(Is Andy Zhang handsome?)=%s", binder1, binder1.ping(2016), binder1.pingStr("Is Andy Zhang handsome?")); Log.e(TAG, msg); - } catch (RemoteException e) { + } catch (Exception e) { Log.e(TAG, "", e); } } @@ -73,7 +73,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { Binder2 binder1 = Binder2.Stub.asInterface(service); msg = String.format("onServiceConnected,Binder2=%s,pind(2016)=%s,pingStr(Is Andy Zhang handsome?)=%s", binder1, binder1.ping(2016), binder1.pingStr("Is Andy Zhang handsome?")); Log.e(TAG, msg); - } catch (RemoteException e) { + } catch (Exception e) { Log.e(TAG, "", e); } } diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/WebViewTestActivity.java b/project/Test/ApiTest/src/main/java/com/example/ApiTest/WebViewTestActivity.java index 3e74695a..62a3df7e 100644 --- a/project/Test/ApiTest/src/main/java/com/example/ApiTest/WebViewTestActivity.java +++ b/project/Test/ApiTest/src/main/java/com/example/ApiTest/WebViewTestActivity.java @@ -21,7 +21,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { return true; } }); - mWebView.loadUrl("http://www.baidu.com"); + mWebView.loadUrl("https://www.baidu.com"); } From f4418270c7748df6fb19db9bcac25a6f48699fd6 Mon Sep 17 00:00:00 2001 From: zipper <709847739@qq.com> Date: Fri, 31 Jul 2020 14:16:40 +0800 Subject: [PATCH 09/22] Update readme.md --- readme.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 359ad063..589954f8 100755 --- a/readme.md +++ b/readme.md @@ -10,5 +10,19 @@ It enables the host app run any third-party apk without installation, modificati ------- -2020-7-30 +#2020-7-30 + 解决9.0启动activity + +#2020-7-31 + +基本适配好9.0 + +##遗留问题 + +1.native没测试 + +2.bindservice有异常信息待处理 + +3.有时候会提示Toolbar出问题,后面再 + From 9e07bde6125eedad141d5fc2cbf6fa32339f3941 Mon Sep 17 00:00:00 2001 From: zipper <709847739@qq.com> Date: Fri, 31 Jul 2020 14:17:00 +0800 Subject: [PATCH 10/22] Update readme.md --- readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 589954f8..e0b1e918 100755 --- a/readme.md +++ b/readme.md @@ -10,15 +10,15 @@ It enables the host app run any third-party apk without installation, modificati ------- -#2020-7-30 +# 2020-7-30 解决9.0启动activity -#2020-7-31 +# 2020-7-31 基本适配好9.0 -##遗留问题 +## 遗留问题 1.native没测试 From 3be4519a36870bc9d1bade1f250b3f1cee4da956 Mon Sep 17 00:00:00 2001 From: moziqi <709847739@qq.com> Date: Fri, 31 Jul 2020 18:07:31 +0800 Subject: [PATCH 11/22] =?UTF-8?q?=E5=BE=85=E9=80=82=E9=85=8D10.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/Libraries/DroidPlugin/build.gradle | 29 +++++++- .../DroidPlugin/src/main/AndroidManifest.xml | 66 +++++++++++++++---- .../morgoo/droidplugin/PluginApplication.java | 3 + .../hook/handle/PluginCallback.java | 6 +- .../hook/proxy/IActivityManagerHook.java | 21 ++++++ .../src/main/res/xml/file_paths.xml | 23 +++++++ project/TestPlugin/build.gradle | 3 +- .../TestPlugin/src/main/AndroidManifest.xml | 23 ++++--- 8 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 project/Libraries/DroidPlugin/src/main/res/xml/file_paths.xml diff --git a/project/Libraries/DroidPlugin/build.gradle b/project/Libraries/DroidPlugin/build.gradle index e42733f7..3f983670 100644 --- a/project/Libraries/DroidPlugin/build.gradle +++ b/project/Libraries/DroidPlugin/build.gradle @@ -3,6 +3,23 @@ apply plugin: 'com.android.library' dependencies { compileOnly fileTree(dir: 'lib', include: '*.jar') implementation fileTree(dir: 'libs', include: '*.jar') + + implementation "com.android.support:support-v4:23.1.1" + implementation "com.android.support:gridlayout-v7:23.1.1" + implementation "com.android.support:cardview-v7:23.1.1" + implementation 'com.android.support:appcompat-v7:23.1.1' + implementation 'com.android.support:design:23.1.1' + + + //10.0解决黑名单问题 + //https://zhuanlan.zhihu.com/p/59455212 + //https://github.com/tiann/FreeReflection + api 'me.weishu:free_reflection:3.0.1' + + //https://github.com/Guolei1130/android_p_no_sdkapi_support + + //http://weishu.me/2018/06/07/free-reflection-above-android-p/ + } android { @@ -13,18 +30,24 @@ android { abortOnError false } - defaultConfig{ + defaultConfig { + +// packagingOptions { +// doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" +// } // 建议改为自己的 packageName + .droidplugin_stub ,防止跟其它本插件使用者冲突 def authorityName = "com.morgoo.droidplugin_stub" - minSdkVersion 19 + minSdkVersion 21 versionCode 1 versionName '1.0' buildConfigField "String", "AUTHORITY_NAME", "\"${authorityName}\"" manifestPlaceholders = [ - authorityName:"${authorityName}", + authorityName: "${authorityName}", ] } + + } diff --git a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml index a94c84ac..bce50465 100644 --- a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml +++ b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ --> @@ -47,7 +48,9 @@ - + @@ -83,7 +86,9 @@ - + @@ -99,7 +104,9 @@ - + @@ -158,45 +165,76 @@ - - + + - - + + - - + + + - + + + + + + + + + android:authorities="${applicationId}.plugin.servicemanager" /> - - + android:theme="@android:style/Theme.Light.NoTitleBar"> + + diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/PluginApplication.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/PluginApplication.java index f1e39193..1189dd27 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/PluginApplication.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/PluginApplication.java @@ -25,6 +25,8 @@ import android.app.Application; import android.content.Context; +import me.weishu.reflection.Reflection; + /** * Created by Andy Zhang(zhangyong232@gmail.com) 2014/12/5. */ @@ -41,6 +43,7 @@ public void onCreate() { @Override protected void attachBaseContext(Context base) { + Reflection.unseal(base); PluginHelper.getInstance().applicationAttachBaseContext(base); super.attachBaseContext(base); } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java index 6fa2e9b5..53905f30 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/PluginCallback.java @@ -407,7 +407,11 @@ private boolean handleLaunchActivity(Message msg) { mactivityCallbacks.setAccessible(true); List mActivityCallbacks = (List) mactivityCallbacks.get(mClientTransaction); if (mActivityCallbacks == null || mActivityCallbacks.size() == 0) { - return false; + if (mCallback != null) { + return mCallback.handleMessage(msg); + } else { + return false; + } } Class mLaunchActivityItemClass = Class.forName("android.app.servertransaction.LaunchActivityItem"); mLaunchActivityItemP = mActivityCallbacks.get(0); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java index 803213ec..8f6f2318 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java @@ -73,6 +73,27 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl @Override public void onInstall(ClassLoader classLoader) throws Throwable { + if (Build.VERSION.SDK_INT >= 29) { + //參考 + //https://github.com/findandroidviewbyid/Hook + // https://blog.csdn.net/u014379448/article/details/106299656/ + // Q + Class clazz = Class.forName("android.app.ActivityTaskManager"); + Object singleton = FieldUtils.readStaticField(clazz, "IActivityTaskManagerSingleton"); + Object obj1 = FieldUtils.readField(singleton, "mInstance"); + //IActivityTaskManager 这个实例 + if (obj1 == null) { + SingletonCompat.get(singleton); + obj1 = FieldUtils.readField(singleton, "mInstance"); + } + setOldObj(obj1); + Class objClass = mOldObj.getClass(); + List> interfaces = Utils.getAllInterfaces(objClass); + Class[] ifs = interfaces != null && interfaces.size() > 0 ? interfaces.toArray(new Class[interfaces.size()]) : new Class[0]; + Object proxiedActivityManager = MyProxy.newProxyInstance(objClass.getClassLoader(), ifs, this); + FieldUtils.writeField(singleton, "mInstance", proxiedActivityManager); + return; + } if (Build.VERSION.SDK_INT >= 26) { // o Object singleton = FieldUtils.readStaticField(ActivityManager.class, "IActivityManagerSingleton"); diff --git a/project/Libraries/DroidPlugin/src/main/res/xml/file_paths.xml b/project/Libraries/DroidPlugin/src/main/res/xml/file_paths.xml new file mode 100644 index 00000000..7aa2e0e6 --- /dev/null +++ b/project/Libraries/DroidPlugin/src/main/res/xml/file_paths.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/project/TestPlugin/build.gradle b/project/TestPlugin/build.gradle index ce97a3f5..c48263e1 100644 --- a/project/TestPlugin/build.gradle +++ b/project/TestPlugin/build.gradle @@ -30,7 +30,8 @@ android { } defaultConfig { - minSdkVersion 19 + minSdkVersion 21 + targetSdkVersion 26 versionCode 1 versionName '1.0' } diff --git a/project/TestPlugin/src/main/AndroidManifest.xml b/project/TestPlugin/src/main/AndroidManifest.xml index 521870bb..530e4792 100644 --- a/project/TestPlugin/src/main/AndroidManifest.xml +++ b/project/TestPlugin/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + package="com.example.TestPlugin" + android:versionCode="1" + android:versionName="1.0"> + android:screenOrientation="portrait"> - - + + + android:screenOrientation="portrait"> - - + + From a5d2784bc722aa3d4cc551a7ab7b0465eb0e8dff Mon Sep 17 00:00:00 2001 From: zipper <709847739@qq.com> Date: Fri, 31 Jul 2020 21:33:27 +0800 Subject: [PATCH 12/22] Update readme.md --- readme.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index e0b1e918..35f5e862 100755 --- a/readme.md +++ b/readme.md @@ -24,5 +24,72 @@ It enables the host app run any third-party apk without installation, modificati 2.bindservice有异常信息待处理 -3.有时候会提示Toolbar出问题,后面再 +3.有时候会提示Toolbar出问题,后面再看 +``` +Process: com.example.TestPlugin:PluginP06, PID: 15779 + android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.Toolbar$SavedState + at android.os.Parcel.readParcelableCreator(Parcel.java:2839) + at android.os.Parcel.readParcelable(Parcel.java:2765) + at android.os.Parcel.readValue(Parcel.java:2668) + at android.os.Parcel.readSparseArrayInternal(Parcel.java:3118) + at android.os.Parcel.readSparseArray(Parcel.java:2351) + at android.os.Parcel.readValue(Parcel.java:2725) + at android.os.Parcel.readArrayMapInternal(Parcel.java:3037) + at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288) + at android.os.BaseBundle.unparcel(BaseBundle.java:232) + at android.os.Bundle.getSparseParcelableArray(Bundle.java:1010) + at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2133) + at android.app.Activity.onRestoreInstanceState(Activity.java:1135) + at android.app.Activity.performRestoreInstanceState(Activity.java:1090) + at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1317) + at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2991) + at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180) + at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165) + at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142) + at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) + at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) + at android.os.Handler.dispatchMessage(Handler.java:106) + at android.os.Looper.loop(Looper.java:193) + at android.app.ActivityThread.main(ActivityThread.java:6718) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) +2020-07-31 21:31:44.199 15779-15779/? E/MyCrashHandler: uncaughtExceptionandroid.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.Toolbar$SavedState + at android.os.Parcel.readParcelableCreator(Parcel.java:2839) + at android.os.Parcel.readParcelable(Parcel.java:2765) + at android.os.Parcel.readValue(Parcel.java:2668) + at android.os.Parcel.readSparseArrayInternal(Parcel.java:3118) + at android.os.Parcel.readSparseArray(Parcel.java:2351) + at android.os.Parcel.readValue(Parcel.java:2725) + at android.os.Parcel.readArrayMapInternal(Parcel.java:3037) + at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288) + at android.os.BaseBundle.unparcel(BaseBundle.java:232) + at android.os.Bundle.getSparseParcelableArray(Bundle.java:1010) + at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2133) + at android.app.Activity.onRestoreInstanceState(Activity.java:1135) + at android.app.Activity.performRestoreInstanceState(Activity.java:1090) + at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1317) + at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2991) + at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180) + at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165) + at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142) + at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) + at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) + at android.os.Handler.dispatchMessage(Handler.java:106) + at android.os.Looper.loop(Looper.java:193) + at android.app.ActivityThread.main(ActivityThread.java:6718) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) +2020-07-31 21:31:44.203 15779-15779/? E/MyCrashHandler: 记录uncaughtExceptionjava.io.FileNotFoundException: /storage/emulated/0/PluginLog/CrashLog/CrashLog_20200731213144_15779.log (Permission denied) + at java.io.FileOutputStream.open0(Native Method) + at java.io.FileOutputStream.open(FileOutputStream.java:308) + at java.io.FileOutputStream.(FileOutputStream.java:238) + at java.io.FileOutputStream.(FileOutputStream.java:180) + at java.io.PrintWriter.(PrintWriter.java:263) + at com.morgoo.droidplugin.MyCrashHandler.uncaughtException(MyCrashHandler.java:94) + at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068) + at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063) + at java.lang.Thread.dispatchUncaughtException(Thread.java:1955) +``` From 983c6393ae4b5d257a2816603108d57a40c4dd78 Mon Sep 17 00:00:00 2001 From: zipper <709847739@qq.com> Date: Fri, 31 Jul 2020 21:36:47 +0800 Subject: [PATCH 13/22] Update readme.md --- readme.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/readme.md b/readme.md index 35f5e862..6e814d30 100755 --- a/readme.md +++ b/readme.md @@ -23,6 +23,33 @@ It enables the host app run any third-party apk without installation, modificati 1.native没测试 2.bindservice有异常信息待处理 +``` + E/Service1: >>服务Service1:onCreate +2020-07-31 21:36:12.644 16124-16124/com.example.TestPlugin:PluginP06 E/Service1: >>服务Service1:onBind,intent=Intent { cmp=com.example.ApiTest/.Service1 } +2020-07-31 21:36:12.652 16124-16146/com.example.TestPlugin:PluginP06 E/JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) + java.lang.AbstractMethodError: abstract method "void android.app.IServiceConnection.connected(android.content.ComponentName, android.os.IBinder, boolean)" + at android.app.IServiceConnection$Stub.onTransact(IServiceConnection.java:61) + at android.os.Binder.execTransact(Binder.java:731) +2020-07-31 21:36:12.652 16124-16124/com.example.TestPlugin:PluginP06 I/HookedMethodHandler: doHookInner method(android.app.IActivityManager.publishService) cost 6 ms +2020-07-31 21:36:12.652 16124-16146/com.example.TestPlugin:PluginP06 E/AndroidRuntime: FATAL EXCEPTION: Binder:16124_3 + Process: com.example.TestPlugin:PluginP06, PID: 16124 + java.lang.AbstractMethodError: abstract method "void android.app.IServiceConnection.connected(android.content.ComponentName, android.os.IBinder, boolean)" + at android.app.IServiceConnection$Stub.onTransact(IServiceConnection.java:61) + at android.os.Binder.execTransact(Binder.java:731) +2020-07-31 21:36:12.653 16124-16146/com.example.TestPlugin:PluginP06 E/MyCrashHandler: uncaughtExceptionjava.lang.AbstractMethodError: abstract method "void android.app.IServiceConnection.connected(android.content.ComponentName, android.os.IBinder, boolean)" + at android.app.IServiceConnection$Stub.onTransact(IServiceConnection.java:61) + at android.os.Binder.execTransact(Binder.java:731) +2020-07-31 21:36:12.660 16124-16146/com.example.TestPlugin:PluginP06 E/MyCrashHandler: 记录uncaughtExceptionjava.io.FileNotFoundException: /storage/emulated/0/PluginLog/CrashLog/CrashLog_20200731213612_16124.log (Permission denied) + at java.io.FileOutputStream.open0(Native Method) + at java.io.FileOutputStream.open(FileOutputStream.java:308) + at java.io.FileOutputStream.(FileOutputStream.java:238) + at java.io.FileOutputStream.(FileOutputStream.java:180) + at java.io.PrintWriter.(PrintWriter.java:263) + at com.morgoo.droidplugin.MyCrashHandler.uncaughtException(MyCrashHandler.java:94) + at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068) + at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063) + at java.lang.Thread.dispatchUncaughtException(Thread.java:1955) +``` 3.有时候会提示Toolbar出问题,后面再看 ``` From 591740291e0ffd8e0244805be9fe6f89d22dfcce Mon Sep 17 00:00:00 2001 From: ziqi mo <709847739@qq.com> Date: Fri, 31 Jul 2020 23:39:15 +0800 Subject: [PATCH 14/22] =?UTF-8?q?=E6=B2=A1=E7=9C=9F=E6=9C=BA=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=E5=A5=BD=E5=83=8F=E6=9C=89=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DroidPlugin/src/main/AndroidManifest.xml | 21 ++++++-- .../am/BaseActivityManagerService.java | 4 +- .../core/PluginProcessManager.java | 2 +- .../morgoo/droidplugin/hook/HookFactory.java | 4 +- .../hook/proxy/IActivityManagerHook.java | 52 ++++++++++-------- .../morgoo/droidplugin/pm/PluginManager.java | 15 +++++- .../pm/parser/PackageParserApi21.java | 7 +++ .../java/com/moziqi/compat/OActivity.java | 54 +++++++++++++++++++ .../src/main/res/values/styles.xml | 6 +++ 9 files changed, 131 insertions(+), 34 deletions(-) create mode 100644 project/Libraries/DroidPlugin/src/main/java/com/moziqi/compat/OActivity.java diff --git a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml index bce50465..a877fbaf 100644 --- a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml +++ b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml @@ -209,11 +209,6 @@ android:name="org.apache.http.legacy" android:required="false" /> - - - + + + + + + + + + + diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/am/BaseActivityManagerService.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/am/BaseActivityManagerService.java index 5616c3eb..09049c27 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/am/BaseActivityManagerService.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/am/BaseActivityManagerService.java @@ -150,7 +150,9 @@ public void onProviderCreated(int callingPid, int callingUid, ProviderInfo stubI } public void onDestroy() { - mRemoteCallbackList.kill(); + if (mRemoteCallbackList != null) { + mRemoteCallbackList.kill(); + } mRemoteCallbackList = null; } } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java index f93e5609..d1c8c0a7 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/core/PluginProcessManager.java @@ -202,7 +202,7 @@ public static void preLoadApk(Context hostContext, ComponentInfo pluginInfo) thr } //https://github.com/DroidPluginTeam/DroidPlugin/issues/446 - removeSettingsProvider(); +// removeSettingsProvider(); /*添加插件的LoadedApk对象到ActivityThread.mPackages*/ diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java index f3f54c83..f2f2a247 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/HookFactory.java @@ -144,8 +144,8 @@ public final void installHook(Context context, ClassLoader classLoader) throws T installHook(new IGraphicsStatsBinderHook(context), classLoader); } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { - //这个干吗关闭?? - installHook(new WebViewFactoryProviderHook(context), classLoader); + //这个 基本废弃 + //installHook(new WebViewFactoryProviderHook(context), classLoader); } if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { installHook(new IMediaRouterServiceBinderHook(context), classLoader); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java index 8f6f2318..ecc8018b 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityManagerHook.java @@ -1,24 +1,24 @@ /* -** DroidPlugin Project -** -** Copyright(c) 2015 Andy Zhang -** -** This file is part of DroidPlugin. -** -** DroidPlugin is free software: you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation, either -** version 3 of the License, or (at your option) any later version. -** -** DroidPlugin is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with DroidPlugin. If not, see -** -**/ + ** DroidPlugin Project + ** + ** Copyright(c) 2015 Andy Zhang + ** + ** This file is part of DroidPlugin. + ** + ** DroidPlugin is free software: you can redistribute it and/or + ** modify it under the terms of the GNU Lesser General Public + ** License as published by the Free Software Foundation, either + ** version 3 of the License, or (at your option) any later version. + ** + ** DroidPlugin is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ** Lesser General Public License for more details. + ** + ** You should have received a copy of the GNU Lesser General Public + ** License along with DroidPlugin. If not, see + ** + **/ package com.morgoo.droidplugin.hook.proxy; @@ -73,13 +73,19 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl @Override public void onInstall(ClassLoader classLoader) throws Throwable { - if (Build.VERSION.SDK_INT >= 29) { + if (Build.VERSION.SDK_INT >= 28) { //參考 //https://github.com/findandroidviewbyid/Hook // https://blog.csdn.net/u014379448/article/details/106299656/ // Q - Class clazz = Class.forName("android.app.ActivityTaskManager"); - Object singleton = FieldUtils.readStaticField(clazz, "IActivityTaskManagerSingleton"); + Object singleton = null; + try { + Class clazz = Class.forName("android.app.ActivityTaskManager"); + singleton = FieldUtils.readStaticField(clazz, "IActivityTaskManagerSingleton"); + } catch (Exception e) { + Log.i(TAG, "ActivityTaskManager", e); + singleton = FieldUtils.readStaticField(ActivityManager.class, "IActivityManagerSingleton"); + } Object obj1 = FieldUtils.readField(singleton, "mInstance"); //IActivityTaskManager 这个实例 if (obj1 == null) { diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/PluginManager.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/PluginManager.java index acf26a25..f7bc2849 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/PluginManager.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/PluginManager.java @@ -39,6 +39,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; @@ -51,6 +52,7 @@ import com.morgoo.helper.Log; import com.morgoo.helper.compat.BundleCompat; import com.morgoo.helper.compat.ContentProviderCompat; +import com.moziqi.compat.OActivity; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -212,8 +214,17 @@ public void connectToService() { if (mPluginManager == null) { try { Intent intent = new Intent(mHostContext, PluginManagerService.class); - intent.setPackage(mHostContext.getPackageName()); - mHostContext.startService(intent); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //connectToService java.lang.IllegalStateException: Not allowed to start service Intent + Intent startIntent = new Intent(mHostContext, OActivity.class); + startIntent.setPackage(mHostContext.getPackageName()); + startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mHostContext.startActivity(startIntent); + } else { + intent.setPackage(mHostContext.getPackageName()); + mHostContext.startService(intent); + } + String auth = mHostContext.getPackageName() + ".plugin.servicemanager"; Uri uri = Uri.parse("content://" + auth); diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java index 2bbda61b..a873c3a3 100644 --- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java +++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/pm/parser/PackageParserApi21.java @@ -67,6 +67,8 @@ class PackageParserApi21 extends PackageParser { protected Class sPermissionClass; protected Class sPermissionGroupClass; protected Class sArraySetClass; + //P Q + protected Class sPackageSignatures; protected Object mPackage; protected Object mDefaultPackageUserState; @@ -88,6 +90,8 @@ private void initClasses() throws ClassNotFoundException, InstantiationException sInstrumentationClass = Class.forName("android.content.pm.PackageParser$Instrumentation"); sPermissionClass = Class.forName("android.content.pm.PackageParser$Permission"); sPermissionGroupClass = Class.forName("android.content.pm.PackageParser$PermissionGroup"); + //P Q +// sPackageSignatures = Class.forName("com.android.server.pm.PackageSignatures"); try { sArraySetClass = Class.forName("android.util.ArraySet"); } catch (ClassNotFoundException e) { @@ -301,6 +305,9 @@ public List readIntentFilterFromComponent(Object data) throws Exce @Override public void writeSignature(Signature[] signatures) throws Exception { + if (android.os.Build.VERSION.SDK_INT >= 28) { + return; + } FieldUtils.writeField(mPackage, "mSignatures", signatures); } } diff --git a/project/Libraries/DroidPlugin/src/main/java/com/moziqi/compat/OActivity.java b/project/Libraries/DroidPlugin/src/main/java/com/moziqi/compat/OActivity.java new file mode 100644 index 00000000..7582b307 --- /dev/null +++ b/project/Libraries/DroidPlugin/src/main/java/com/moziqi/compat/OActivity.java @@ -0,0 +1,54 @@ +package com.moziqi.compat; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.Gravity; +import android.view.Window; +import android.view.WindowManager; + +import com.morgoo.droidplugin.PluginManagerService; + +/** + * Copyright (C), 2018-2020 + * Author: ziqimo + * Date: 2020/7/31 10:34 PM + * Description: + * History: + *