Skip to content

Commit b07d0c9

Browse files
author
weiqiangliu
committed
Release 3.4.9
1 parent f1fc80e commit b07d0c9

File tree

10 files changed

+314
-38
lines changed

10 files changed

+314
-38
lines changed

plugin/ext.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
project.ext {
2-
pluginVersion = '3.4.8'
2+
pluginVersion = '3.4.9'
33
Properties properties = new Properties()
44
if (project.file('local.properties').exists()) {
55
properties.load(project.file('local.properties').newDataInputStream())

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/ClassNameAnalytics.groovy

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package com.sensorsdata.analytics.android.plugin
1818

19+
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper
20+
1921
class ClassNameAnalytics {
2022
private static final String PACKAGE_START = "com.sensorsdata.analytics"
2123
private static final String KEY_KEYBOARD = "KeyboardViewUtil"
@@ -24,6 +26,7 @@ class ClassNameAnalytics {
2426
boolean isSensorsDataAPI = false
2527
boolean isSensorsDataUtils = false
2628
boolean isOAIDHelper = false
29+
boolean isSensorsDataVersion = false
2730
boolean isSALog = false
2831
boolean isKeyboardViewUtil = false
2932
def methodCells = new ArrayList<SensorsAnalyticsMethodCell>()
@@ -38,10 +41,11 @@ class ClassNameAnalytics {
3841
isAppWebViewInterface = ((className == 'com.sensorsdata.analytics.android.sdk.AppWebViewInterface')
3942
|| (className == 'com.sensorsdata.analytics.android.sdk.visual.WebViewVisualInterface'))
4043
isKeyboardViewUtil = (className.startsWith(PACKAGE_START) && className.endsWith(KEY_KEYBOARD))
44+
isSensorsDataVersion = className.endsWith(SensorsDataSDKVersionHelper.VERSION_KEY_SENSORDATA_VERSION_CONFIG)
4145
}
4246

4347
boolean isSDKFile() {
44-
return isSALog || isSensorsDataAPI || isSensorsDataUtils || isAppWebViewInterface || isOAIDHelper || isKeyboardViewUtil
48+
return isSALog || isSensorsDataAPI || isSensorsDataUtils || isAppWebViewInterface || isOAIDHelper || isKeyboardViewUtil || isSensorsDataVersion
4549
}
4650

4751
boolean isLeanback() {

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsClassVisitor.groovy

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import com.sensorsdata.analytics.android.plugin.push.SensorsAnalyticsPushMethodV
2020
import com.sensorsdata.analytics.android.plugin.push.SensorsPushInjected
2121
import com.sensorsdata.analytics.android.plugin.hook.config.SensorsFragmentHookConfig
2222
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
23+
import com.sensorsdata.analytics.android.plugin.version.SensorsAnalyticsVersionFieldVisitor
24+
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper
2325
import org.objectweb.asm.AnnotationVisitor
2426
import org.objectweb.asm.ClassVisitor
2527
import org.objectweb.asm.FieldVisitor
@@ -50,16 +52,19 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
5052
// 是否是 AndroidTV 版本
5153
private boolean isAndroidTv
5254

55+
private SensorsDataSDKVersionHelper sdkVersionHelper;
56+
5357
@Override
5458
protected Object clone() throws CloneNotSupportedException {
5559
return super.clone()
5660
}
5761

58-
SensorsAnalyticsClassVisitor(final ClassVisitor classVisitor, ClassNameAnalytics classNameAnalytics, SensorsAnalyticsTransformHelper transformHelper) {
62+
SensorsAnalyticsClassVisitor(final ClassVisitor classVisitor, ClassNameAnalytics classNameAnalytics, SensorsAnalyticsTransformHelper transformHelper, SensorsDataSDKVersionHelper sdkVersionHelper) {
5963
super(SensorsAnalyticsUtil.ASM_VERSION, classVisitor)
6064
this.classVisitor = classVisitor
6165
this.classNameAnalytics = classNameAnalytics
6266
this.transformHelper = transformHelper
67+
this.sdkVersionHelper = sdkVersionHelper;
6368
isAndroidTv = VersionUtils.isTvVersion()
6469
}
6570

@@ -145,26 +150,11 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
145150

146151
@Override
147152
FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
148-
if (classNameAnalytics.isSensorsDataAPI) {
149-
if ('VERSION' == name) {
150-
String version = (String) value
151-
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.MIN_SDK_VERSION, version) > 0) {
152-
String errMessage = "你目前集成的神策埋点 SDK 版本号为 v${version},请升级到 v${SensorsAnalyticsTransform.MIN_SDK_VERSION} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android"
153-
Logger.error(errMessage)
154-
throw new Error(errMessage)
155-
}
156-
} else if ('MIN_PLUGIN_VERSION' == name) {
157-
String minPluginVersion = (String) value
158-
if (minPluginVersion != "" && minPluginVersion != null) {
159-
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.VERSION, minPluginVersion) < 0) {
160-
String errMessage = "你目前集成的神策插件版本号为 v${SensorsAnalyticsTransform.VERSION},请升级到 v${minPluginVersion} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android-plugin2"
161-
Logger.error(errMessage)
162-
throw new Error(errMessage)
163-
}
164-
}
165-
}
153+
FieldVisitor fieldVisitor = super.visitField(access, name, descriptor, signature, value)
154+
if (classNameAnalytics.isSensorsDataAPI || classNameAnalytics.isSensorsDataVersion) {
155+
return new SensorsAnalyticsVersionFieldVisitor(SensorsAnalyticsUtil.ASM_VERSION, fieldVisitor, name, value, sdkVersionHelper, mClassName, classNameAnalytics)
166156
}
167-
return super.visitField(access, name, descriptor, signature, value)
157+
return fieldVisitor
168158
}
169159

170160
/**

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsPlugin.groovy

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package com.sensorsdata.analytics.android.plugin
1818

1919
import com.android.build.gradle.AppExtension
20+
import com.android.build.gradle.BaseExtension
21+
import com.android.build.gradle.LibraryExtension
2022
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
2123
import org.gradle.api.Plugin
2224
import org.gradle.api.Project
@@ -38,13 +40,23 @@ class SensorsAnalyticsPlugin implements Plugin<Project> {
3840
boolean isAndroidTv = Boolean.parseBoolean(properties.getOrDefault("sensorsAnalytics.isAndroidTv", "false"))
3941

4042
if (!disableSensorsAnalyticsPlugin) {
41-
AppExtension appExtension = project.extensions.findByType(AppExtension.class)
42-
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, appExtension)
43-
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
44-
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
45-
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter
46-
VersionUtils.isAndroidTv = isAndroidTv
47-
appExtension.registerTransform(new SensorsAnalyticsTransform(transformHelper))
43+
BaseExtension baseExtension
44+
if (project.getPlugins().hasPlugin("com.android.application")) {
45+
baseExtension = project.extensions.findByType(AppExtension.class)
46+
} else if (project.getPlugins().hasPlugin("com.android.library")) {
47+
baseExtension = project.extensions.findByType(LibraryExtension.class)
48+
}
49+
if (null != baseExtension) {
50+
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, baseExtension)
51+
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
52+
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
53+
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter
54+
VersionUtils.isAndroidTv = isAndroidTv
55+
56+
baseExtension.registerTransform(new SensorsAnalyticsTransform(transformHelper, baseExtension instanceof LibraryExtension))
57+
} else {
58+
Logger.error("------------神策 plugin 当前不支持您的项目--------------")
59+
}
4860
} else {
4961
Logger.error("------------您已关闭了神策插件--------------")
5062
}

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsTransform.groovy

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.android.build.api.transform.TransformOutputProvider
3030
import com.android.build.gradle.internal.pipeline.TransformManager
3131
import com.android.ide.common.internal.WaitableExecutor
3232
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
33+
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper
3334
import groovy.io.FileType
3435
import org.apache.commons.codec.digest.DigestUtils
3536
import org.apache.commons.io.FileUtils
@@ -48,16 +49,20 @@ import java.util.jar.JarOutputStream
4849

4950
class SensorsAnalyticsTransform extends Transform {
5051
private SensorsAnalyticsTransformHelper transformHelper
51-
public static final String VERSION = "3.4.8"
52+
public static final String VERSION = "3.4.9"
5253
public static final String MIN_SDK_VERSION = "5.4.3"
5354
private WaitableExecutor waitableExecutor
5455
private URLClassLoader urlClassLoader
5556
// “com.sensorsdata.analytics.android.sdk.SensorsDataAPI” 类所在路径
5657
private String sensorsSdkJarPath
5758
private volatile boolean isFoundSDKJar = false
59+
private boolean isProjectLibrary = false
60+
private SensorsDataSDKVersionHelper sdkVersionHelper;
5861

59-
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper) {
62+
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper, boolean isProjectLibrary) {
6063
this.transformHelper = transformHelper
64+
this.isProjectLibrary = isProjectLibrary
65+
this.sdkVersionHelper = new SensorsDataSDKVersionHelper()
6166
if (!transformHelper.disableSensorsAnalyticsMultiThread) {
6267
waitableExecutor = WaitableExecutor.useGlobalSharedThreadPool()
6368
}
@@ -75,7 +80,7 @@ class SensorsAnalyticsTransform extends Transform {
7580

7681
@Override
7782
Set<QualifiedContent.Scope> getScopes() {
78-
return TransformManager.SCOPE_FULL_PROJECT
83+
return isProjectLibrary ? TransformManager.PROJECT_ONLY : TransformManager.SCOPE_FULL_PROJECT
7984
}
8085

8186
@Override
@@ -177,7 +182,9 @@ class SensorsAnalyticsTransform extends Transform {
177182
transformHelper.urlClassLoader = urlClassLoader
178183
checkRNState()
179184
VersionUtils.loadAndroidSDKVersion(urlClassLoader)
180-
checkSensorsSDK()
185+
if(!isProjectLibrary) {
186+
checkSensorsSDK()
187+
}
181188
}
182189

183190
private void checkSensorsSDK() {
@@ -424,7 +431,7 @@ class SensorsAnalyticsTransform extends Transform {
424431
private byte[] modifyClass(byte[] srcClass, ClassNameAnalytics classNameAnalytics) {
425432
try {
426433
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS)
427-
ClassVisitor classVisitor = new SensorsAnalyticsClassVisitor(classWriter, classNameAnalytics, transformHelper)
434+
ClassVisitor classVisitor = new SensorsAnalyticsClassVisitor(classWriter, classNameAnalytics, transformHelper, sdkVersionHelper)
428435
ClassReader cr = new ClassReader(srcClass)
429436
cr.accept(classVisitor, ClassReader.EXPAND_FRAMES)
430437
return classWriter.toByteArray()

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsTransformHelper.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
*/
1717
package com.sensorsdata.analytics.android.plugin
1818

19-
import com.android.build.gradle.AppExtension
19+
import com.android.build.gradle.BaseExtension
2020

2121
class SensorsAnalyticsTransformHelper {
2222

2323
SensorsAnalyticsExtension extension
24-
AppExtension android
24+
BaseExtension android
2525
RN_STATE rnState = RN_STATE.NOT_FOUND
2626
String rnVersion = ""
2727
SensorsAnalyticsSDKHookConfig sensorsAnalyticsHookConfig
@@ -68,7 +68,7 @@ class SensorsAnalyticsTransformHelper {
6868
'android.support.v7.widget.ActionMenuPresenter$OverflowMenuButton']
6969
URLClassLoader urlClassLoader
7070

71-
SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension, AppExtension android) {
71+
SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension, BaseExtension android) {
7272
this.extension = extension
7373
this.android = android
7474
}
@@ -126,7 +126,7 @@ class SensorsAnalyticsTransformHelper {
126126
}
127127
if (classNameAnalytics.methodCells.size() > 0 || classNameAnalytics.isSensorsDataAPI
128128
|| (classNameAnalytics.isAppWebViewInterface && (extension.addUCJavaScriptInterface || extension.addXWalkJavaScriptInterface))
129-
|| classNameAnalytics.isKeyboardViewUtil) {
129+
|| classNameAnalytics.isKeyboardViewUtil || classNameAnalytics.isSensorsDataVersion) {
130130
classNameAnalytics.isShouldModify = true
131131
}
132132
} else if (!classNameAnalytics.isAndroidGenerated()) {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.sensorsdata.analytics.android.plugin.utils;
2+
3+
public class TextUtil {
4+
public static boolean isEmpty(CharSequence str) {
5+
return str == null || str.length() == 0;
6+
}
7+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.sensorsdata.analytics.android.plugin.version;
2+
3+
import com.sensorsdata.analytics.android.plugin.ClassNameAnalytics;
4+
import com.sensorsdata.analytics.android.plugin.Logger;
5+
import com.sensorsdata.analytics.android.plugin.SensorsAnalyticsTransform;
6+
import com.sensorsdata.analytics.android.plugin.SensorsAnalyticsUtil;
7+
import com.sensorsdata.analytics.android.plugin.utils.TextUtil;
8+
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper;
9+
10+
import org.objectweb.asm.FieldVisitor;
11+
12+
public class SensorsAnalyticsVersionFieldVisitor extends FieldVisitor {
13+
private String mName, mClassName;
14+
private Object mValue;
15+
private SensorsDataSDKVersionHelper mSdkVersionHelper;
16+
private ClassNameAnalytics mClassNameAnalytics;
17+
18+
public SensorsAnalyticsVersionFieldVisitor(int api, FieldVisitor fieldVisitor, String name, Object value, SensorsDataSDKVersionHelper sdkVersionHelper, String className, ClassNameAnalytics classNameAnalytics) {
19+
super(api, fieldVisitor);
20+
this.mName = name;
21+
this.mValue = value;
22+
this.mSdkVersionHelper = sdkVersionHelper;
23+
this.mClassName = className;
24+
this.mClassNameAnalytics = classNameAnalytics;
25+
}
26+
27+
@Override
28+
public void visitEnd() {
29+
if (mClassNameAnalytics.getIsSensorsDataAPI()) {
30+
if ("VERSION".equals(mName)) {
31+
String version = (String) mValue;
32+
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.MIN_SDK_VERSION, version) > 0) {
33+
String errMessage = String.format("你目前集成的神策埋点 SDK 版本号为 v%s,请升级到 v%s 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android", version, SensorsAnalyticsTransform.MIN_SDK_VERSION);
34+
Logger.error(errMessage);
35+
throw new Error(errMessage);
36+
}
37+
String message = mSdkVersionHelper.getMessageBySDKCurrentVersion(mClassName, version);
38+
if (!TextUtil.isEmpty(message)) {
39+
throw new Error(message);
40+
}
41+
} else if ("MIN_PLUGIN_VERSION".equals(mName)) {
42+
String minPluginVersion = (String) mValue;
43+
if (!TextUtil.isEmpty(minPluginVersion)) {
44+
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.VERSION, minPluginVersion) < 0) {
45+
String errMessage = String.format("你目前集成的神策插件版本号为 v%s,请升级到 v%s 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android-plugin2", SensorsAnalyticsTransform.VERSION, minPluginVersion);
46+
Logger.error(errMessage);
47+
throw new Error(errMessage);
48+
}
49+
}
50+
}
51+
} else if (mClassNameAnalytics.getIsSensorsDataVersion()) {
52+
if (SensorsDataSDKVersionHelper.VERSION_KEY_CURRENT_VERSION.equals(mName)) {
53+
String version = (String) mValue;
54+
String message = mSdkVersionHelper.getMessageBySDKCurrentVersion(mClassName, version);
55+
if (!TextUtil.isEmpty(message)) {
56+
throw new Error(message);
57+
}
58+
} else if (SensorsDataSDKVersionHelper.VERSION_KEY_DEPENDENT_SDK_VERSION.equals(mName)) {
59+
String relatedOtherSDK = (String) mValue;
60+
String message = mSdkVersionHelper.getMessageBySDKRelyVersion(mClassName, relatedOtherSDK);
61+
if (!TextUtil.isEmpty(message)) {
62+
throw new Error(message);
63+
}
64+
}
65+
}
66+
super.visitEnd();
67+
}
68+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.sensorsdata.analytics.android.plugin.version;
2+
3+
import com.google.gson.JsonObject;
4+
import com.sensorsdata.analytics.android.plugin.utils.TextUtil;
5+
6+
7+
public class SensorsDataSDKVersionBean {
8+
/**
9+
* 当前 SDK 要求的最小版本(必须)
10+
*/
11+
private String mMinSensorsDataSDKVersion;
12+
/**
13+
* 其他业务 SDK 的版本信息路径,也就是 SensorDataVersionOptions 类的路径
14+
* 通过 SensorDataVersionOptions 类的路径匹配,当前依赖 SDK 的版本和已有的 SDK 的关系(每一个 SDK 唯一,用于匹配)
15+
* (必须)
16+
*/
17+
private String mSensorsDataSDKPath;
18+
/**
19+
* 版本不匹配时,提醒信息,可为 null
20+
*/
21+
private String mMessage;
22+
23+
public SensorsDataSDKVersionBean(String sensorsSDKPath, String minVersion, String message) {
24+
this.mSensorsDataSDKPath = sensorsSDKPath;
25+
this.mMinSensorsDataSDKVersion = minVersion;
26+
this.mMessage = message;
27+
}
28+
29+
public String getSensorsDataSDKPath() {
30+
return mSensorsDataSDKPath;
31+
}
32+
33+
public String getSensorsDataSDKVersionMessage(String version) {
34+
return !isVersionValid(version, mMinSensorsDataSDKVersion) ? String.format(TextUtil.isEmpty(mMessage) ? SensorsDataSDKVersionHelper.DEFAULT_MESSAGE : mMessage, version, mMinSensorsDataSDKVersion) : "";
35+
}
36+
37+
private boolean isVersionValid(String saVersion, String requiredVersion) {
38+
try {
39+
if (saVersion.equals(requiredVersion)) {
40+
return true;
41+
} else {
42+
String[] saVersions = saVersion.split("\\.");
43+
String[] requiredVersions = requiredVersion.split("\\.");
44+
for (int index = 0; index < requiredVersions.length; index++) {
45+
int saVersionsNum = Integer.parseInt(saVersions[index]);
46+
int requiredVersionsNum = Integer.parseInt(requiredVersions[index]);
47+
if (saVersionsNum != requiredVersionsNum) {
48+
return saVersionsNum > requiredVersionsNum;
49+
}
50+
}
51+
return false;
52+
}
53+
} catch (Exception ex) {
54+
// ignore
55+
return false;
56+
}
57+
}
58+
59+
public static SensorsDataSDKVersionBean createSensorDataSDKBean(JsonObject jsonObject) {
60+
if (null != jsonObject) {
61+
try {
62+
String path = jsonObject.get("SDK_VERSION_PATH").getAsString();
63+
String minVersion = jsonObject.get("DEPENDENT_MIN_SDK_VERSIONS").getAsString();
64+
if (!TextUtil.isEmpty(path) && !TextUtil.isEmpty(minVersion)) {
65+
if (path.contains(".")) {
66+
path = path.replaceAll("\\.", "/");
67+
}
68+
String message = jsonObject.get("ERROR_MESSAGE").getAsString();
69+
return new SensorsDataSDKVersionBean(path, minVersion, message);
70+
}
71+
} catch (Exception e) {
72+
// ignore
73+
}
74+
}
75+
return null;
76+
}
77+
78+
public String toString() {
79+
return "\tminSensorsDataSDKVersion=" + mMinSensorsDataSDKVersion + "\n" +
80+
"\tsensorsDataSDKPath=" + mSensorsDataSDKPath + "\n" +
81+
"\tmessage=" + mMessage;
82+
}
83+
84+
}

0 commit comments

Comments
 (0)