Skip to content

Commit 220bd71

Browse files
authored
Merge pull request #368 from SkyEric/dev
Improve the implementation of the plugin uninstall logic
2 parents df804a8 + 3f7e859 commit 220bd71

File tree

7 files changed

+73
-61
lines changed

7 files changed

+73
-61
lines changed

replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPluginHost.aidl

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ interface IPluginHost {
6262

6363
PluginInfo pluginDownloaded(String path);
6464

65+
boolean pluginUninstalled(in PluginInfo info);
66+
6567
boolean pluginExtracted(String path);
6668

6769
oneway void sendIntent2Process(String target, in Intent intent);

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/MP.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,11 @@ public static final boolean pluginUninstall(String pluginName) {
282282
return true;
283283
}
284284

285-
// 插件已安装
286285
try {
287-
return PluginManagerProxy.uninstall(pi);
288-
} catch (RemoteException e) {
289-
e.printStackTrace();
290-
if (LOG) {
291-
e.printStackTrace();
286+
return PluginProcessMain.getPluginHost().pluginUninstalled(pi);
287+
} catch (Throwable e) {
288+
if (LOGR) {
289+
LogRelease.e(PLUGIN_TAG, "uninstall. error: " + e.getMessage(), e);
292290
}
293291
}
294292

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -581,9 +581,8 @@ final void callAppCreate() {
581581
if (!IPC.isPersistentProcess()) {
582582
// 由于常驻进程已经在内部做了相关的处理,此处仅需要在UI进程注册并更新即可
583583
registerReceiverAction(ACTION_NEW_PLUGIN);
584+
registerReceiverAction(ACTION_UNINSTALL_PLUGIN);
584585
}
585-
// 由于常驻进程内未做处理,因此需要在常驻和UI进程同时注册并更新缓存信息
586-
registerReceiverAction(ACTION_UNINSTALL_PLUGIN);
587586
}
588587

589588
/**

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmHostSvc.java

+45-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
import android.support.v4.content.LocalBroadcastManager;
2828
import android.text.TextUtils;
2929

30+
import com.qihoo360.mobilesafe.api.Tasks;
3031
import com.qihoo360.replugin.RePlugin;
3132
import com.qihoo360.replugin.RePluginConstants;
3233
import com.qihoo360.replugin.RePluginEventCallbacks;
34+
import com.qihoo360.replugin.RePluginInternal;
3335
import com.qihoo360.replugin.base.IPC;
3436
import com.qihoo360.replugin.base.LocalBroadcastHelper;
3537
import com.qihoo360.replugin.component.ComponentList;
@@ -42,6 +44,7 @@
4244
import com.qihoo360.replugin.helper.LogRelease;
4345
import com.qihoo360.replugin.model.PluginInfo;
4446
import com.qihoo360.replugin.packages.IPluginManagerServer;
47+
import com.qihoo360.replugin.packages.PluginInfoUpdater;
4548
import com.qihoo360.replugin.packages.PluginManagerServer;
4649

4750
import java.io.File;
@@ -329,13 +332,29 @@ public PluginInfo pluginDownloaded(String path) throws RemoteException {
329332

330333
if (pi != null) {
331334
// 通常到这里,表示“安装已成功”,这时不管处于什么状态,都应该通知外界更新插件内存表
332-
syncPluginInfo2All(pi);
335+
syncInstalledPluginInfo2All(pi);
336+
333337
}
334338

335339
return pi;
336340
}
337341

338-
private void syncPluginInfo2All(PluginInfo pi) {
342+
@Override
343+
public boolean pluginUninstalled(PluginInfo info) throws RemoteException {
344+
if (LOG) {
345+
LogDebug.d(PLUGIN_TAG, "pluginUninstalled: pn=" + info.getName());
346+
}
347+
final boolean result = mManager.getService().uninstall(info);
348+
349+
// 卸载完成
350+
if (result) {
351+
syncUninstalledPluginInfo2All(info);
352+
}
353+
354+
return result;
355+
}
356+
357+
private void syncInstalledPluginInfo2All(PluginInfo pi) {
339358
// PS:若更新了“正在运行”的插件(属于“下次重启进程后更新”),则由于install返回的是“新的PluginInfo”,为防止出现“错误更新”,需要使用原来的
340359
//
341360
// 举例,有一个正在运行的插件A(其Info为PluginInfoOld)升级到新版(其Info为PluginInfoNew),则:
@@ -363,7 +382,30 @@ private void syncPluginInfo2All(PluginInfo pi) {
363382
IPC.sendLocalBroadcast2AllSync(mContext, intent);
364383

365384
if (LOG) {
366-
LogDebug.d(TAG, "syncPluginInfo2All: Sync complete! syncPi=" + needToSyncPi);
385+
LogDebug.d(TAG, "syncInstalledPluginInfo2All: Sync complete! syncPi=" + needToSyncPi);
386+
}
387+
}
388+
389+
390+
private void syncUninstalledPluginInfo2All(PluginInfo pi) {
391+
392+
// 在常驻进程内更新插件内存表
393+
mPluginMgr.pluginUninstalled(pi);
394+
395+
// 给各进程发送广播,同步更新
396+
final Intent intent = new Intent(PluginInfoUpdater.ACTION_UNINSTALL_PLUGIN);
397+
intent.putExtra("obj", pi);
398+
// 注意:若在attachBaseContext中调用此方法,则由于此时getApplicationContext为空,导致发送广播时会出现空指针异常。
399+
// 则应该Post一下,待getApplicationContext有值后再发送广播。
400+
if (RePluginInternal.getAppContext().getApplicationContext() != null) {
401+
IPC.sendLocalBroadcast2AllSync(RePluginInternal.getAppContext(), intent);
402+
} else {
403+
Tasks.post2UI(new Runnable() {
404+
@Override
405+
public void run() {
406+
IPC.sendLocalBroadcast2All(RePluginInternal.getAppContext(), intent);
407+
}
408+
});
367409
}
368410
}
369411

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginManagerProxy.java

-26
Original file line numberDiff line numberDiff line change
@@ -102,32 +102,6 @@ public static List<PluginInfo> updateAllPlugins() throws RemoteException {
102102
return sRemote.load();
103103
}
104104

105-
/**
106-
* 常驻进程进行插件卸载
107-
*
108-
* @param pi
109-
*/
110-
public static boolean uninstall(PluginInfo pi) throws RemoteException {
111-
if (pi == null) {
112-
// 不太可能到这里
113-
return false;
114-
}
115-
if (pi.isPnPlugin()) {
116-
// 是常驻进程?老逻辑直接走dex文件存在判断,也无需做处理
117-
return false;
118-
}
119-
120-
if (sRemote == null) {
121-
// 常驻已挂掉,可以认为无需处理
122-
if (LogRelease.LOGR) {
123-
LogRelease.e(PLUGIN_TAG, "pmc.uuin: s=null");
124-
}
125-
return false;
126-
}
127-
128-
return sRemote.uninstall(pi);
129-
}
130-
131105
/**
132106
* 去常驻进程更新isUsed状态,并发送到所有进程中更新
133107
*

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginManagerServer.java

+3-15
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,9 @@ private void updateNow(PluginInfo curInfo, PluginInfo newInfo) {
428428
}
429429

430430
private void move(@NonNull PluginInfo curPi, @NonNull PluginInfo newPi) {
431+
if (LogDebug.LOG) {
432+
LogDebug.i(TAG, "move. curPi=" + curPi.getPath() + "; newPi=" + newPi.getPath());
433+
}
431434
try {
432435
FileUtils.copyFile(newPi.getApkFile(), curPi.getApkFile());
433436

@@ -529,21 +532,6 @@ private boolean uninstallNow(PluginInfo info) {
529532
mList.remove(info.getName());
530533
mList.save(mContext);
531534

532-
// 3. 给各进程发送广播,同步更新
533-
final Intent intent = new Intent(PluginInfoUpdater.ACTION_UNINSTALL_PLUGIN);
534-
intent.putExtra("obj", info);
535-
// 注意:若在attachBaseContext中调用此方法,则由于此时getApplicationContext为空,导致发送广播时会出现空指针异常。
536-
// 则应该Post一下,待getApplicationContext有值后再发送广播。
537-
if (RePluginInternal.getAppContext().getApplicationContext() != null) {
538-
IPC.sendLocalBroadcast2AllSync(RePluginInternal.getAppContext(), intent);
539-
} else {
540-
Tasks.post2UI(new Runnable() {
541-
@Override
542-
public void run() {
543-
IPC.sendLocalBroadcast2All(RePluginInternal.getAppContext(), intent);
544-
}
545-
});
546-
}
547535
return true;
548536
}
549537

replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/pkg/PackageFilesUtil.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -284,15 +284,21 @@ public static void forceDelete(PluginInfo info) {
284284

285285
try {
286286
// 删除插件APK
287-
FileUtils.forceDelete(info.getApkFile());
288-
if (BuildConfig.DEBUG) {
289-
Log.i(TAG, "delete " + info.getApkFile());
287+
final File apkFile = info.getApkFile();
288+
if (apkFile.exists()) {
289+
FileUtils.forceDelete(apkFile);
290+
if (BuildConfig.DEBUG) {
291+
Log.i(TAG, "delete " + info.getApkFile());
292+
}
290293
}
291294

292295
// 删除释放后的odex
293-
FileUtils.forceDelete(info.getDexFile());
294-
if (BuildConfig.DEBUG) {
295-
Log.i(TAG, "delete " + info.getDexFile());
296+
final File dexFile = info.getDexFile();
297+
if (dexFile.exists()) {
298+
FileUtils.forceDelete(dexFile);
299+
if (BuildConfig.DEBUG) {
300+
Log.i(TAG, "delete " + info.getDexFile());
301+
}
296302
}
297303

298304
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
@@ -323,9 +329,12 @@ public static void forceDelete(PluginInfo info) {
323329
}
324330

325331
// 删除Native文件
326-
FileUtils.forceDelete(info.getNativeLibsDir());
327-
if (BuildConfig.DEBUG) {
328-
Log.i(TAG, "delete " + info.getNativeLibsDir());
332+
final File libsFile = info.getNativeLibsDir();
333+
if (libsFile.exists()) {
334+
FileUtils.forceDelete(info.getNativeLibsDir());
335+
if (BuildConfig.DEBUG) {
336+
Log.i(TAG, "delete " + info.getNativeLibsDir());
337+
}
329338
}
330339

331340
// 删除进程锁文件

0 commit comments

Comments
 (0)