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:
+ *
+ * 作者姓名 修改时间 版本号 描述
+ */
+public class OActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ try {
+ //设置1像素
+ Window window = getWindow();
+ window.setGravity(Gravity.LEFT | Gravity.TOP);
+ WindowManager.LayoutParams params = window.getAttributes();
+ params.x = 0;
+ params.y = 0;
+ params.height = 1;
+ params.width = 1;
+ params.gravity = Gravity.BOTTOM;
+ params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+ window.setAttributes(params);
+ //PluginManager.connectToService(PluginManager.java:216
+ Intent intent = new Intent(getApplicationContext(), PluginManagerService.class);
+ intent.setPackage(getApplicationContext().getPackageName());
+ startService(intent);
+ //大于5.0
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ //VBJSer.start(this);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ finish();
+ }
+ }
+
+}
diff --git a/project/Libraries/DroidPlugin/src/main/res/values/styles.xml b/project/Libraries/DroidPlugin/src/main/res/values/styles.xml
index ca980641..be3c6e3b 100644
--- a/project/Libraries/DroidPlugin/src/main/res/values/styles.xml
+++ b/project/Libraries/DroidPlugin/src/main/res/values/styles.xml
@@ -30,4 +30,10 @@
+
+
+
From f7e68cb893e03f32ff1957ea2e720850a6e4be91 Mon Sep 17 00:00:00 2001
From: ziqi mo <709847739@qq.com>
Date: Sat, 1 Aug 2020 15:50:58 +0800
Subject: [PATCH 15/22] =?UTF-8?q?=E9=80=82=E9=85=8D10=20=E6=AD=A3=E5=B8=B8?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../DroidPlugin/src/main/AndroidManifest.xml | 2 +
.../am/BaseActivityManagerService.java | 1 +
.../am/MyActivityManagerService.java | 1 +
.../core/PluginProcessManager.java | 24 +++++-
.../morgoo/droidplugin/hook/HookFactory.java | 6 +-
.../handle/IActivityManagerHookHandle.java | 86 ++++++++++++-------
.../hook/handle/PluginCallback.java | 30 +++++--
.../hook/handle/PluginInstrumentation.java | 30 +++++++
.../hook/proxy/IActivityManagerHook.java | 27 ------
.../hook/proxy/IActivityTaskManagerHook.java | 84 ++++++++++++++++++
.../hook/proxy/PluginCallbackHook.java | 44 +++++-----
.../helper/compat/ActivityThreadCompat.java | 54 +++++++-----
.../Test/ApiTest/src/main/AndroidManifest.xml | 1 +
.../main/java/com/example/ApiTest/App.java | 21 +++++
14 files changed, 299 insertions(+), 112 deletions(-)
create mode 100644 project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityTaskManagerHook.java
create mode 100644 project/Test/ApiTest/src/main/java/com/example/ApiTest/App.java
diff --git a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
index a877fbaf..712d4da1 100644
--- a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
+++ b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
@@ -191,6 +191,8 @@
+
+
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 09049c27..92659bc5 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
@@ -98,6 +98,7 @@ private class MyRemoteCallbackList extends RemoteCallbackList= VERSION_CODES.M) {
installHook(new IAppOpsServiceBinderHook(context), classLoader);
}
- //优先hook这个InstrumentationHook
- installHook(new InstrumentationHook(context), classLoader);
+ installHook(new IActivityTaskManagerHook(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/IActivityManagerHookHandle.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java
index 7c724571..7dac815a 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.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;
@@ -71,6 +71,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Random;
@@ -87,6 +88,8 @@ public IActivityManagerHookHandle(Context hostContext) {
@Override
protected void init() {
+ //android Q
+ sHookedMethodHandlers.put("activityTopResumedStateLost", new activityTopResumedStateLost(mHostContext));
sHookedMethodHandlers.put("startActivity", new startActivity(mHostContext));
sHookedMethodHandlers.put("startActivityAsUser", new startActivityAsUser(mHostContext));
sHookedMethodHandlers.put("startActivityAsCaller", new startActivityAsCaller(mHostContext));
@@ -151,6 +154,21 @@ protected void init() {
}
+ //android Q
+ private static class activityTopResumedStateLost extends ReplaceCallingPackageHookedMethodHandler {
+ public activityTopResumedStateLost(Context hostContext) {
+ super(hostContext);
+ }
+
+ @Override
+ protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
+ Log.i(TAG, "activityTopResumedStateLost.beforeInvoke.method:" + (method != null ? method.getName() : "null"));
+ Log.i(TAG, "activityTopResumedStateLost.beforeInvoke.args." + Arrays.toString(args));
+ return super.beforeInvoke(receiver, method, args);
+ }
+ }
+
+
private static class startActivity extends ReplaceCallingPackageHookedMethodHandler {
public startActivity(Context hostContext) {
@@ -519,6 +537,8 @@ public registerReceiver(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
+
+ Log.i(TAG, "registerReceiver--->beforeInvoke");
//API 2.3
/* public Intent registerReceiver(IApplicationThread caller,
IIntentReceiver receiver, IntentFilter filter,
@@ -533,11 +553,16 @@ protected boolean beforeInvoke(Object receiver, Method method, Object[] args) th
/* public Intent registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter,
String requiredPermission, int userId) throws RemoteException;*/
+ //Q
+ /* public Intent registerReceiver(IApplicationThread caller, String callerPackage,
+ IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
+ int flags)*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (args != null && args.length > 0) {
for (int index = 0; index < args.length; index++) {
if (args[index] instanceof String) {
String callerPackage = (String) args[index];
+ Log.i(TAG, "registerReceiver--->beforeInvoke.callerPackage:" + callerPackage);
if (isPackagePlugin(callerPackage)) {
args[index] = mHostContext.getPackageName();
}
@@ -762,9 +787,9 @@ public getServices(Context hostContext) {
@Override
protected void afterInvoke(Object receiver, Method method, Object[] args, Object invokeResult) throws Throwable {
//api 2.3,15,16,17,18
- /*public List getServices(int maxNum, int flags) throws RemoteException;*/
+ /*public List getServices(int maxNum, int flags) throws RemoteException;*/
//API 19,21
- /*public List getServices(int maxNum, int flags) throws RemoteException;*/
+ /*public List getServices(int maxNum, int flags) throws RemoteException;*/
if (invokeResult != null && invokeResult instanceof List) {
List objectList = (List) invokeResult;
for (Object obj : objectList) {
@@ -1165,7 +1190,7 @@ public peekService(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 2.3, 15, 16, 17, 18, 19, 21
- /* public IBinder peekService(Intent service, String resolvedType) throws RemoteException;*/
+ /* public IBinder peekService(Intent service, String resolvedType) throws RemoteException;*/
replaceFirstServiceIntentOfArgs(args);
return super.beforeInvoke(receiver, method, args);
}
@@ -1204,7 +1229,7 @@ public backupAgentCreated(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 2.3,15,16,17,18,19, 21
- /* public void backupAgentCreated(String packageName, IBinder agent) throws RemoteException;*/
+ /* public void backupAgentCreated(String packageName, IBinder agent) throws RemoteException;*/
final int index = 0;
if (args != null && args.length > index) {
if (args[index] != null && args[index] instanceof String) {
@@ -1227,7 +1252,7 @@ public unbindBackupAgent(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 2.3,15,16,17,18,19, 21
- /* public void unbindBackupAgent(ApplicationInfo appInfo) throws RemoteException;*/
+ /* public void unbindBackupAgent(ApplicationInfo appInfo) throws RemoteException;*/
final int index = 0;
if (args != null && args.length > index) {
if (args[index] != null && args[index] instanceof ApplicationInfo) {
@@ -1250,7 +1275,7 @@ public killApplicationProcess(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 2.3,15,16,17,18,19, 21
- /* public void killApplicationProcess(String processName, int uid) throws RemoteException;*/
+ /* public void killApplicationProcess(String processName, int uid) throws RemoteException;*/
final int index = 0;
if (args != null && args.length > index) {
@@ -1303,7 +1328,7 @@ public getActivityClassForToken(Context hostContext) {
}
//API 2.3,15,16,17,18,19, 21
- /* public ComponentName getActivityClassForToken(IBinder token) throws RemoteException;*/
+ /* public ComponentName getActivityClassForToken(IBinder token) throws RemoteException;*/
//FIXME I don't know what function of this,just hook it.
//通过token拿Activity?搞不懂,不改。
}
@@ -1612,7 +1637,7 @@ public killBackgroundProcesses(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 2.3,15,16
- /*public void killBackgroundProcesses(final String packageName) throws RemoteException;*/
+ /*public void killBackgroundProcesses(final String packageName) throws RemoteException;*/
//API 17,18,19,21
/* public void killBackgroundProcesses(final String packageName, int userId)
@@ -1665,6 +1690,7 @@ public getRunningAppProcesses(Context hostContext) {
@Override
protected void afterInvoke(Object receiver, Method method, Object[] args, Object invokeResult) throws Throwable {
+ Log.i(TAG, "getRunningAppProcesses>>>>afterInvoke");
//2.3,15,16,17,18,19,21
/* public List getRunningAppProcesses()
throws RemoteException;*/
@@ -1945,7 +1971,7 @@ public getPackageScreenCompatMode(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
- /* public int getPackageScreenCompatMode(String packageName) throws RemoteException;*/
+ /* public int getPackageScreenCompatMode(String packageName) throws RemoteException;*/
//我也不知道这个函数是干嘛的,不过既然写了,我们就改一下。
//因为如果万一插件调用了这个函数,则会传插件自己的包名,而此插件并未被安装。就这样调用原来函数传给系统,是会出问题的。所以改成宿主程序的包名。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
@@ -2001,7 +2027,7 @@ public getPackageAskScreenCompat(Context hostContext) {
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//API 15, 16, 17, 18, 19, 21
- /* public boolean getPackageAskScreenCompat(String packageName) throws RemoteException;*/
+ /* public boolean getPackageAskScreenCompat(String packageName) throws RemoteException;*/
//我也不知道这个函数是干嘛的,不过既然写了,我们就改一下。
//因为如果万一插件调用了这个函数,则会传插件自己的包名,而此插件并未被安装。就这样调用原来函数传给系统,是会出问题的。所以改成宿主程序的包名。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
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 53905f30..23666fe3 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
@@ -229,6 +229,9 @@ public boolean isEnable() {
public boolean handleMessage(Message msg) {
long b = System.currentTimeMillis();
try {
+
+ Log.i(TAG, "PluginCallback.handleMessage msg.what:%d", msg.what);
+
if (!mEnable) {
return false;
}
@@ -244,8 +247,6 @@ public boolean handleMessage(Message msg) {
}
}
- Log.i(TAG, "handleMessage msg.what:%d", msg.what);
-
if (msg.what == LAUNCH_ACTIVITY || msg.what == 159/* >28 */) {
return handleLaunchActivity(msg);
}
@@ -395,6 +396,15 @@ private boolean handleActivity(Message msg) {
private boolean handleLaunchActivity(Message msg) {
try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P + 1) {
+ //android.app.servertransaction.TopResumedActivityChangeItem
+ //不处理
+ if (mCallback != null) {
+ return mCallback.handleMessage(msg);
+ } else {
+ return false;
+ }
+ }
Object obj = msg.obj;
Intent stubIntent = null;
Object mLaunchActivityItemP = null;
@@ -416,10 +426,18 @@ private boolean handleLaunchActivity(Message msg) {
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);
+ if ("android.app.servertransaction.TopResumedActivityChangeItem".equals(mLaunchActivityItemP.getClass().getName())) {
+ //https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java;bpv=0;bpt=1
+ //android Q 改为:android.app.servertransaction.TopResumedActivityChangeItem
+ //Class mTopResumedActivityChangeItem = Class.forName("android.app.servertransaction.TopResumedActivityChangeItem");
+ throw new RuntimeException("Android Q 的 TopResumedActivityChangeItem 没有 mIntent");
+ } else {
+ //拿到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) {
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 4e9972a1..582dcdd0 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
@@ -24,6 +24,7 @@
import android.annotation.TargetApi;
import android.app.Activity;
+import android.app.AppComponentFactory;
import android.app.Application;
import android.app.Instrumentation;
import android.content.ContentResolver;
@@ -50,6 +51,7 @@
import com.morgoo.droidplugin.reflect.FieldUtils;
import com.morgoo.droidplugin.reflect.MethodUtils;
import com.morgoo.helper.Log;
+import com.morgoo.helper.compat.ActivityThreadCompat;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -320,4 +322,32 @@ public void callActivityOnNewIntent(Activity activity, Intent intent) {
super.callActivityOnNewIntent(activity, intent);
}
}
+
+ @TargetApi(Build.VERSION_CODES.P)
+ public AppComponentFactory getFactory(String pkg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+// if (pkg == null) {
+// android.util.Log.e(TAG, "No pkg specified, disabling AppComponentFactory");
+// return AppComponentFactory.DEFAULT;
+// }
+// if (mThread == null) {
+// android.util.Log.e(TAG, "Uninitialized ActivityThread, likely app-created Instrumentation,"
+// + " disabling AppComponentFactory", new Throwable());
+// return AppComponentFactory.DEFAULT;
+// }
+// LoadedApk apk = mThread.peekPackageInfo(pkg, true);
+// // This is in the case of starting up "android".
+// if (apk == null) apk = mThread.getSystemContext().mPackageInfo;
+// return apk.getAppFactory();
+
+ Log.i(TAG,"我来了吗?getFactory");
+ Object mThread = FieldUtils.readField(mTarget, "mThread", true);
+ if (mThread == null) {
+ try {
+ FieldUtils.writeField(mTarget, "mThread", ActivityThreadCompat.currentActivityThread());
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ return (AppComponentFactory) MethodUtils.invokeMethod(mTarget, "getFactory", pkg);
+ }
}
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 ecc8018b..ed0dd0e6 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,33 +73,6 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
@Override
public void onInstall(ClassLoader classLoader) throws Throwable {
- if (Build.VERSION.SDK_INT >= 28) {
- //參考
- //https://github.com/findandroidviewbyid/Hook
- // https://blog.csdn.net/u014379448/article/details/106299656/
- // Q
- 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) {
- 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/java/com/morgoo/droidplugin/hook/proxy/IActivityTaskManagerHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityTaskManagerHook.java
new file mode 100644
index 00000000..7d230ae7
--- /dev/null
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/IActivityTaskManagerHook.java
@@ -0,0 +1,84 @@
+package com.morgoo.droidplugin.hook.proxy;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.os.Build;
+
+import com.morgoo.droidplugin.hook.BaseHookHandle;
+import com.morgoo.droidplugin.hook.handle.IActivityManagerHookHandle;
+import com.morgoo.droidplugin.reflect.FieldUtils;
+import com.morgoo.droidplugin.reflect.Utils;
+import com.morgoo.helper.Log;
+import com.morgoo.helper.MyProxy;
+import com.morgoo.helper.compat.SingletonCompat;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Copyright (C), 2018-2020
+ * Author: ziqimo
+ * Date: 2020/8/1 2:54 PM
+ * Description:
+ * History:
+ *
+ * 作者姓名 修改时间 版本号 描述
+ */
+public class IActivityTaskManagerHook extends ProxyHook {
+
+
+ private static final String TAG = IActivityTaskManagerHook.class.getSimpleName();
+
+ public IActivityTaskManagerHook(Context hostContext) {
+ super(hostContext);
+ }
+
+ @Override
+ public BaseHookHandle createHookHandle() {
+ return new IActivityManagerHookHandle(mHostContext);
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ try {
+ return super.invoke(proxy, method, args);
+ } catch (SecurityException e) {
+ String msg = String.format("msg[%s],args[%s]", e.getMessage(), Arrays.toString(args));
+ SecurityException e1 = new SecurityException(msg);
+ e1.initCause(e);
+ throw e1;
+ }
+ }
+
+ @Override
+ protected void onInstall(ClassLoader classLoader) throws Throwable {
+ if (Build.VERSION.SDK_INT >= 28) {
+ //參考
+ //https://github.com/findandroidviewbyid/Hook
+ // https://blog.csdn.net/u014379448/article/details/106299656/
+ // Q
+ 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) {
+ 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;
+ }
+ }
+}
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/PluginCallbackHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/PluginCallbackHook.java
index 63bc195f..db0e0321 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/PluginCallbackHook.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/proxy/PluginCallbackHook.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;
@@ -66,7 +66,7 @@ public void setEnable(boolean enable, boolean reinstallHook) {
for (PluginCallback callback : mCallbacks) {
callback.setEnable(enable);
}
- super.setEnable(enable,reinstallHook);
+ super.setEnable(enable, reinstallHook);
}
@Override
@@ -85,7 +85,7 @@ protected void onInstall(ClassLoader classLoader) throws Throwable {
value.setEnable(isEnable());
mCallbacks.add(value);
FieldUtils.writeField(mCallbackField, handler, value);
- Log.i(TAG, "PluginCallbackHook has installed");
+ Log.i(TAG, "PluginCallbackHook has installed,old=%s,new=%s", mCallback, value);
} else {
Log.i(TAG, "PluginCallbackHook has installed,skip");
}
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ActivityThreadCompat.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ActivityThreadCompat.java
index cb2d82ce..6c70ed5f 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ActivityThreadCompat.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/helper/compat/ActivityThreadCompat.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.helper.compat;
@@ -26,7 +26,9 @@
import android.os.Handler;
import android.os.Looper;
+import com.morgoo.droidplugin.reflect.FieldUtils;
import com.morgoo.droidplugin.reflect.MethodUtils;
+import com.morgoo.helper.Log;
import java.lang.reflect.InvocationTargetException;
@@ -36,6 +38,9 @@
*/
public class ActivityThreadCompat {
+
+ private final static String TAG = ActivityThreadCompat.class.getSimpleName();
+
private static Object sActivityThread;
private static Class sClass = null;
@@ -88,6 +93,13 @@ public void run() {
public static Instrumentation getInstrumentation() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
Object obj = currentActivityThread();
- return (Instrumentation) MethodUtils.invokeMethod(obj, "getInstrumentation");
+ Instrumentation getInstrumentation = (Instrumentation) MethodUtils.invokeMethod(obj, "getInstrumentation");
+ Log.i(TAG, "getInstrumentation:" + getInstrumentation);
+ Object mThread = FieldUtils.readField(getInstrumentation, "mThread", true);
+ Log.i(TAG, "getInstrumentation.mThread:" + mThread);
+ if (mThread == null) {
+ FieldUtils.writeField(getInstrumentation, "mThread", obj);
+ }
+ return getInstrumentation;
}
}
diff --git a/project/Test/ApiTest/src/main/AndroidManifest.xml b/project/Test/ApiTest/src/main/AndroidManifest.xml
index 5a5e432d..de77d62a 100644
--- a/project/Test/ApiTest/src/main/AndroidManifest.xml
+++ b/project/Test/ApiTest/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:persistent="true"
+ android:name=".App"
android:theme="@style/AppTheme">
+ * 作者姓名 修改时间 版本号 描述
+ */
+public class App extends Application {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.i("moziqi", "App.onCreate");
+ }
+}
From 59e8c8c81f71f2fc5ec096042d88cf689962b08b Mon Sep 17 00:00:00 2001
From: moziqi <709847739@qq.com>
Date: Mon, 3 Aug 2020 09:56:24 +0800
Subject: [PATCH 16/22] =?UTF-8?q?=E8=BF=99=E9=80=BB=E8=BE=91=E5=9C=A8?=
=?UTF-8?q?=E7=9C=9F=E6=9C=BA=E4=B8=8D=E8=A1=8C=EF=BC=8C=E6=B3=A8=E9=87=8A?=
=?UTF-8?q?=E7=AE=97=E4=BA=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hook/handle/PluginCallback.java | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
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 23666fe3..502b784f 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
@@ -396,15 +396,16 @@ private boolean handleActivity(Message msg) {
private boolean handleLaunchActivity(Message msg) {
try {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P + 1) {
- //android.app.servertransaction.TopResumedActivityChangeItem
- //不处理
- if (mCallback != null) {
- return mCallback.handleMessage(msg);
- } else {
- return false;
- }
- }
+ //这逻辑在真机不行,注释算了
+// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P + 1) {
+// //android.app.servertransaction.TopResumedActivityChangeItem
+// //不处理
+// if (mCallback != null) {
+// return mCallback.handleMessage(msg);
+// } else {
+// return false;
+// }
+// }
Object obj = msg.obj;
Intent stubIntent = null;
Object mLaunchActivityItemP = null;
From d2da11978352438adf7ffe1ccb249fbba3b856ed Mon Sep 17 00:00:00 2001
From: moziqi <709847739@qq.com>
Date: Wed, 5 Aug 2020 15:47:40 +0800
Subject: [PATCH 17/22] =?UTF-8?q?=E7=A0=94=E7=A9=B6=E4=BA=86=E4=B8=8B10.0?=
=?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=90=AF=E5=8A=A8activity=E6=B2=A1=E6=9C=89?=
=?UTF-8?q?=E6=95=88=E6=9E=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hook/binder/IAppOpsServiceBinderHook.java | 50 +++++---
.../hook/binder/MyServiceManager.java | 46 ++++---
.../binder/ServiceManagerCacheBinderHook.java | 48 ++++---
.../handle/IActivityManagerHookHandle.java | 15 +++
.../hook/handle/IAppOpsServiceHookHandle.java | 120 ++++++++++++------
.../hook/handle/PluginInstrumentation.java | 28 +++-
project/Test/ApiTest/build.gradle | 3 +-
.../java/com/example/ApiTest/MyActivity.java | 9 ++
project/TestPlugin/build.gradle | 2 +-
.../com/example/TestPlugin/ApkFragment.java | 18 +++
10 files changed, 235 insertions(+), 104 deletions(-)
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/IAppOpsServiceBinderHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/IAppOpsServiceBinderHook.java
index 68be19d3..09d13ded 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/IAppOpsServiceBinderHook.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/IAppOpsServiceBinderHook.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.binder;
import android.content.Context;
@@ -26,12 +26,13 @@
import com.morgoo.droidplugin.hook.BaseHookHandle;
import com.morgoo.droidplugin.hook.handle.IAppOpsServiceHookHandle;
+import com.morgoo.droidplugin.reflect.MethodUtils;
import com.morgoo.helper.compat.IAppOpsServiceCompat;
/**
* Created by Andy Zhang(zhangyong232@gmail.com) on on 16/5/11.
*/
-public class IAppOpsServiceBinderHook extends BinderHook{
+public class IAppOpsServiceBinderHook extends BinderHook {
private static final String SERVICE_NAME = Context.APP_OPS_SERVICE;
@@ -45,6 +46,13 @@ Object getOldObj() throws Exception {
return IAppOpsServiceCompat.asInterface(iBinder);
}
+ @Override
+ protected void onInstall(ClassLoader classLoader) throws Throwable {
+ super.onInstall(classLoader);
+ //Class> aClass = Class.forName("com.android.server.wm.ActivityTaskManagerService");
+ //MethodUtils.invokeStaticMethod(aClass, "checkCallingPermission", String.class);
+ }
+
@Override
public String getServiceName() {
return SERVICE_NAME;
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/MyServiceManager.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/MyServiceManager.java
index b9056b82..67fd2460 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/MyServiceManager.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/MyServiceManager.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.binder;
@@ -44,10 +44,14 @@ public static void addOriginService(String serviceName, IBinder service) {
mOriginServiceCache.put(serviceName, service);
}
- static void addProxiedServiceCache(String serviceName, IBinder proxyService) {
+ static void addProxiedServiceCache(String serviceName, IBinder proxyService) {
mProxiedServiceCache.put(serviceName, proxyService);
}
+ static IBinder getProxiedServiceCache(String serviceName) {
+ return mProxiedServiceCache.get(serviceName);
+ }
+
static Object getProxiedObj(String servicename) {
return mProxiedObjCache.get(servicename);
}
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/ServiceManagerCacheBinderHook.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/ServiceManagerCacheBinderHook.java
index 8f0151ee..50129d51 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/ServiceManagerCacheBinderHook.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/binder/ServiceManagerCacheBinderHook.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.binder;
@@ -31,6 +31,7 @@
import com.morgoo.droidplugin.hook.HookedMethodHandler;
import com.morgoo.droidplugin.reflect.FieldUtils;
import com.morgoo.droidplugin.reflect.Utils;
+import com.morgoo.helper.Log;
import com.morgoo.helper.MyProxy;
import com.morgoo.helper.compat.ServiceManagerCompat;
@@ -48,6 +49,8 @@
public class ServiceManagerCacheBinderHook extends Hook implements InvocationHandler {
+ private final static String TAG = ServiceManagerCacheBinderHook.class.getSimpleName();
+
private String mServiceName;
public ServiceManagerCacheBinderHook(Context hostContext, String servicename) {
@@ -60,6 +63,7 @@ public ServiceManagerCacheBinderHook(Context hostContext, String servicename) {
@Override
protected void onInstall(ClassLoader classLoader) throws Throwable {
Object sCacheObj = FieldUtils.readStaticField(ServiceManagerCompat.Class(), "sCache");
+ //Log.i(TAG, "sCacheObj class is " + sCacheObj.getClass());
if (sCacheObj instanceof Map) {
Map sCache = (Map) sCacheObj;
Object Obj = sCache.get(mServiceName);
@@ -68,6 +72,7 @@ protected void onInstall(ClassLoader classLoader) throws Throwable {
//但是这样有缺陷。
throw new RuntimeException("Can not install binder hook for " + mServiceName);
} else {
+ Log.i(TAG, "mServiceName is " + mServiceName);
sCache.remove(mServiceName);
IBinder mServiceIBinder = ServiceManagerCompat.getService(mServiceName);
if (mServiceIBinder == null) {
@@ -76,6 +81,7 @@ protected void onInstall(ClassLoader classLoader) throws Throwable {
}
}
if (mServiceIBinder != null) {
+ //Log.i(TAG, "mServiceIBinder is " + mServiceIBinder.getClass());
MyServiceManager.addOriginService(mServiceName, mServiceIBinder);
Class clazz = mServiceIBinder.getClass();
List> interfaces = Utils.getAllInterfaces(clazz);
@@ -97,7 +103,9 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
return method.invoke(originService, args);
}
HookedMethodHandler hookedMethodHandler = mHookHandles.getHookedMethodHandler(method);
+ Log.i(TAG, "hookedMethodHandler is " + hookedMethodHandler);
if (hookedMethodHandler != null) {
+ Log.i(TAG, "hookedMethodHandler doHookInner method is " + method.getName());
return hookedMethodHandler.doHookInner(originService, method, args);
} else {
return method.invoke(originService, args);
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java
index 7dac815a..ca692f45 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IActivityManagerHookHandle.java
@@ -48,6 +48,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.text.TextUtils;
import com.morgoo.droidplugin.PluginManagerService;
@@ -220,6 +221,20 @@ protected boolean doReplaceIntentForStartActivityAPIHigh(Object[] args) throws R
args[intentOfArgIndex] = newIntent;
args[1] = mHostContext.getPackageName();
+
+ if (args[args.length - 1] != null) {
+ Class> aClass = args[args.length - 1].getClass();
+ Log.i(TAG, "last agrs class is " + aClass);
+ if (args[args.length - 1] instanceof Integer) {
+ try {
+ UserHandle owner = (UserHandle) FieldUtils.readStaticField(UserHandle.class, "OWNER");
+ args[args.length - 1] = MethodUtils.invokeMethod(owner, "getCallingUserId");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
} else {
Log.w(TAG, "startActivity,replace selectProxyActivity fail");
}
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IAppOpsServiceHookHandle.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IAppOpsServiceHookHandle.java
index 8f0baec6..47236096 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IAppOpsServiceHookHandle.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/hook/handle/IAppOpsServiceHookHandle.java
@@ -1,32 +1,38 @@
/*
-** 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.app.AppOpsManager;
import android.content.Context;
+import android.util.Log;
import com.morgoo.droidplugin.hook.BaseHookHandle;
import com.morgoo.droidplugin.hook.HookedMethodHandler;
+//import com.morgoo.helper.Log;
import com.morgoo.helper.compat.IAppOpsServiceCompat;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
/**
* Created by Andy Zhang(zhangyong232@gmail.com) on on 16/5/11.
*/
@@ -59,25 +65,25 @@ protected void init() {
// void setUserRestrictions(in Bundle restrictions, int userHandle);
// void removeUser(int userHandle);
// }
- sHookedMethodHandlers.put("checkOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("noteOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("startOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("finishOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("startWatchingMode",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("stopWatchingMode",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("getToken",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("permissionToOpCode",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("noteProxyOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("checkPackage",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("getPackagesForOps",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("getOpsForPackage",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("setUidMode",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("setMode",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("resetAllModes",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("checkAudioOperation",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("setAudioRestriction",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("setUserRestrictions",new MyBaseHandler(mHostContext));
- sHookedMethodHandlers.put("removeUser",new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("checkOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("noteOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("startOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("finishOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("startWatchingMode", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("stopWatchingMode", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("getToken", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("permissionToOpCode", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("noteProxyOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("checkPackage", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("getPackagesForOps", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("getOpsForPackage", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("setUidMode", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("setMode", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("resetAllModes", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("checkAudioOperation", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("setAudioRestriction", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("setUserRestrictions", new MyBaseHandler(mHostContext));
+ sHookedMethodHandlers.put("removeUser", new MyBaseHandler(mHostContext));
addAllMethodFromHookedClass();
}
@@ -95,5 +101,41 @@ private static class MyBaseHandler extends ReplaceCallingPackageHookedMethodHand
public MyBaseHandler(Context context) {
super(context);
}
+
+ @Override
+ protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
+ // final int mode = getAppOpsService().noteOperation(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ // callingUid, callingPackage);
+ /**
+ * ActivityStarter.java
+ *
+ * //shouldAbortBackgroundActivityStart 方法里面的
+ *
+ * // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission
+ * if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) {
+ * Slog.w(TAG, "Background activity start for " + callingPackage
+ * + " allowed because SYSTEM_ALERT_WINDOW permission is granted.");
+ * return false;
+ * }
+ *
+ * //ActivityTaskManagerService.java
+ * boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) {
+ * final int mode = getAppOpsService().noteOperation(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ * callingUid, callingPackage);
+ * if (mode == AppOpsManager.MODE_DEFAULT) {
+ * return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid)
+ * == PERMISSION_GRANTED;
+ * }
+ * return mode == AppOpsManager.MODE_ALLOWED;
+ * }
+ */
+ Log.i("MyBaseHandler", "method:" + method.getName());
+ if ("noteOperation".equals(method.getName())) {
+ Log.i("MyBaseHandler", "args:" + Arrays.toString(args));
+ //认为有悬浮权限
+ setFakedResult(AppOpsManager.MODE_ALLOWED);
+ }
+ return super.beforeInvoke(receiver, method, args);
+ }
}
}
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 582dcdd0..688a7cbd 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
@@ -39,6 +39,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.text.TextUtils;
import com.morgoo.droidplugin.am.RunningActivities;
@@ -339,7 +340,7 @@ public AppComponentFactory getFactory(String pkg) throws NoSuchMethodException,
// if (apk == null) apk = mThread.getSystemContext().mPackageInfo;
// return apk.getAppFactory();
- Log.i(TAG,"我来了吗?getFactory");
+ Log.i(TAG, "我来了吗?getFactory");
Object mThread = FieldUtils.readField(mTarget, "mThread", true);
if (mThread == null) {
try {
@@ -350,4 +351,29 @@ public AppComponentFactory getFactory(String pkg) throws NoSuchMethodException,
}
return (AppComponentFactory) MethodUtils.invokeMethod(mTarget, "getFactory", pkg);
}
+
+ /**
+ * public ActivityResult execStartActivity(
+ * Context who, IBinder contextThread, IBinder token, Activity target,
+ * Intent intent, int requestCode, Bundle options) {
+ * 10.0 系统没办法指定 UserHandle user 所有这里拦截也没反应
+ * @param who
+ * @param contextThread
+ * @param token
+ * @param resultWho
+ * @param intent
+ * @param requestCode
+ * @param options
+ * @param user
+ * @return
+ * @throws NoSuchMethodException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+// public ActivityResult execStartActivity(
+// Context who, IBinder contextThread, IBinder token, String resultWho,
+// Intent intent, int requestCode, Bundle options, UserHandle user) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+// Log.i(TAG, "我来了吗?execStartActivity");
+// return (ActivityResult) MethodUtils.invokeMethod(mTarget, "execStartActivity", who, contextThread, token, resultWho, intent, requestCode, options, user);
+// }
}
diff --git a/project/Test/ApiTest/build.gradle b/project/Test/ApiTest/build.gradle
index 8e12a97c..0192ee31 100644
--- a/project/Test/ApiTest/build.gradle
+++ b/project/Test/ApiTest/build.gradle
@@ -12,7 +12,8 @@ android {
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
- minSdkVersion 19
+ minSdkVersion 21
+ targetSdkVersion 29
// externalNativeBuild {
// cmake {
diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java b/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
index ef92e2c5..03e2cca5 100644
--- a/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
+++ b/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
@@ -4,6 +4,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
@@ -33,6 +34,14 @@ protected void onCreate(Bundle savedInstanceState) {
findViewById(R.id.button9).setOnClickListener(this);
findViewById(R.id.button10).setOnClickListener(this);
findViewById(R.id.button11).setOnClickListener(this);
+
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ //测试android 10 后台启动问题
+ startActivity(new Intent(MyActivity.this, SingleTopActivity.class));
+ }
+ }, 5000);
}
diff --git a/project/TestPlugin/build.gradle b/project/TestPlugin/build.gradle
index c48263e1..dbc79919 100644
--- a/project/TestPlugin/build.gradle
+++ b/project/TestPlugin/build.gradle
@@ -31,7 +31,7 @@ android {
defaultConfig {
minSdkVersion 21
- targetSdkVersion 26
+ targetSdkVersion 29
versionCode 1
versionName '1.0'
}
diff --git a/project/TestPlugin/src/main/java/com/example/TestPlugin/ApkFragment.java b/project/TestPlugin/src/main/java/com/example/TestPlugin/ApkFragment.java
index d5c1a4f2..705b1daf 100644
--- a/project/TestPlugin/src/main/java/com/example/TestPlugin/ApkFragment.java
+++ b/project/TestPlugin/src/main/java/com/example/TestPlugin/ApkFragment.java
@@ -15,6 +15,7 @@
import android.os.RemoteException;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ListFragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -26,6 +27,7 @@
import android.widget.Toast;
import com.morgoo.droidplugin.pm.PluginManager;
+//import com.morgoo.helper.Log;
import com.morgoo.helper.compat.PackageManagerCompat;
import java.io.File;
@@ -189,6 +191,7 @@ public void run() {
if (!isViewCreated) {
return;
}
+ Log.i("mm", "start");
new Thread("ApkScanner") {
@Override
public void run() {
@@ -217,6 +220,21 @@ public void run() {
}
}
+
+ //10.0适配问题
+ file = getActivity().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
+ Log.i("mm", file.getAbsolutePath());
+ if (file.exists() && file.isDirectory()) {
+ File[] files1 = file.listFiles();
+ if (files1 != null) {
+ for (File apk : files1) {
+ if (apk.exists() && apk.getPath().toLowerCase().endsWith(".apk")) {
+ apks.add(apk);
+ }
+ }
+ }
+ }
+
PackageManager pm = getActivity().getPackageManager();
for (final File apk : apks) {
try {
From a3b9dabb8ec86d21cf47817f452f176be4afeef2 Mon Sep 17 00:00:00 2001
From: moziqi <709847739@qq.com>
Date: Wed, 5 Aug 2020 16:19:11 +0800
Subject: [PATCH 18/22] =?UTF-8?q?=E6=B2=A1=E6=95=88=E6=9E=9C=EF=BC=8C?=
=?UTF-8?q?=E5=90=8E=E9=9D=A2=E7=9C=8B=E7=9C=8B=E6=80=8E=E4=B9=88=E6=AC=BA?=
=?UTF-8?q?=E9=AA=97activitystart=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/example/ApiTest/MyActivity.java | 16 +++++++++++++++-
.../main/java/com/example/ApiTest/Service1.java | 6 ++++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java b/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
index 03e2cca5..f3bda4aa 100644
--- a/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
+++ b/project/Test/ApiTest/src/main/java/com/example/ApiTest/MyActivity.java
@@ -1,5 +1,6 @@
package com.example.ApiTest;
+import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -39,7 +40,20 @@ protected void onCreate(Bundle savedInstanceState) {
@Override
public void run() {
//测试android 10 后台启动问题
- startActivity(new Intent(MyActivity.this, SingleTopActivity.class));
+// try {
+// PendingIntent service = PendingIntent.getService(MyActivity.this, 0, new Intent(MyActivity.this, Service1.class), 0);
+// service.send();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+ try {
+ Intent intent = new Intent(getApplication(), SingleTopActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ PendingIntent activity = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
+ activity.send();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
}, 5000);
}
diff --git a/project/Test/ApiTest/src/main/java/com/example/ApiTest/Service1.java b/project/Test/ApiTest/src/main/java/com/example/ApiTest/Service1.java
index a86fedc6..a6733c8b 100644
--- a/project/Test/ApiTest/src/main/java/com/example/ApiTest/Service1.java
+++ b/project/Test/ApiTest/src/main/java/com/example/ApiTest/Service1.java
@@ -14,6 +14,12 @@
*/
public class Service1 extends BaseService {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Toast.makeText(getApplicationContext(), "Service1", Toast.LENGTH_SHORT).show();
+ }
+
@Override
String getTag() {
return Service1.class.getSimpleName();
From 6175c42a6509ae7e1de5e8e97e727c8a903603a1 Mon Sep 17 00:00:00 2001
From: zipper <709847739@qq.com>
Date: Tue, 11 Aug 2020 11:29:32 +0800
Subject: [PATCH 19/22] Update readme.md
---
readme.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/readme.md b/readme.md
index 6e814d30..e2e8d6b2 100755
--- a/readme.md
+++ b/readme.md
@@ -120,3 +120,4 @@ Process: com.example.TestPlugin:PluginP06, PID: 15779
at java.lang.Thread.dispatchUncaughtException(Thread.java:1955)
```
+meDev分支支持动态加载dp框架
From 05002c23158abaed4047a2d42f4201df17565406 Mon Sep 17 00:00:00 2001
From: zipper <709847739@qq.com>
Date: Thu, 13 Aug 2020 14:19:52 +0800
Subject: [PATCH 20/22] Update readme.md
---
readme.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/readme.md b/readme.md
index e2e8d6b2..2e748c03 100755
--- a/readme.md
+++ b/readme.md
@@ -120,4 +120,4 @@ Process: com.example.TestPlugin:PluginP06, PID: 15779
at java.lang.Thread.dispatchUncaughtException(Thread.java:1955)
```
-meDev分支支持动态加载dp框架
+
From 86681a52ab183b1d7b4d7cb2e82aebabd04bd870 Mon Sep 17 00:00:00 2001
From: ziqi mo <709847739@qq.com>
Date: Tue, 17 Nov 2020 09:12:18 +0800
Subject: [PATCH 21/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E4=BB=BB?=
=?UTF-8?q?=E5=8A=A1=E6=98=BE=E7=A4=BA=E7=9A=84=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../DroidPlugin/src/main/AndroidManifest.xml | 235 ++++++++++++++++++
.../example/TestPlugin/InstalledFragment.java | 9 +-
2 files changed, 242 insertions(+), 2 deletions(-)
diff --git a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
index 712d4da1..5cb9858c 100644
--- a/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
+++ b/project/Libraries/DroidPlugin/src/main/AndroidManifest.xml
@@ -223,6 +223,7 @@
Date: Wed, 7 Jul 2021 17:59:09 +0800
Subject: [PATCH 22/22] =?UTF-8?q?=E8=BF=98=E6=B2=A1=E6=90=9E=E6=87=82andro?=
=?UTF-8?q?id11=E7=9A=84=E9=80=82=E9=85=8D=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../morgoo/droidplugin/MyCrashHandler.java | 49 +++++++-----
.../hook/handle/PluginCallback.java | 80 +++++++++++++++++--
project/TestPlugin/build.gradle | 2 +-
.../TestPlugin/src/main/AndroidManifest.xml | 3 +
.../com/example/TestPlugin/ApkFragment.java | 15 ++++
5 files changed, 122 insertions(+), 27 deletions(-)
diff --git a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/MyCrashHandler.java b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/MyCrashHandler.java
index 25af3bbd..80c79ef7 100644
--- a/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/MyCrashHandler.java
+++ b/project/Libraries/DroidPlugin/src/main/java/com/morgoo/droidplugin/MyCrashHandler.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;
@@ -27,7 +27,9 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.os.Build;
import android.os.Environment;
+
import com.morgoo.helper.Log;
import com.morgoo.helper.compat.SystemPropertiesCompat;
@@ -78,7 +80,12 @@ public void uncaughtException(Thread thread, Throwable ex) {
Date date = new Date();
String dateStr = SIMPLE_DATE_FORMAT1.format(date);
- File file = new File(Environment.getExternalStorageDirectory(), String.format("PluginLog/CrashLog/CrashLog_%s_%s.log", dateStr, android.os.Process.myPid()));
+ File file = null;
+ if (Build.VERSION.SDK_INT >= 30) {
+ file = new File(mContext.getExternalCacheDir(), String.format("PluginLog/CrashLog/CrashLog_%s_%s.log", dateStr, android.os.Process.myPid()));
+ } else {
+ file = new File(Environment.getExternalStorageDirectory(), String.format("PluginLog/CrashLog/CrashLog_%s_%s.log", dateStr, android.os.Process.myPid()));
+ }
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
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 502b784f..0f66891d 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
@@ -32,6 +32,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.util.ArrayMap;
import com.morgoo.droidplugin.core.Env;
import com.morgoo.droidplugin.core.PluginProcessManager;
@@ -40,7 +41,9 @@
import com.morgoo.droidplugin.reflect.FieldUtils;
import com.morgoo.droidplugin.stub.ShortcutProxyActivity;
import com.morgoo.helper.Log;
+import com.morgoo.helper.compat.ActivityThreadCompat;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.List;
@@ -414,9 +417,9 @@ private boolean handleLaunchActivity(Message msg) {
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);
+ Log.i(TAG, "mactivityCallbacks>>>" + mActivityCallbacks);
if (mActivityCallbacks == null || mActivityCallbacks.size() == 0) {
if (mCallback != null) {
return mCallback.handleMessage(msg);
@@ -432,6 +435,12 @@ private boolean handleLaunchActivity(Message msg) {
//android Q 改为:android.app.servertransaction.TopResumedActivityChangeItem
//Class mTopResumedActivityChangeItem = Class.forName("android.app.servertransaction.TopResumedActivityChangeItem");
throw new RuntimeException("Android Q 的 TopResumedActivityChangeItem 没有 mIntent");
+ } else if ("android.app.servertransaction.NewIntentItem".equals(mLaunchActivityItemP.getClass().getName())) {
+ // private List mIntents;
+ Field mIntentLists = mLaunchActivityItemP.getClass().getDeclaredField("mIntents");
+ mIntentLists.setAccessible(true);
+ List intentLists = (List) mIntentLists.get(mLaunchActivityItemP);
+ stubIntent = (Intent) intentLists.get(0);
} else {
//拿到LaunchActivityItem中的Intent
Field mIntentField = mLaunchActivityItemClass.getDeclaredField("mIntent");
@@ -439,7 +448,9 @@ private boolean handleLaunchActivity(Message msg) {
stubIntent = (Intent) mIntentField.get(mLaunchActivityItemP);
}
- Log.i(TAG, "stubIntent>>>" + stubIntent.getClass() + "," + stubIntent.toString());
+ if (stubIntent != null) {
+ Log.i(TAG, "stubIntent>>>" + stubIntent.getClass() + "," + stubIntent.toString());
+ }
// Intent targetIntent = stubIntent.getParcelableExtra(Env.EXTRA_TARGET_INTENT);
// if (targetIntent != null) {
// mIntentField.setAccessible(true);
@@ -506,6 +517,13 @@ private boolean handleLaunchActivity(Message msg) {
}
}
+ Object activityClientRecordObj = null;
+ Field mActivities = ActivityThreadCompat.currentActivityThread().getClass().getDeclaredField("mActivities");
+ mActivities.setAccessible(true);
+ ArrayMap mActivitiesArrayMap = (ArrayMap) mActivities.get(ActivityThreadCompat.currentActivityThread());
+ for (Object o : mActivitiesArrayMap.keySet()) {
+ activityClientRecordObj = mActivitiesArrayMap.get(o);
+ }
if (!success) {
Intent newTargetIntent = new Intent();
newTargetIntent.setComponent(targetIntent.getComponent());
@@ -515,21 +533,73 @@ private boolean handleLaunchActivity(Message msg) {
}
//FieldUtils.writeDeclaredField(msg.obj, "intent", newTargetIntent);
if (mLaunchActivityItemP != null) {
- FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mIntent", newTargetIntent);
+ if ("android.app.servertransaction.NewIntentItem".equals(mLaunchActivityItemP.getClass().getName())) {
+// if (activityClientRecordObj != null) {
+// Field intent = activityClientRecordObj.getClass().getDeclaredField("intent");
+// intent.setAccessible(true);
+// intent.set(activityClientRecordObj, newTargetIntent);
+// }
+ //构建替换intent
+ Field mReferrerField = stubIntent.getClass().getDeclaredField("mReferrer");
+ mReferrerField.setAccessible(true);
+ String mReferrer = (String) mReferrerField.get(stubIntent);
+ Constructor> constructor = stubIntent.getClass().getConstructor(Intent.class, String.class);
+ constructor.setAccessible(true);
+ Object newIntent = constructor.newInstance(targetIntent, mReferrer);
+ //重新赋值回去
+ Field mIntentListFields = mLaunchActivityItemP.getClass().getDeclaredField("mIntents");
+ mIntentListFields.setAccessible(true);
+ List intentLists = (List) mIntentListFields.get(mLaunchActivityItemP);
+ intentLists.clear();
+ intentLists.add(newIntent);
+ mIntentListFields.set(mLaunchActivityItemP, intentLists);
+ } else {
+ FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mIntent", newTargetIntent);
+ }
} else {
FieldUtils.writeDeclaredField(msg.obj, "intent", newTargetIntent);
}
} else {
//FieldUtils.writeDeclaredField(msg.obj, "intent", targetIntent);
if (mLaunchActivityItemP != null) {
- FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mIntent", targetIntent);
+ if ("android.app.servertransaction.NewIntentItem".equals(mLaunchActivityItemP.getClass().getName())) {
+// if (activityClientRecordObj != null) {
+// Field intent = activityClientRecordObj.getClass().getDeclaredField("intent");
+// intent.setAccessible(true);
+// intent.set(activityClientRecordObj, targetIntent);
+// }
+ //构建替换intent
+ Field mReferrerField = stubIntent.getClass().getDeclaredField("mReferrer");
+ mReferrerField.setAccessible(true);
+ String mReferrer = (String) mReferrerField.get(stubIntent);
+ Constructor> constructor = stubIntent.getClass().getConstructor(Intent.class, String.class);
+ constructor.setAccessible(true);
+ Object newIntent = constructor.newInstance(targetIntent, mReferrer);
+ //重新赋值回去
+ Field mIntentListFields = mLaunchActivityItemP.getClass().getDeclaredField("mIntents");
+ mIntentListFields.setAccessible(true);
+ List intentLists = (List) mIntentListFields.get(mLaunchActivityItemP);
+ intentLists.clear();
+ intentLists.add(newIntent);
+ mIntentListFields.set(mLaunchActivityItemP, intentLists);
+ } else {
+ 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);
+ if ("android.app.servertransaction.NewIntentItem".equals(mLaunchActivityItemP.getClass().getName())) {
+ if (activityClientRecordObj != null) {
+ Field activityInfoFiled = activityClientRecordObj.getClass().getDeclaredField("activityInfo");
+ activityInfoFiled.setAccessible(true);
+ activityInfoFiled.set(activityClientRecordObj, targetActivityInfo);
+ }
+ } else {
+ FieldUtils.writeDeclaredField(mLaunchActivityItemP, "mInfo", targetActivityInfo);
+ }
} else {
FieldUtils.writeDeclaredField(msg.obj, "activityInfo", targetActivityInfo);
}
diff --git a/project/TestPlugin/build.gradle b/project/TestPlugin/build.gradle
index c48263e1..0c97372f 100644
--- a/project/TestPlugin/build.gradle
+++ b/project/TestPlugin/build.gradle
@@ -31,7 +31,7 @@ android {
defaultConfig {
minSdkVersion 21
- targetSdkVersion 26
+ targetSdkVersion 28
versionCode 1
versionName '1.0'
}
diff --git a/project/TestPlugin/src/main/AndroidManifest.xml b/project/TestPlugin/src/main/AndroidManifest.xml
index 530e4792..b2e8cf42 100644
--- a/project/TestPlugin/src/main/AndroidManifest.xml
+++ b/project/TestPlugin/src/main/AndroidManifest.xml
@@ -4,6 +4,9 @@
android:versionCode="1"
android:versionName="1.0">
+
+
+
apks = new ArrayList(10);
+
File[] files = file.listFiles();
if (files != null) {
for (File apk : files) {
@@ -215,7 +216,21 @@ public void run() {
}
}
}
+ }
+ /**
+ * 增加读取应用内的cache目录去拉去apk
+ */
+ file = new File(getContext().getExternalCacheDir().getAbsolutePath());
+ if (file.exists() && file.isDirectory()) {
+ File[] files1 = file.listFiles();
+ if (files1 != null) {
+ for (File apk : files1) {
+ if (apk.exists() && apk.getPath().toLowerCase().endsWith(".apk")) {
+ apks.add(apk);
+ }
+ }
+ }
}
PackageManager pm = getActivity().getPackageManager();
for (final File apk : apks) {