Skip to content

Commit 6231b4f

Browse files
committed
修复插件中判断当前进程名时错误的问题
1 parent f525d54 commit 6231b4f

File tree

4 files changed

+48
-12
lines changed

4 files changed

+48
-12
lines changed

PluginCore/src/com/plugin/core/PluginContextTheme.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.content.IntentFilter;
88
import android.content.SharedPreferences;
99
import android.content.pm.ApplicationInfo;
10+
import android.content.pm.PackageManager;
1011
import android.content.res.AssetManager;
1112
import android.content.res.Resources;
1213
import android.database.DatabaseErrorHandler;
@@ -33,6 +34,8 @@ public class PluginContextTheme extends PluginBaseContextWrapper {
3334

3435
private ArrayList<BroadcastReceiver> receivers = new ArrayList<BroadcastReceiver>();
3536

37+
private boolean crackPackageManager = false;
38+
3639
public PluginContextTheme(PluginDescriptor pluginDescriptor,
3740
Context base, Resources resources,
3841
ClassLoader classLoader) {
@@ -238,4 +241,16 @@ public void unregisterAllReceiver() {
238241
}
239242
receivers.clear();
240243
}
244+
245+
@Override
246+
public PackageManager getPackageManager() {
247+
if (crackPackageManager) {
248+
return null;
249+
}
250+
return super.getPackageManager();
251+
}
252+
253+
public void setCrackPackageManager(boolean crackPackageManager) {
254+
this.crackPackageManager = crackPackageManager;
255+
}
241256
}

PluginCore/src/com/plugin/core/PluginLauncher.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,12 @@ private Application callPluginApplicationOnCreate(Context pluginContext, DexClas
135135

136136
try {
137137
LogUtil.d("创建插件Application", pluginDescriptor.getApplicationName());
138-
//阻止自动安装multidex
139-
try {
140-
Class mulitDex = classLoader.loadClass("android.support.multidex.MultiDex");
141-
RefInvoker.setFieldObject(null, mulitDex, "IS_VM_MULTIDEX_CAPABLE", true);
142-
} catch (Exception e) {
143-
}
138+
//阻止自动安装multidex, 如果插件application对象的attachContext
139+
//方法中使用了packagemanager, 这里会导致异常
140+
((PluginContextTheme)pluginContext).setCrackPackageManager(true);
144141
application = Instrumentation.newApplication(classLoader.loadClass(pluginDescriptor.getApplicationName()),
145142
pluginContext);
143+
((PluginContextTheme)pluginContext).setCrackPackageManager(false);
146144
} catch (ClassNotFoundException e) {
147145
e.printStackTrace();
148146
} catch (InstantiationException e) {

PluginCore/src/com/plugin/core/PluginLoader.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.os.Build;
1414
import android.os.Bundle;
1515
import android.os.Handler;
16+
import android.util.Log;
1617

1718
import com.plugin.content.LoadedPlugin;
1819
import com.plugin.content.PluginDescriptor;
@@ -53,11 +54,15 @@ public static synchronized void initLoader(Application app) {
5354
isLoaderInited = true;
5455
sApplication = app;
5556

57+
//这里的isPluginProcess方法需要在安装AndroidAppIActivityManager之前执行。
58+
//原因见AndroidAppIActivityManager的getRunningAppProcesses()方法
59+
boolean isPluginProcess = ProcessUtil.isPluginProcess();
60+
5661
AndroidAppIActivityManager.installProxy();
5762
AndroidAppINotificationManager.installProxy();
5863
AndroidAppIPackageManager.installProxy(sApplication.getPackageManager());
5964

60-
if (ProcessUtil.isPluginProcess()) {
65+
if (isPluginProcess) {
6166
AndroidWidgetToast.installProxy();
6267
AndroidViewLayoutInflater.installPluginCustomViewConstructorCache();
6368
//不可在主进程中同步安装,因为此时ActivityThread还没有准备好, 会导致空指针。
@@ -73,7 +78,7 @@ public void run() {
7378
PluginInjector.injectInstrumentation();
7479
PluginInjector.injectBaseContext(sApplication);
7580

76-
if (ProcessUtil.isPluginProcess()) {
81+
if (isPluginProcess) {
7782
Iterator<PluginDescriptor> itr = PluginManagerHelper.getPlugins().iterator();
7883
while (itr.hasNext()) {
7984
PluginDescriptor plugin = itr.next();

PluginCore/src/com/plugin/core/systemservice/AndroidAppIActivityManager.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package com.plugin.core.systemservice;
22

3+
import android.app.ActivityManager;
34
import android.content.Intent;
45

56
import com.plugin.content.PluginDescriptor;
7+
import com.plugin.core.PluginLoader;
68
import com.plugin.core.proxy.MethodDelegate;
79
import com.plugin.core.proxy.MethodProxy;
810
import com.plugin.core.proxy.ProxyUtil;
911
import com.plugin.util.LogUtil;
1012
import com.plugin.util.NotificationHelper;
13+
import com.plugin.util.ProcessUtil;
1114
import com.plugin.util.RefInvoker;
1215

1316
import java.lang.reflect.Method;
17+
import java.util.List;
1418

1519
/**
1620
* Created by cailiming on 16/1/15.
@@ -43,11 +47,25 @@ public static void installProxy() {
4347

4448
//public List<RunningAppProcessInfo> getRunningAppProcesses()
4549
public static class getRunningAppProcesses extends MethodDelegate {
50+
4651
@Override
47-
public Object beforeInvoke(Object target, Method method, Object[] args) {
48-
LogUtil.e("beforeInvoke", method.getName());
49-
//TODO 需要时再说
50-
return super.beforeInvoke(target, method, args);
52+
public Object afterInvoke(Object target, Method method, Object[] args, Object beforeInvoke, Object invokeResult) {
53+
LogUtil.e("afterInvoke", method.getName());
54+
//由于插件运行在插件进程中,这里需要欺骗插件,让插件的中判断进程的逻辑以为当前是在主进程中运行
55+
//但是这会导致插件框架也无法判断当前的进程了,因此框架中判断插件进程的方法一定要在安装ActivityManager代理之前执行并记住状态
56+
//同时要保证主进程能正确判断进程。
57+
//这里不会导致无限递归,因为ProcessUtil.isPluginProcess方法内部有缓存,再安装ActivityManager代理之前已经执行并缓存了
58+
if (ProcessUtil.isPluginProcess()) {
59+
List<ActivityManager.RunningAppProcessInfo> result = (List<ActivityManager.RunningAppProcessInfo>)invokeResult;
60+
for (ActivityManager.RunningAppProcessInfo appProcess : result) {
61+
if (appProcess.pid == android.os.Process.myPid()) {
62+
appProcess.processName = PluginLoader.getApplication().getPackageName();
63+
break;
64+
}
65+
}
66+
}
67+
68+
return super.afterInvoke(target, method, args, beforeInvoke, invokeResult);
5169
}
5270
}
5371

0 commit comments

Comments
 (0)