From ad7bced13e8c19c6f8648e5baf5beed66f9d1961 Mon Sep 17 00:00:00 2001 From: tyrionchen Date: Thu, 30 Aug 2018 17:03:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[so=E5=8D=87=E7=BA=A7=E4=BC=98=E5=8C=96]=20?= =?UTF-8?q?1.=E6=94=AF=E6=8C=81=E5=8A=A0=E8=BD=BD=E5=92=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=96=B0=E5=A2=9Eso(VbyteP2PModule.loadSo/VbyteP2PMod?= =?UTF-8?q?ule.checkUpdate)=202.=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87libeve?= =?UTF-8?q?nt=E4=BA=8B=E4=BB=B6=E5=9B=9E=E8=B0=83=E5=88=B0Java=E5=B1=82?= =?UTF-8?q?=E6=9B=B4=E6=96=B0so?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/vbyte/p2p/LiveController.java | 6 ++ .../java/cn/vbyte/p2p/VbyteP2PModule.java | 89 ++++++++++++++----- .../com/vbyte/update/DynamicLibManager.java | 63 ++++++++----- 3 files changed, 115 insertions(+), 43 deletions(-) diff --git a/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java b/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java index 35052b5..2f4db6a 100644 --- a/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java +++ b/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java @@ -49,6 +49,7 @@ public static class Event { public static final int STATISTICS = 10010006; public static final int WANT_IMEI = 10010007; + public static final int ON_CHECK_PCDN_SO_UPGRADE = 10010008; } public static class Error { @@ -240,6 +241,11 @@ protected void onLocalEvent(int code, String msg) { case Event.WANT_IMEI: VbyteP2PModule.getInstance().setImei(); break; + + case Event.ON_CHECK_PCDN_SO_UPGRADE: + VbyteP2PModule.getInstance().onCheckPcdnSoUpgrade(msg); + break; + } } diff --git a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java index ef606cb..83521be 100644 --- a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java +++ b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java @@ -6,13 +6,10 @@ import android.os.Message; import android.os.Handler; import android.telephony.TelephonyManager; -import android.util.Log; +import android.text.TextUtils; import java.lang.ref.WeakReference; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -22,7 +19,18 @@ * Created by passion on 15-11-5. */ public final class VbyteP2PModule { - private static final String DYNAMIC_LIB_NAME = "libp2pmodule"; + private static final String LIB_P2PMODULE_SO = "libp2pmodule"; + private static final String LIB_PCDN_SDK_SO = "libPcdnSdk"; + + /** + * libp2pmodule的jni接口版本 + */ + private final String P2PMODULE_JNI_VERSION = "v3"; + + /** + * 无JNI接口的JNI版(这是检查so升级必须的参数) + */ + public final String OTHTER_JNI_VERSION = "v0"; public static class Event { /** @@ -159,8 +167,8 @@ public static VbyteP2PModule getInstance() { } /** - * 获取native应用的版本号 - * @return P2PModule SDK的版本号 + * 获取p2p-sdk so库的版本号 + * @return p2p-sdk so库的版本号 */ public static String getVersion() { if (SDK_VERSION == null) { @@ -182,7 +190,7 @@ private static boolean isArchValid(String arch) { * 返回5种架构中的一个获取null */ public static String getArchABI() { - if(archCpuAbi.isEmpty()) { + if(TextUtils.isEmpty(archCpuAbi)) { archCpuAbi = VbyteP2PModule._targetArchABI(); } return isArchValid(archCpuAbi) ? archCpuAbi : ""; @@ -247,27 +255,42 @@ public static void setLoggerCallback(LoggerCallback logger) { private long _pointer; private WeakReference _context; - private VbyteP2PModule(Context context, String appId, String appKey, String appSecretKey) - throws Exception { - if (context == null || appId == null || appKey == null || appSecretKey == null) { - throw new NullPointerException("context or appId or appKey or appSecretKey can't be null when init p2p live stream!"); + /** + * 加载so + * @param context + * @param soNameWithoutSuffix so名称(不带后缀) + * @param jniVersion JNI版本(目前仅p2p的so才有jni接口),若该值为空则默认为 OTHTER_JNI_VERSION = 'v0' + */ + public void loadSo(Context context, String soNameWithoutSuffix, String jniVersion) { + + if (TextUtils.isEmpty(soNameWithoutSuffix)) { + return; } - System.loadLibrary("stun"); - System.loadLibrary("event"); + if (dynamicLibManager == null) { + dynamicLibManager = new DynamicLibManager(context); + } + + if (TextUtils.isEmpty(jniVersion)) { + jniVersion = OTHTER_JNI_VERSION; + } + + dynamicLibManager.ensureLibDir(jniVersion); + + doLoadSo(soNameWithoutSuffix); + } + + private void doLoadSo(String soNameWithoutSuffix) { /** * * 能从jni里面获取到arch, 就进行下面的升级、加载,否则加载lib/ 下的libp2pmodule * android.os.Build.CPU_ABI、android.os.Build.SUPPORT_ABIS不靠谱,很多机型获取不到,不能用这个。因此,不用这个获取。 * archCpuAbi再次验证一下 */ - String soFilePath = null; - dynamicLibManager = new DynamicLibManager(context); - try { //这里加一个check libp2pmodule文件的md5值,因为应用目录/files目录下 很可能被别的应用扫描到给破坏了就load错误了 - soFilePath = dynamicLibManager.locate(DYNAMIC_LIB_NAME); + soFilePath = dynamicLibManager.locate(soNameWithoutSuffix); } catch (Exception e) { // 因获取不到程序版本号而导致的自动升级失败,默认使用安装时自带的 } @@ -276,11 +299,32 @@ private VbyteP2PModule(Context context, String appId, String appKey, String appS } else { System.load(soFilePath); } + } - if(!getArchABI().isEmpty()) { + private void checkUpdate(String soNameWithoutSuffix, String nativeVersion, String jniVersion) { + if(!TextUtils.isEmpty(getArchABI())) { //得到了arch, 开始check升级用false即可 - dynamicLibManager.checkUpdateV2(false, "libp2pmodule_" + VbyteP2PModule.getVersion() + "_20170928.so", getArchABI()); + dynamicLibManager.checkUpdateV2(false, soNameWithoutSuffix, nativeVersion, jniVersion, getArchABI()); } + } + + private VbyteP2PModule(Context context, String appId, String appKey, String appSecretKey) + throws Exception { + if (context == null || appId == null || appKey == null || appSecretKey == null) { + throw new NullPointerException("context or appId or appKey or appSecretKey can't be null when init p2p live stream!"); + } + + System.loadLibrary("stun"); + System.loadLibrary("event"); + + //加载 libp2pmodule.so + loadSo(context, LIB_P2PMODULE_SO, P2PMODULE_JNI_VERSION); + + //检查升级 libp2pmodule.so + checkUpdate(LIB_P2PMODULE_SO, VbyteP2PModule.getVersion(), P2PMODULE_JNI_VERSION); + + //libPcdnSdk.so加载(检查的动作在pcdn开启之后才进行,检查的动作从c++层触发) + loadSo(context, LIB_PCDN_SDK_SO, OTHTER_JNI_VERSION); _pointer = this._construct(); if (_pointer == 0) { @@ -383,6 +427,11 @@ public void setImei() { } } + + public void onCheckPcdnSoUpgrade(String soVersion) { + checkUpdate(LIB_PCDN_SDK_SO, soVersion, OTHTER_JNI_VERSION); + } + /** * @return 成功返回@param id 对应的controller对象,没有返回null */ diff --git a/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java b/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java index 11ab266..e6fbd15 100644 --- a/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java +++ b/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java @@ -4,6 +4,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.text.TextUtils; +import android.util.Log; import org.json.JSONObject; import java.io.BufferedInputStream; @@ -31,22 +32,18 @@ public class DynamicLibManager { private String libDirPath; private String currentLibDirPath; - //jni接口版本 - private String jniVersion = "v3"; //非https要下载的so - private String[] soNameArr = new String[]{"libp2pmodule", "libstun", "libevent"}; + private String[] soNameArr = new String[]{"libp2pmodule", "libstun", "libevent", "libPcdnSdk"}; private boolean supportHttps = false; //https情况下要下载的so private String[] soNameArrSupportHttps = new String[]{"libp2pmodule", "libstun", "libevent", "libevent_openssl", "libcrypto", "libssl"}; private static String archCpuAbi = ""; - /** - * cpuArch为传进来的,让这个类可以不依赖外面的类,cpuArch为 armeabi、armeabi-v7a、armeabi-v8a、x86、x86_64中的一个 - * @param context - */ - public DynamicLibManager(Context context) { - this.context = context; - libDirPath = this.context.getFilesDir().getAbsolutePath() + File.separator + "vlib"; + public void ensureLibDir(String jniVersion) { + + if (!TextUtils.isEmpty(currentLibDirPath)) { + return; + } StringBuilder tmpCurrentLibDirPath = new StringBuilder(); tmpCurrentLibDirPath.append(context.getFilesDir().getAbsolutePath()) @@ -121,6 +118,16 @@ public boolean accept(File file) { } } + + /** + * cpuArch为传进来的,让这个类可以不依赖外面的类,cpuArch为 armeabi、armeabi-v7a、armeabi-v8a、x86、x86_64中的一个 + * @param context + */ + public DynamicLibManager(Context context) { + this.context = context; + libDirPath = this.context.getFilesDir().getAbsolutePath() + File.separator + "vlib"; + } + public boolean isSoReady() { //如果ready存在, files/vlib/当前jniVersion/当前armeabi/ready 那么hasAllJniSo = true File currentLibDir = new File(currentLibDirPath); @@ -134,8 +141,19 @@ public boolean isSoReady() { } } - //第一次升级, true "", 第二次只检查libp2pmodule的升级 - public void checkUpdateV2(final boolean firstDownload, final String soName, final String arch) { + /** + * 检查升级,目前在两种场景下使用 + * 1.南瓜首次运行下载所有的so.(南瓜对size有要求) + * 2.p2p-sdk的so升级 + * @param downloadAllSo true 下载所有的so + * false 升级soNameWithoutSubffix指定的so + * @param soNameWithoutSuffix 不带后缀名的so名称 + * @param nativeVersion so的版本 + * @param jniVersion JNI接口版本,当前仅对libp2pmodule这个so有效(只有它有jni接口) + * @param arch 架构名称,例如armeabi|armeabi-v7a|arm64-v8a|x86|x86_64 + */ + public void checkUpdateV2(final boolean downloadAllSo, final String soNameWithoutSuffix, final String nativeVersion, final String jniVersion, final String arch) { + /** * 只有第一次下载的情况下,currentPath没有 endWith /armeabi-v7a * 此时currentLibDirPath为 @@ -172,18 +190,18 @@ public void run() { sb.append("&supportHttps=true"); soNameArr = soNameArrSupportHttps; } - if (firstDownload) { + if (downloadAllSo) { sb.append("&fileId=").append(TextUtils.join(",", soNameArr)); } else { - String[] tmpArr = soName.split("_"); - if (tmpArr.length == 3) { - sb.append("&fileId=").append("libp2pmodule") - .append("&fifoVersion=").append(tmpArr[1]); - } else { + if (TextUtils.isEmpty(soNameWithoutSuffix) || TextUtils.isEmpty(nativeVersion)) { return; + } else { + sb.append("&fileId=").append(soNameWithoutSuffix) + .append("&fifoVersion=").append(nativeVersion); } } + URL url = new URL(sb.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); @@ -202,21 +220,20 @@ public void run() { if (jsonObj.has("downloadUrl")) { String[] downloadSoArr; - if (firstDownload) { + if (downloadAllSo) { downloadSoArr = soNameArr; } else { - downloadSoArr = new String[]{"libp2pmodule"}; + downloadSoArr = new String[]{soNameWithoutSuffix}; } Map soJsonMap = new HashMap<>(); JSONObject jsonObjDownload = jsonObj.getJSONObject("downloadUrl"); - for (String soName : downloadSoArr) { if (jsonObjDownload.has(soName)) { JSONObject jsonObjTmp = jsonObjDownload.getJSONObject(soName); - if (soName.equals("libp2pmodule")) { + if (soName.equals(soNameWithoutSuffix)) { //如果是libp2pmodule还检查jniVersion字段 if (jsonObjTmp.has("jniVersion") && !TextUtils.isEmpty(jsonObjTmp.getString("jniVersion")) @@ -249,7 +266,7 @@ public void run() { JSONObject jsonObject = entry.getValue(); writeReady = (writeReady && updateDynamicLib(entry.getKey(), jsonObject.getString("url"), jsonObject.getString("version"), jsonObject.getString("md5token"))); } - if (firstDownload && writeReady) { + if (downloadAllSo && writeReady) { //第一次下载且都下载成功创建文件标识符 new File(currentLibDirPath + File.separator + "ready").createNewFile(); } From bb664c1a09a3a79b49e1b425749f87838a7efbb8 Mon Sep 17 00:00:00 2001 From: tyrionchen Date: Sun, 9 Sep 2018 19:47:21 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[Bugfix]p2p=20so=E5=8D=87=E7=BA=A7=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E4=BB=A5=E5=90=8E=E5=8A=A0=E8=BD=BD=E6=96=B0so?= =?UTF-8?q?=E7=9A=84=E5=90=8C=E6=97=B6=E4=B9=9F=E4=BC=9A=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=97=A7=E7=9A=84so=20=E5=8E=9F=E5=9B=A0=EF=BC=9AVbyteP2PModul?= =?UTF-8?q?e.loadSo=E7=9A=84=E8=B0=83=E7=94=A8=E6=9C=89=E4=B8=A4=E5=A4=84?= =?UTF-8?q?=EF=BC=8C=E4=B8=80=E5=A4=84=E6=98=AF=E5=8A=A0=E8=BD=BDp2p=20so?= =?UTF-8?q?=EF=BC=8C=E4=B8=80=E5=A4=84=E6=98=AF=E5=8A=A0=E8=BD=BDpcdn=20so?= =?UTF-8?q?=E3=80=82p2p=20so=E4=B8=8B=E5=8F=91=E4=BB=A5=E5=90=8Epcdn=20so?= =?UTF-8?q?=EF=BC=88=E6=9C=AA=E6=9D=A5=E4=B8=8B=E5=8F=91=EF=BC=89=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=97=B6=E4=BC=9A=E5=8A=A0=E8=BD=BD=E8=A2=ABhardcode?= =?UTF-8?q?=E7=9A=84=E6=97=A7p2p=20so.=20=E5=A4=84=E7=90=86:=20=E5=B0=86ha?= =?UTF-8?q?rcode=E5=8A=A0=E8=BD=BDp2p=E7=9A=84=E4=BB=A3=E7=A0=81=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8A=A0=E8=BD=BD=E7=A7=81=E6=9C=89=E7=9B=AE=E5=BD=95?= =?UTF-8?q?so=E7=9A=84=E6=96=B9=E5=BC=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java index 83521be..82e2122 100644 --- a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java +++ b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java @@ -7,6 +7,7 @@ import android.os.Handler; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import java.lang.ref.WeakReference; import java.util.Arrays; @@ -295,7 +296,10 @@ private void doLoadSo(String soNameWithoutSuffix) { // 因获取不到程序版本号而导致的自动升级失败,默认使用安装时自带的 } if (soFilePath == null) { - System.loadLibrary("p2pmodule"); + if (soNameWithoutSuffix.startsWith("lib")) { + String libNameWithoutPreffix = soNameWithoutSuffix.substring(3); + System.loadLibrary(libNameWithoutPreffix); + } } else { System.load(soFilePath); } From c6e88ccbf74c86d986b3ef6f6d980de58be4f661 Mon Sep 17 00:00:00 2001 From: tyrionchen Date: Tue, 11 Sep 2018 16:20:13 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=8E=BB=E9=99=A4pcdn-sdk=20so=E7=9A=84?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=20=E5=8E=9F=E5=9B=A0=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E7=AE=80=E5=8C=96so=E5=8D=87=E7=BA=A7=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E5=B0=86PCDN-SDK=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=BA=93=E6=94=B9=E4=B8=BA=E9=9D=99=E6=80=81=E5=BA=93=E7=BC=96?= =?UTF-8?q?=E5=85=A5p2p=E7=9A=84so.=20=E5=A4=84=E7=90=86=EF=BC=9A=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E5=8A=A0=E8=BD=BDpcdn-sdk=20so=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/vbyte/p2p/LiveController.java | 6 ------ .../src/main/java/cn/vbyte/p2p/VbyteP2PModule.java | 9 --------- .../main/java/com/vbyte/update/DynamicLibManager.java | 2 +- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java b/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java index 2f4db6a..35052b5 100644 --- a/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java +++ b/libp2pimpl/src/main/java/cn/vbyte/p2p/LiveController.java @@ -49,7 +49,6 @@ public static class Event { public static final int STATISTICS = 10010006; public static final int WANT_IMEI = 10010007; - public static final int ON_CHECK_PCDN_SO_UPGRADE = 10010008; } public static class Error { @@ -241,11 +240,6 @@ protected void onLocalEvent(int code, String msg) { case Event.WANT_IMEI: VbyteP2PModule.getInstance().setImei(); break; - - case Event.ON_CHECK_PCDN_SO_UPGRADE: - VbyteP2PModule.getInstance().onCheckPcdnSoUpgrade(msg); - break; - } } diff --git a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java index 82e2122..7cafb2a 100644 --- a/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java +++ b/libp2pimpl/src/main/java/cn/vbyte/p2p/VbyteP2PModule.java @@ -21,7 +21,6 @@ */ public final class VbyteP2PModule { private static final String LIB_P2PMODULE_SO = "libp2pmodule"; - private static final String LIB_PCDN_SDK_SO = "libPcdnSdk"; /** * libp2pmodule的jni接口版本 @@ -327,9 +326,6 @@ private VbyteP2PModule(Context context, String appId, String appKey, String appS //检查升级 libp2pmodule.so checkUpdate(LIB_P2PMODULE_SO, VbyteP2PModule.getVersion(), P2PMODULE_JNI_VERSION); - //libPcdnSdk.so加载(检查的动作在pcdn开启之后才进行,检查的动作从c++层触发) - loadSo(context, LIB_PCDN_SDK_SO, OTHTER_JNI_VERSION); - _pointer = this._construct(); if (_pointer == 0) { throw new RuntimeException("Can not init P2P"); @@ -431,11 +427,6 @@ public void setImei() { } } - - public void onCheckPcdnSoUpgrade(String soVersion) { - checkUpdate(LIB_PCDN_SDK_SO, soVersion, OTHTER_JNI_VERSION); - } - /** * @return 成功返回@param id 对应的controller对象,没有返回null */ diff --git a/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java b/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java index e6fbd15..334efee 100644 --- a/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java +++ b/libp2pimpl/src/main/java/com/vbyte/update/DynamicLibManager.java @@ -33,7 +33,7 @@ public class DynamicLibManager { private String currentLibDirPath; //非https要下载的so - private String[] soNameArr = new String[]{"libp2pmodule", "libstun", "libevent", "libPcdnSdk"}; + private String[] soNameArr = new String[]{"libp2pmodule", "libstun", "libevent"}; private boolean supportHttps = false; //https情况下要下载的so private String[] soNameArrSupportHttps = new String[]{"libp2pmodule", "libstun", "libevent", "libevent_openssl", "libcrypto", "libssl"};