Date: Mon, 20 Aug 2018 16:56:23 +0800
Subject: [PATCH 04/15] Update readme
Update readme
---
README_CN.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README_CN.md b/README_CN.md
index 394e4c34..2e18c4d3 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -57,6 +57,10 @@ RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件
让插件化能**飞入寻常应用家**,做到稳定、灵活、自由,大小项目兼用。
+## 最新特性
+
+解决了Android P(Android 9.0)相关适配问题,全面支持Android P(Android 9.0)正式版。
+
## RePlugin 架构图
From d436f087056431158da5c5b981ec7a6eaec4549c Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Mon, 20 Aug 2018 17:00:18 +0800
Subject: [PATCH 05/15] Update readme
Update readme
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index e1dd3fb1..ae2b9328 100644
--- a/README.md
+++ b/README.md
@@ -55,6 +55,9 @@ At present, almost **all Apps with hundreds of millions users from 360, and many
## Our Vision
Make RePlugin be used in all kinds of ordinary Apps; and provide stable, flexible, liberal plug-ins which adopt for both large and small projects.
+## Our Vision
+Solved the Android P (Android 9.0) related adaptation issues, fully support the official version of Android P (Android 9.0).
+
## RePlugin Architecture
From 4d6737d67d92dd426ee5f82f83e25fb38b269d38 Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Mon, 20 Aug 2018 17:01:32 +0800
Subject: [PATCH 06/15] Update readme
Update readme
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ae2b9328..fec0a688 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,7 @@ At present, almost **all Apps with hundreds of millions users from 360, and many
## Our Vision
Make RePlugin be used in all kinds of ordinary Apps; and provide stable, flexible, liberal plug-ins which adopt for both large and small projects.
-## Our Vision
+## Latest features
Solved the Android P (Android 9.0) related adaptation issues, fully support the official version of Android P (Android 9.0).
## RePlugin Architecture
From 007dab5fe5ec11c6ce3b28f6b465021d4888eeca Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Wed, 29 Aug 2018 14:25:43 +0800
Subject: [PATCH 07/15] update readme
notice
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index fec0a688..436bfeb3 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,8 @@
[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/Qihoo360/RePlugin/blob/master/LICENSE)
[![Release Version](https://img.shields.io/badge/release-2.3.0-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)
-
+## 活动通知
+移动技术最新活动通知:9月1号360移动技术开放日 http://t.cn/RDiNru9
## RePlugin —— A flexible, stable, easy-to-use Android Plug-in Framework
From 5da39dedf616c0b5b3593f90d43ec07eb53b25f6 Mon Sep 17 00:00:00 2001
From: YuTianTina
Date: Fri, 12 Oct 2018 17:29:22 +0800
Subject: [PATCH 08/15] fix when jar does not exist in repacage then pass
---
.../replugin/gradle/plugin/inner/ReClassTransform.groovy | 4 ++++
.../com/qihoo360/replugin/gradle/plugin/inner/Util.groovy | 7 ++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/ReClassTransform.groovy b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/ReClassTransform.groovy
index 2f257de6..be576dff 100644
--- a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/ReClassTransform.groovy
+++ b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/ReClassTransform.groovy
@@ -240,6 +240,10 @@ public class ReClassTransform extends Transform {
jar = new File(jarPath)
}
+ if(!jar.exists()){
+ return
+ }
+
String destName = input.name
def hexName = DigestUtils.md5Hex(jar.absolutePath)
if (destName.endsWith('.jar')) {
diff --git a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/Util.groovy b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/Util.groovy
index ce7d506b..d833a68c 100644
--- a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/Util.groovy
+++ b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/inner/Util.groovy
@@ -128,7 +128,12 @@ public class Util {
* 压缩 dirPath 到 zipFilePath
*/
def static zipDir(String dirPath, String zipFilePath) {
- new AntBuilder().zip(destfile: zipFilePath, basedir: dirPath)
+ File dir = new File(dirPath)
+ if(dir.exists()){
+ new AntBuilder().zip(destfile: zipFilePath, basedir: dirPath)
+ }else{
+ println ">>> Zip file is empty! Ignore"
+ }
}
/**
From e0c1552c50435c5e48cee172f485e7c20d2d8691 Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Wed, 14 Nov 2018 15:00:49 +0800
Subject: [PATCH 09/15] =?UTF-8?q?=E3=80=90buyuntao=E3=80=91Solve=20the=20A?=
=?UTF-8?q?NR=20problem=20related=20to=20sendIntent?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../qihoo360/loader2/PluginProcessMain.java | 63 +++++++++++--------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
index 4751e567..23d290c2 100644
--- a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
+++ b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
@@ -479,7 +479,7 @@ static final IPluginClient probePluginClient(String plugin, int process, PluginB
continue;
}
- /* 是否是用户自定义进程 */
+ /* 是否是用户自定义进程 */
} else if (PluginProcessHost.isCustomPluginProcess(process)) {
if (!TextUtils.equals(r.plugin, getProcessStringByIndex(process))) {
continue;
@@ -543,6 +543,7 @@ static final IPluginClient probePluginClientByPid(int pid, PluginBinderInfo info
* @param intent
*/
static final void sendIntent2Process(String target, Intent intent, boolean sync) {
+ Map map = new HashMap<>();
synchronized (PROCESSES) {
for (ProcessClientRecord r : ALL.values()) {
if (target == null || target.length() <= 0) {
@@ -555,20 +556,24 @@ static final void sendIntent2Process(String target, Intent intent, boolean sync)
if (!isBinderAlive(r)) {
continue;
}
+ map.put(r.name, r);
+ }
+ }
+
+ for (ProcessClientRecord r : map.values()) {
+ if (!isBinderAlive(r)) {
+ continue;
+ }
+ try {
if (LOG) {
LogDebug.d(PLUGIN_TAG, "sendIntent2Process name=" + r.name);
}
- try {
- if (sync) {
- r.client.sendIntentSync(intent);
- } else {
- r.client.sendIntent(intent);
- }
- } catch (Throwable e) {
- if (LOGR) {
- LogRelease.e(PLUGIN_TAG, "s.i2pr e: n=" + r.name + ": " + e.getMessage(), e);
- }
+ if (sync) {
+ r.client.sendIntentSync(intent);
+ } else {
+ r.client.sendIntent(intent);
}
+ } catch (Throwable e) {
}
}
}
@@ -581,6 +586,7 @@ static final void sendIntent2Plugin(String target, Intent intent, boolean sync)
if (target == null || target.length() <= 0) {
return;
}
+ Map map = new HashMap<>();
synchronized (PROCESSES) {
for (ProcessClientRecord r : ALL.values()) {
if (TextUtils.equals(r.plugin, target)) {
@@ -591,16 +597,22 @@ static final void sendIntent2Plugin(String target, Intent intent, boolean sync)
if (!isBinderAlive(r)) {
continue;
}
- try {
- if (sync) {
- r.client.sendIntentSync(intent);
- } else {
- r.client.sendIntent(intent);
- }
- } catch (Throwable e) {
- if (LOGR) {
- LogRelease.e(PLUGIN_TAG, "s.i2pl e: " + e.getMessage(), e);
- }
+ map.put(r.name, r);
+ }
+ }
+ for (ProcessClientRecord r : map.values()) {
+ if (!isBinderAlive(r)) {
+ continue;
+ }
+ try {
+ if (sync) {
+ r.client.sendIntentSync(intent);
+ } else {
+ r.client.sendIntent(intent);
+ }
+ } catch (Throwable e) {
+ if (LOGR) {
+ LogRelease.e(PLUGIN_TAG, "s.i2pl e: " + e.getMessage(), e);
}
}
}
@@ -660,11 +672,11 @@ static final int sumActivities() {
}
/**
- * @deprecated 待优化
- * 插件进程调度
* @param plugin
* @param process
* @return
+ * @deprecated 待优化
+ * 插件进程调度
*/
@Deprecated
static final int allocProcess(String plugin, int process) {
@@ -691,6 +703,7 @@ static final int allocProcess(String plugin, int process) {
/**
* 常驻进程调用
+ *
* @param pid
* @param process
* @param index
@@ -863,9 +876,9 @@ private static final void handleBinderDied(ProcessClientRecord p, PluginManagerS
}
/**
- * @deprecated 待优化
* @param plugin
* @return
+ * @deprecated 待优化
*/
@Deprecated
private static final int allocProcessLocked(String plugin) {
@@ -942,7 +955,7 @@ private static final int allocProcessLocked(String plugin) {
LogDebug.d(PLUGIN_TAG, "alloc plugin process: found stoped plugin process: index=" + r.index);
LogDebug.i(PLUGIN_TAG, "stoped st=" + r.state + " i=" + r.index + " orig.p=" + r.plugin);
}
- // 标记为分配状态
+ // 标记为分配状态
r.allocate(plugin);
// 确保进程为空
int pid = lookupPluginProcess(processes, r.index);
From 18295e67842a9f1893a4f9c121c74a426448151f Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Wed, 14 Nov 2018 15:05:41 +0800
Subject: [PATCH 10/15] =?UTF-8?q?=E3=80=90buyuntao=E3=80=91Optimize=20the?=
=?UTF-8?q?=20logic=20of=20regReceivers=20in=20loadDex?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/com/qihoo360/loader2/Loader.java | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java
index 518bc8e7..aa054aa3 100644
--- a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java
+++ b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java
@@ -17,6 +17,7 @@
package com.qihoo360.loader2;
import android.content.Context;
+import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
@@ -382,12 +383,18 @@ final boolean loadDex(ClassLoader parent, int load) {
private void regReceivers() throws android.os.RemoteException {
String plugin = mPluginObj.mInfo.getName();
+ Map> map = ManifestParser.INS.getReceiverFilterMap(plugin);
+
+ if (map == null || map.size() == 0) {
+ return;
+ }
+
if (mPluginHost == null) {
mPluginHost = getPluginHost();
}
if (mPluginHost != null) {
- mPluginHost.regReceiver(plugin, ManifestParser.INS.getReceiverFilterMap(plugin));
+ mPluginHost.regReceiver(plugin, map);
}
}
From a72bc75c81d8ef8eea200f6aefb319491b78400d Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Wed, 14 Nov 2018 15:14:51 +0800
Subject: [PATCH 11/15] =?UTF-8?q?=E3=80=90buyuntao=E3=80=91Fix=20broadcast?=
=?UTF-8?q?=20duplicate=20registration=20issues,=20improve=20initializatio?=
=?UTF-8?q?n=20and=20synchronization=20broadcast=20efficiency?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/qihoo360/loader2/PmBase.java | 65 ++++++++++---------
.../java/com/qihoo360/replugin/RePlugin.java | 7 ++
2 files changed, 43 insertions(+), 29 deletions(-)
diff --git a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java
index d5041940..9728c702 100644
--- a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java
+++ b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java
@@ -173,6 +173,34 @@ class PmBase {
*/
private static final byte[] LOCKER = new byte[0];
+ /**
+ * 广播接收器,声明为成员变量以避免重复创建
+ */
+ private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (TextUtils.isEmpty(action)) {
+ return;
+ }
+
+ if (action.equals(intent.getAction())) {
+ PluginInfo info = intent.getParcelableExtra("obj");
+ if (info != null) {
+ switch (action) {
+ case ACTION_NEW_PLUGIN:
+ // 非常驻进程上下文
+ newPluginFound(info, intent.getBooleanExtra(RePluginConstants.KEY_PERSIST_NEED_RESTART, false));
+ break;
+ case ACTION_UNINSTALL_PLUGIN:
+ pluginUninstalled(info);
+ break;
+ }
+ }
+ }
+ }
+ };
+
/**
* 类映射
*/
@@ -619,36 +647,15 @@ final void callAppCreate() {
if (!IPC.isPersistentProcess()) {
// 由于常驻进程已经在内部做了相关的处理,此处仅需要在UI进程注册并更新即可
- registerReceiverAction(ACTION_NEW_PLUGIN);
- registerReceiverAction(ACTION_UNINSTALL_PLUGIN);
- }
- }
-
- /**
- * @param action
- */
- private final void registerReceiverAction(final String action) {
- IntentFilter filter = new IntentFilter(action);
- LocalBroadcastManager.getInstance(mContext).registerReceiver(new BroadcastReceiver() {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (action.equals(intent.getAction())) {
- PluginInfo info = intent.getParcelableExtra("obj");
- if (info != null) {
- switch (action) {
- case ACTION_NEW_PLUGIN:
- // 非常驻进程上下文
- newPluginFound(info, intent.getBooleanExtra(RePluginConstants.KEY_PERSIST_NEED_RESTART, false));
- break;
- case ACTION_UNINSTALL_PLUGIN:
- pluginUninstalled(info);
- break;
- }
- }
- }
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(ACTION_NEW_PLUGIN);
+ intentFilter.addAction(ACTION_UNINSTALL_PLUGIN);
+ try {
+ LocalBroadcastManager.getInstance(mContext).registerReceiver(mBroadcastReceiver, intentFilter);
+ } catch (Exception e) {
+ //
}
- }, filter);
+ }
}
/**
diff --git a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java
index 888421dd..721449e7 100644
--- a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java
+++ b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java
@@ -66,6 +66,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import static com.qihoo360.replugin.helper.LogDebug.LOG;
@@ -915,6 +916,8 @@ public static class App {
static boolean sAttached;
+ static AtomicBoolean sCreated = new AtomicBoolean(false);
+
/**
* 当Application的attachBaseContext调用时需调用此方法
* 使用插件框架默认的方案
@@ -997,6 +1000,10 @@ public static void onCreate() {
throw new IllegalStateException();
}
+ if (!sCreated.compareAndSet(false, true)) {
+ return;
+ }
+
Tasks.init();
PMF.callAppCreate();
From 8d15cb95f5c11cf3535cabf60590d5774aaa1b76 Mon Sep 17 00:00:00 2001
From: buyuntao
Date: Wed, 14 Nov 2018 15:22:38 +0800
Subject: [PATCH 12/15] =?UTF-8?q?=E3=80=90hanyongbai=E3=80=91#Synchronize#?=
=?UTF-8?q?=20Optimize=20Lock=20for=20read/write=20ALL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../qihoo360/loader2/PluginProcessMain.java | 383 +++++++++++-------
.../java/com/qihoo360/loader2/PmBase.java | 4 +-
2 files changed, 236 insertions(+), 151 deletions(-)
diff --git a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
index 23d290c2..a01e1997 100644
--- a/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
+++ b/replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
@@ -21,7 +21,9 @@
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
+import android.support.annotation.NonNull;
import android.text.TextUtils;
+import android.util.Log;
import com.qihoo360.i.IPluginManager;
import com.qihoo360.mobilesafe.api.Tasks;
@@ -44,6 +46,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import static com.qihoo360.replugin.helper.LogDebug.LOG;
import static com.qihoo360.replugin.helper.LogDebug.MAIN_TAG;
@@ -55,6 +58,8 @@
*/
public class PluginProcessMain {
+ public static final String TAG = PluginProcessMain.class.getSimpleName();
+
private static final int STATE_UNUSED = 0;
private static final int STATE_ALLOCATED = 1;
@@ -90,6 +95,8 @@ public class PluginProcessMain {
* processName -> ProcessClientRecord
*/
private static final Map ALL = new HashMap();
+ // 因为大多数时间ALL都是读(写仅仅发生在进程开始和死亡),因此每次使用都是独占锁本身就非常消耗性能。
+ private static final ReentrantReadWriteLock PROCESS_CLIENT_LOCK = new ReentrantReadWriteLock();
static {
for (int i = 0; i < Constant.STUB_PROCESS_COUNT; i++) {
@@ -471,36 +478,39 @@ static final long getPersistentCookie() {
* @param info
* @return
*/
- static final IPluginClient probePluginClient(String plugin, int process, PluginBinderInfo info) {
- synchronized (PROCESSES) {
- for (ProcessClientRecord r : ALL.values()) {
- if (process == IPluginManager.PROCESS_UI) {
- if (!TextUtils.equals(r.plugin, Constant.PLUGIN_NAME_UI)) {
- continue;
- }
+ static final IPluginClient probePluginClient(final String plugin, final int process, final PluginBinderInfo info) {
+ return readProcessClientLock(new Action() {
+ @Override
+ public IPluginClient call() {
+ for (ProcessClientRecord r : ALL.values()) {
+ if (process == IPluginManager.PROCESS_UI) {
+ if (!TextUtils.equals(r.plugin, Constant.PLUGIN_NAME_UI)) {
+ continue;
+ }
- /* 是否是用户自定义进程 */
- } else if (PluginProcessHost.isCustomPluginProcess(process)) {
- if (!TextUtils.equals(r.plugin, getProcessStringByIndex(process))) {
- continue;
+ /* 是否是用户自定义进程 */
+ } else if (PluginProcessHost.isCustomPluginProcess(process)) {
+ if (!TextUtils.equals(r.plugin, getProcessStringByIndex(process))) {
+ continue;
+ }
+ } else {
+ if (!TextUtils.equals(r.plugin, plugin)) {
+ continue;
+ }
}
- } else {
- if (!TextUtils.equals(r.plugin, plugin)) {
- continue;
+ if (!isBinderAlive(r)) {
+ return null;
}
+ if (!r.binder.pingBinder()) {
+ return null;
+ }
+ info.pid = r.pid;
+ info.index = r.index;
+ return r.client;
}
- if (!isBinderAlive(r)) {
- return null;
- }
- if (!r.binder.pingBinder()) {
- return null;
- }
- info.pid = r.pid;
- info.index = r.index;
- return r.client;
+ return null;
}
- }
- return null;
+ });
}
/**
@@ -518,48 +528,54 @@ private static String getProcessStringByIndex(int index) {
* @param info
* @return
*/
- static final IPluginClient probePluginClientByPid(int pid, PluginBinderInfo info) {
- synchronized (PROCESSES) {
- for (ProcessClientRecord r : ALL.values()) {
- if (r.pid != pid) {
- continue;
- }
- if (!isBinderAlive(r)) {
- return null;
- }
- if (!r.binder.pingBinder()) {
- return null;
+ static final IPluginClient probePluginClientByPid(final int pid, final PluginBinderInfo info) {
+ return readProcessClientLock(new Action() {
+ @Override
+ public IPluginClient call() {
+ for (ProcessClientRecord r : ALL.values()) {
+ if (r.pid != pid) {
+ continue;
+ }
+ if (!isBinderAlive(r)) {
+ return null;
+ }
+ if (!r.binder.pingBinder()) {
+ return null;
+ }
+ info.pid = r.pid;
+ info.index = r.index;
+ return r.client;
}
- info.pid = r.pid;
- info.index = r.index;
- return r.client;
+ return null;
}
- }
- return null;
+ });
}
/**
* @param target
* @param intent
*/
- static final void sendIntent2Process(String target, Intent intent, boolean sync) {
- Map map = new HashMap<>();
- synchronized (PROCESSES) {
- for (ProcessClientRecord r : ALL.values()) {
- if (target == null || target.length() <= 0) {
- // 所有
- } else if (TextUtils.equals(r.name, target)) {
- // 特定目标
- } else {
- continue;
- }
- if (!isBinderAlive(r)) {
- continue;
+ static final void sendIntent2Process(final String target, Intent intent, boolean sync) {
+ final Map map = readProcessClientLock(new Action
[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/Qihoo360/RePlugin/blob/master/LICENSE)
-[![Release Version](https://img.shields.io/badge/release-2.3.0-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)
+[![Release Version](https://img.shields.io/badge/release-2.3.1-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)
## 活动通知
移动技术最新活动通知:9月1号360移动技术开放日 http://t.cn/RDiNru9
diff --git a/README_CN.md b/README_CN.md
index 2e18c4d3..85b84bc4 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -6,7 +6,7 @@
[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/Qihoo360/RePlugin/blob/master/LICENSE)
-[![Release Version](https://img.shields.io/badge/release-2.3.0-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)
+[![Release Version](https://img.shields.io/badge/release-2.3.1-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 00000000..0f37f936
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+export RP_BASE_DIR=$(cd "$(dirname "$0")"; pwd)
+
+export TARGET_PROJECTS=(
+replugin-host-gradle
+replugin-host-library
+replugin-plugin-gradle
+replugin-plugin-library
+)
+
+__gradle_exec(){ if [[ -x gradlew ]];then ./gradlew ${@}; else gradle ${@}; fi; }
+
+__rp_deploy_project(){
+ [[ ! -d ${1} ]] && echo ">>> INVALID ${1}!!! <<<" && return
+ # execute deploying
+ echo ">>> ${1} <<<" && __gradle_exec -p ${1} clean bintrayUpload
+ # revert changed files
+ git checkout ${1}
+}
+
+rp_deploy(){
+ local current=`pwd` && cd ${RP_BASE_DIR}
+ # saving all changes: git stash save "saving stash for deploying!!!"
+ # deploy
+ for p in ${TARGET_PROJECTS}; do __rp_deploy_project ${RP_BASE_DIR}/${p}; done
+ # revert local changes: git revert --hard HEAD; git stash pop
+ local current=`pwd`
+}
+
+rp_test(){
+ local projects=(
+ # replugin-sample/host/app
+ replugin-sample/host
+ # replugin-sample/plugin/plugin-demo1/app
+ replugin-sample/plugin/plugin-demo1
+ # replugin-sample/plugin/plugin-demo2/app
+ replugin-sample/plugin/plugin-demo2
+ # replugin-sample/plugin/plugin-demo3-kotlin/app
+ replugin-sample/plugin/plugin-demo3-kotlin
+ # replugin-sample/plugin/plugin-webview/app
+ replugin-sample/plugin/plugin-webview
+ # replugin-sample-extra/fresco/FrescoHost/app
+ replugin-sample-extra/fresco/FrescoHost
+ # replugin-sample-extra/fresco/FrescoPlugin/app
+ replugin-sample-extra/fresco/FrescoPlugin
+ )
+ local log=${RP_BASE_DIR}/build/rp_test.log && [[ -f $log ]] && rm -f $log
+ local current=`pwd`
+ for p in ${projects}; do
+ echo -e ">>> BUILDING ${p}"
+ p=${RP_BASE_DIR}/${p} && __gradle_exec -p ${p} clean asDebug 2>/dev/null >> ${log} && echo "SUCCEED";
+ ls -l ${p}/app/build/outputs/apk
+ done
+ cd ${current}
+}
+
+# grep --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,build,.gradle} -inr '2\.3\.0' .
\ No newline at end of file
diff --git a/replugin-host-gradle/build.gradle b/replugin-host-gradle/build.gradle
index d698fbc2..6f08f2e8 100644
--- a/replugin-host-gradle/build.gradle
+++ b/replugin-host-gradle/build.gradle
@@ -30,6 +30,7 @@ buildscript {
jcenter()
mavenCentral()
}
+
dependencies {
// classpath 'com.android.tools.build:gradle:2.1.0'
// 将项目发布到JCenter 所需要的jar 添加依赖
@@ -38,14 +39,6 @@ buildscript {
}
}
-group = 'com.qihoo360.replugin' // 组名
-String classPath = ".src.main.groovy.com.qihoo360.replugin.gradle.host.AppConstant".replace(".", java.io.File.separator)
-String verPath = "${project.projectDir}" + classPath + ".groovy"
-String verLine = new File(verPath).filterLine { it =~ /def static final VER =/ }
-version = "${verLine.split("\"")[1]}" // 版本
-//红色醒目打印显示版本号
-java.lang.System.err.println "version=${version}"
-
dependencies {
compile 'com.android.tools.build:gradle:2.1.3'
compile 'org.json:json:20160212'
@@ -57,60 +50,7 @@ dependencies {
compile 'com.google.gradle:osdetector-gradle-plugin:1.2.1'
compile 'net.dongliu:apk-parser:2.2.0'
-
-}
-
-
-
-if (project.hasProperty("android")) { // Android libraries
- task sourcesJar(type: Jar) {
- classifier = 'sources'
- from android.sourceSets.main.java.srcDirs
- }
-
- task javadoc(type: Javadoc) {
- source = android.sourceSets.main.java.srcDirs
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
- }
-} else { // Java libraries
- task sourcesJar(type: Jar, dependsOn: classes) {
- classifier = 'sources'
- from sourceSets.main.allSource
- }
-}
-
-// 强制 Java/JavaDoc 等的编码为 UTF-8
-tasks.withType(JavaCompile) {
- options.encoding = "UTF-8"
}
-task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from javadoc.destinationDir
-}
-
-
-
-// add javadoc/source jar tasks as artifacts
-artifacts {
- archives sourcesJar, javadocJar
-}
-
-publishing {
- publications {
- mavenJava(MavenPublication) {
- if (plugins.hasPlugin('war')) {
- from components.web
- } else {
- from components.java
- }
-
- artifact sourcesJar
- artifact javadocJar
- }
- }
-}
-
-apply from: 'bintray.gradle'
-
-
+project.ext.RP_ARTIFACT_ID = 'replugin-host-gradle'
+apply from: '../rp-publish.gradle'
\ No newline at end of file
diff --git a/replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy b/replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy
index d0c1dada..a671b1af 100644
--- a/replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy
+++ b/replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy
@@ -23,7 +23,7 @@ package com.qihoo360.replugin.gradle.host
class AppConstant {
/** 版本号 */
- def static final VER = "2.3.0"
+ def static final VER = "${RP_VERSION}"
/** 打印信息时候的前缀 */
def static final TAG = "< replugin-host-v${VER} >"
diff --git a/replugin-host-library/replugin-host-lib/build.gradle b/replugin-host-library/replugin-host-lib/build.gradle
index fbfa6db4..1280694a 100644
--- a/replugin-host-library/replugin-host-lib/build.gradle
+++ b/replugin-host-library/replugin-host-lib/build.gradle
@@ -19,11 +19,6 @@
*/
apply plugin: 'com.android.library'
-
-version = "2.3.0"
-
-group = 'com.qihoo360.replugin' // 组名
-
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
@@ -54,4 +49,5 @@ dependencies {
provided 'com.android.support:support-v4:25.2.0'
}
-apply from: 'bintray.gradle'
+project.ext.RP_ARTIFACT_ID = 'replugin-host-lib'
+apply from: '../../rp-publish.gradle'
diff --git a/replugin-plugin-gradle/build.gradle b/replugin-plugin-gradle/build.gradle
index fd50c208..7b3321cb 100644
--- a/replugin-plugin-gradle/build.gradle
+++ b/replugin-plugin-gradle/build.gradle
@@ -112,4 +112,5 @@ publishing {
}
}
-apply from: 'bintray.gradle'
\ No newline at end of file
+project.ext.RP_ARTIFACT_ID = 'replugin-plugin-gradle'
+apply from: '../rp-publish.gradle'
\ No newline at end of file
diff --git a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/AppConstant.groovy b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/AppConstant.groovy
index 01d38ae7..7e87db05 100644
--- a/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/AppConstant.groovy
+++ b/replugin-plugin-gradle/src/main/groovy/com/qihoo360/replugin/gradle/plugin/AppConstant.groovy
@@ -23,8 +23,7 @@ package com.qihoo360.replugin.gradle.plugin
class AppConstant {
/** 版本号 */
- def static final VER = "2.3.0"
-
+ def static final VER = "${RP_VERSION}"
/** 打印信息时候的前缀 */
def static final TAG = "< replugin-plugin-v${VER} >"
diff --git a/replugin-plugin-library/replugin-plugin-lib/build.gradle b/replugin-plugin-library/replugin-plugin-lib/build.gradle
index 93a9f6c5..8adbbf94 100644
--- a/replugin-plugin-library/replugin-plugin-lib/build.gradle
+++ b/replugin-plugin-library/replugin-plugin-lib/build.gradle
@@ -16,9 +16,6 @@
apply plugin: 'com.android.library'
-version = "2.3.0"
-group = 'com.qihoo360.replugin' // 组名
-
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
@@ -46,4 +43,6 @@ dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
provided 'com.android.support:appcompat-v7:23.4.0'
}
-apply from: 'bintray.gradle'
\ No newline at end of file
+
+project.ext.RP_ARTIFACT_ID = 'replugin-plugin-lib'
+apply from: '../../rp-publish.gradle'
\ No newline at end of file
diff --git a/replugin-sample-extra/fresco/FrescoHost/app/build.gradle b/replugin-sample-extra/fresco/FrescoHost/app/build.gradle
index 7a5bdf3e..e6427bc2 100644
--- a/replugin-sample-extra/fresco/FrescoHost/app/build.gradle
+++ b/replugin-sample-extra/fresco/FrescoHost/app/build.gradle
@@ -45,7 +45,7 @@ repluginHostConfig {
}
dependencies {
- compile 'com.qihoo360.replugin:replugin-host-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-host-lib:${RP_VERSION}"
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
diff --git a/replugin-sample-extra/fresco/FrescoHost/build.gradle b/replugin-sample-extra/fresco/FrescoHost/build.gradle
index dce24ee7..3b9afc07 100644
--- a/replugin-sample-extra/fresco/FrescoHost/build.gradle
+++ b/replugin-sample-extra/fresco/FrescoHost/build.gradle
@@ -1,13 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
- classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-host-gradle:${RP_VERSION}"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
diff --git a/replugin-sample-extra/fresco/FrescoHost/gradlew b/replugin-sample-extra/fresco/FrescoHost/gradlew
old mode 100644
new mode 100755
diff --git a/replugin-sample-extra/fresco/FrescoPlugin/app/build.gradle b/replugin-sample-extra/fresco/FrescoPlugin/app/build.gradle
index 5a3b109d..a2d017d6 100644
--- a/replugin-sample-extra/fresco/FrescoPlugin/app/build.gradle
+++ b/replugin-sample-extra/fresco/FrescoPlugin/app/build.gradle
@@ -29,7 +29,7 @@ android {
apply plugin: 'replugin-plugin-gradle'
dependencies {
- compile 'com.qihoo360.replugin:replugin-plugin-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-plugin-lib:${RP_VERSION}"
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
diff --git a/replugin-sample-extra/fresco/FrescoPlugin/build.gradle b/replugin-sample-extra/fresco/FrescoPlugin/build.gradle
index 30b1ed98..93474514 100644
--- a/replugin-sample-extra/fresco/FrescoPlugin/build.gradle
+++ b/replugin-sample-extra/fresco/FrescoPlugin/build.gradle
@@ -1,13 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
- classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-plugin-gradle:${RP_VERSION}"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/replugin-sample-extra/fresco/FrescoPlugin/gradlew b/replugin-sample-extra/fresco/FrescoPlugin/gradlew
old mode 100644
new mode 100755
diff --git a/replugin-sample/host/app/build.gradle b/replugin-sample/host/app/build.gradle
index e32f9df0..6b97f1d8 100644
--- a/replugin-sample/host/app/build.gradle
+++ b/replugin-sample/host/app/build.gradle
@@ -45,5 +45,5 @@ repluginHostConfig {
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.qihoo360.replugin:replugin-host-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-host-lib:${RP_VERSION}"
}
diff --git a/replugin-sample/host/build.gradle b/replugin-sample/host/build.gradle
index 25113a2c..b879ef4c 100644
--- a/replugin-sample/host/build.gradle
+++ b/replugin-sample/host/build.gradle
@@ -14,13 +14,14 @@
* the License.
*/
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
- classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-host-gradle:${RP_VERSION}"
}
}
diff --git a/replugin-sample/plugin/plugin-demo1/app/build.gradle b/replugin-sample/plugin/plugin-demo1/app/build.gradle
index 2110a51e..9b987064 100644
--- a/replugin-sample/plugin/plugin-demo1/app/build.gradle
+++ b/replugin-sample/plugin/plugin-demo1/app/build.gradle
@@ -66,7 +66,7 @@ repluginPluginConfig {
}
dependencies {
- compile 'com.qihoo360.replugin:replugin-plugin-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-plugin-lib:${RP_VERSION}"
provided files('libs/fragment.jar')//这个jar就是从Support-fragment中提取出来的并非特制包目的是为了骗过编译期
provided files('libs/common-utils-lib-1.0.0.jar')//这个jar就是从Host的utils中编译生成的,其目的是为了骗过编译期
compile(name: 'plugin-library', ext: 'aar')//sample:compile aar
diff --git a/replugin-sample/plugin/plugin-demo1/build.gradle b/replugin-sample/plugin/plugin-demo1/build.gradle
index 4b276bf9..8f2deea3 100644
--- a/replugin-sample/plugin/plugin-demo1/build.gradle
+++ b/replugin-sample/plugin/plugin-demo1/build.gradle
@@ -14,13 +14,14 @@
* the License.
*/
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
- classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-plugin-gradle:${RP_VERSION}"
}
}
diff --git a/replugin-sample/plugin/plugin-demo2/app/build.gradle b/replugin-sample/plugin/plugin-demo2/app/build.gradle
index 78a9c6b1..00560a3d 100644
--- a/replugin-sample/plugin/plugin-demo2/app/build.gradle
+++ b/replugin-sample/plugin/plugin-demo2/app/build.gradle
@@ -66,7 +66,7 @@ repluginPluginConfig {
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.qihoo360.replugin:replugin-plugin-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-plugin-lib:${RP_VERSION}"
}
if (android.defaultConfig.multiDexEnabled) {
diff --git a/replugin-sample/plugin/plugin-demo2/build.gradle b/replugin-sample/plugin/plugin-demo2/build.gradle
index 4b276bf9..8f2deea3 100644
--- a/replugin-sample/plugin/plugin-demo2/build.gradle
+++ b/replugin-sample/plugin/plugin-demo2/build.gradle
@@ -14,13 +14,14 @@
* the License.
*/
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
- classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-plugin-gradle:${RP_VERSION}"
}
}
diff --git a/replugin-sample/plugin/plugin-demo3-kotlin/app/build.gradle b/replugin-sample/plugin/plugin-demo3-kotlin/app/build.gradle
index fe18624f..09562afe 100644
--- a/replugin-sample/plugin/plugin-demo3-kotlin/app/build.gradle
+++ b/replugin-sample/plugin/plugin-demo3-kotlin/app/build.gradle
@@ -54,7 +54,7 @@ android {
dependencies {
- compile 'com.qihoo360.replugin:replugin-plugin-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-plugin-lib:${RP_VERSION}"
provided files('libs/fragment.jar')
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
//这个jar就是从Support-fragment中提取出来的并非特制包目的是为了骗过编译期
diff --git a/replugin-sample/plugin/plugin-demo3-kotlin/build.gradle b/replugin-sample/plugin/plugin-demo3-kotlin/build.gradle
index c18c077b..8538d4e4 100644
--- a/replugin-sample/plugin/plugin-demo3-kotlin/build.gradle
+++ b/replugin-sample/plugin/plugin-demo3-kotlin/build.gradle
@@ -14,6 +14,7 @@
* the License.
*/
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
ext.kotlin_version = '1.1.3'
repositories {
mavenLocal()
@@ -21,7 +22,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
- classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-plugin-gradle:${RP_VERSION}"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
diff --git a/replugin-sample/plugin/plugin-webview/app/build.gradle b/replugin-sample/plugin/plugin-webview/app/build.gradle
index ff7c89e5..3528d971 100644
--- a/replugin-sample/plugin/plugin-webview/app/build.gradle
+++ b/replugin-sample/plugin/plugin-webview/app/build.gradle
@@ -62,5 +62,5 @@ repluginPluginConfig {
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.qihoo360.replugin:replugin-plugin-lib:2.3.0'
+ compile "com.qihoo360.replugin:replugin-plugin-lib:${RP_VERSION}"
}
\ No newline at end of file
diff --git a/replugin-sample/plugin/plugin-webview/build.gradle b/replugin-sample/plugin/plugin-webview/build.gradle
index 4b276bf9..8f2deea3 100644
--- a/replugin-sample/plugin/plugin-webview/build.gradle
+++ b/replugin-sample/plugin/plugin-webview/build.gradle
@@ -14,13 +14,14 @@
* the License.
*/
buildscript {
+ { p, cfg = "rp-config.gradle" -> if (new File(p, cfg).exists()) apply from: "${p}/${cfg}" else if (p.exists()) call(p.parentFile) }(buildscript.sourceFile.parentFile)
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
- classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.0'
+ classpath "com.qihoo360.replugin:replugin-plugin-gradle:${RP_VERSION}"
}
}
diff --git a/replugin-sample/plugin/plugin-webview/gradle/wrapper/gradle-wrapper.jar b/replugin-sample/plugin/plugin-webview/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659
GIT binary patch
literal 53636
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 |