Skip to content

Commit

Permalink
Release 3.4.9
Browse files Browse the repository at this point in the history
  • Loading branch information
weiqiangliu committed May 13, 2022
1 parent f1fc80e commit b07d0c9
Show file tree
Hide file tree
Showing 10 changed files with 314 additions and 38 deletions.
2 changes: 1 addition & 1 deletion plugin/ext.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
project.ext {
pluginVersion = '3.4.8'
pluginVersion = '3.4.9'
Properties properties = new Properties()
if (project.file('local.properties').exists()) {
properties.load(project.file('local.properties').newDataInputStream())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
*/
package com.sensorsdata.analytics.android.plugin

import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper

class ClassNameAnalytics {
private static final String PACKAGE_START = "com.sensorsdata.analytics"
private static final String KEY_KEYBOARD = "KeyboardViewUtil"
Expand All @@ -24,6 +26,7 @@ class ClassNameAnalytics {
boolean isSensorsDataAPI = false
boolean isSensorsDataUtils = false
boolean isOAIDHelper = false
boolean isSensorsDataVersion = false
boolean isSALog = false
boolean isKeyboardViewUtil = false
def methodCells = new ArrayList<SensorsAnalyticsMethodCell>()
Expand All @@ -38,10 +41,11 @@ class ClassNameAnalytics {
isAppWebViewInterface = ((className == 'com.sensorsdata.analytics.android.sdk.AppWebViewInterface')
|| (className == 'com.sensorsdata.analytics.android.sdk.visual.WebViewVisualInterface'))
isKeyboardViewUtil = (className.startsWith(PACKAGE_START) && className.endsWith(KEY_KEYBOARD))
isSensorsDataVersion = className.endsWith(SensorsDataSDKVersionHelper.VERSION_KEY_SENSORDATA_VERSION_CONFIG)
}

boolean isSDKFile() {
return isSALog || isSensorsDataAPI || isSensorsDataUtils || isAppWebViewInterface || isOAIDHelper || isKeyboardViewUtil
return isSALog || isSensorsDataAPI || isSensorsDataUtils || isAppWebViewInterface || isOAIDHelper || isKeyboardViewUtil || isSensorsDataVersion
}

boolean isLeanback() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import com.sensorsdata.analytics.android.plugin.push.SensorsAnalyticsPushMethodV
import com.sensorsdata.analytics.android.plugin.push.SensorsPushInjected
import com.sensorsdata.analytics.android.plugin.hook.config.SensorsFragmentHookConfig
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
import com.sensorsdata.analytics.android.plugin.version.SensorsAnalyticsVersionFieldVisitor
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper
import org.objectweb.asm.AnnotationVisitor
import org.objectweb.asm.ClassVisitor
import org.objectweb.asm.FieldVisitor
Expand Down Expand Up @@ -50,16 +52,19 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
// 是否是 AndroidTV 版本
private boolean isAndroidTv

private SensorsDataSDKVersionHelper sdkVersionHelper;

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone()
}

SensorsAnalyticsClassVisitor(final ClassVisitor classVisitor, ClassNameAnalytics classNameAnalytics, SensorsAnalyticsTransformHelper transformHelper) {
SensorsAnalyticsClassVisitor(final ClassVisitor classVisitor, ClassNameAnalytics classNameAnalytics, SensorsAnalyticsTransformHelper transformHelper, SensorsDataSDKVersionHelper sdkVersionHelper) {
super(SensorsAnalyticsUtil.ASM_VERSION, classVisitor)
this.classVisitor = classVisitor
this.classNameAnalytics = classNameAnalytics
this.transformHelper = transformHelper
this.sdkVersionHelper = sdkVersionHelper;
isAndroidTv = VersionUtils.isTvVersion()
}

Expand Down Expand Up @@ -145,26 +150,11 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {

@Override
FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
if (classNameAnalytics.isSensorsDataAPI) {
if ('VERSION' == name) {
String version = (String) value
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.MIN_SDK_VERSION, version) > 0) {
String errMessage = "你目前集成的神策埋点 SDK 版本号为 v${version},请升级到 v${SensorsAnalyticsTransform.MIN_SDK_VERSION} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android"
Logger.error(errMessage)
throw new Error(errMessage)
}
} else if ('MIN_PLUGIN_VERSION' == name) {
String minPluginVersion = (String) value
if (minPluginVersion != "" && minPluginVersion != null) {
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.VERSION, minPluginVersion) < 0) {
String errMessage = "你目前集成的神策插件版本号为 v${SensorsAnalyticsTransform.VERSION},请升级到 v${minPluginVersion} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android-plugin2"
Logger.error(errMessage)
throw new Error(errMessage)
}
}
}
FieldVisitor fieldVisitor = super.visitField(access, name, descriptor, signature, value)
if (classNameAnalytics.isSensorsDataAPI || classNameAnalytics.isSensorsDataVersion) {
return new SensorsAnalyticsVersionFieldVisitor(SensorsAnalyticsUtil.ASM_VERSION, fieldVisitor, name, value, sdkVersionHelper, mClassName, classNameAnalytics)
}
return super.visitField(access, name, descriptor, signature, value)
return fieldVisitor
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package com.sensorsdata.analytics.android.plugin

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

if (!disableSensorsAnalyticsPlugin) {
AppExtension appExtension = project.extensions.findByType(AppExtension.class)
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, appExtension)
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter
VersionUtils.isAndroidTv = isAndroidTv
appExtension.registerTransform(new SensorsAnalyticsTransform(transformHelper))
BaseExtension baseExtension
if (project.getPlugins().hasPlugin("com.android.application")) {
baseExtension = project.extensions.findByType(AppExtension.class)
} else if (project.getPlugins().hasPlugin("com.android.library")) {
baseExtension = project.extensions.findByType(LibraryExtension.class)
}
if (null != baseExtension) {
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, baseExtension)
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter
VersionUtils.isAndroidTv = isAndroidTv

baseExtension.registerTransform(new SensorsAnalyticsTransform(transformHelper, baseExtension instanceof LibraryExtension))
} else {
Logger.error("------------神策 plugin 当前不支持您的项目--------------")
}
} else {
Logger.error("------------您已关闭了神策插件--------------")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import com.android.build.api.transform.TransformOutputProvider
import com.android.build.gradle.internal.pipeline.TransformManager
import com.android.ide.common.internal.WaitableExecutor
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper
import groovy.io.FileType
import org.apache.commons.codec.digest.DigestUtils
import org.apache.commons.io.FileUtils
Expand All @@ -48,16 +49,20 @@ import java.util.jar.JarOutputStream

class SensorsAnalyticsTransform extends Transform {
private SensorsAnalyticsTransformHelper transformHelper
public static final String VERSION = "3.4.8"
public static final String VERSION = "3.4.9"
public static final String MIN_SDK_VERSION = "5.4.3"
private WaitableExecutor waitableExecutor
private URLClassLoader urlClassLoader
// “com.sensorsdata.analytics.android.sdk.SensorsDataAPI” 类所在路径
private String sensorsSdkJarPath
private volatile boolean isFoundSDKJar = false
private boolean isProjectLibrary = false
private SensorsDataSDKVersionHelper sdkVersionHelper;

SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper) {
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper, boolean isProjectLibrary) {
this.transformHelper = transformHelper
this.isProjectLibrary = isProjectLibrary
this.sdkVersionHelper = new SensorsDataSDKVersionHelper()
if (!transformHelper.disableSensorsAnalyticsMultiThread) {
waitableExecutor = WaitableExecutor.useGlobalSharedThreadPool()
}
Expand All @@ -75,7 +80,7 @@ class SensorsAnalyticsTransform extends Transform {

@Override
Set<QualifiedContent.Scope> getScopes() {
return TransformManager.SCOPE_FULL_PROJECT
return isProjectLibrary ? TransformManager.PROJECT_ONLY : TransformManager.SCOPE_FULL_PROJECT
}

@Override
Expand Down Expand Up @@ -177,7 +182,9 @@ class SensorsAnalyticsTransform extends Transform {
transformHelper.urlClassLoader = urlClassLoader
checkRNState()
VersionUtils.loadAndroidSDKVersion(urlClassLoader)
checkSensorsSDK()
if(!isProjectLibrary) {
checkSensorsSDK()
}
}

private void checkSensorsSDK() {
Expand Down Expand Up @@ -424,7 +431,7 @@ class SensorsAnalyticsTransform extends Transform {
private byte[] modifyClass(byte[] srcClass, ClassNameAnalytics classNameAnalytics) {
try {
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS)
ClassVisitor classVisitor = new SensorsAnalyticsClassVisitor(classWriter, classNameAnalytics, transformHelper)
ClassVisitor classVisitor = new SensorsAnalyticsClassVisitor(classWriter, classNameAnalytics, transformHelper, sdkVersionHelper)
ClassReader cr = new ClassReader(srcClass)
cr.accept(classVisitor, ClassReader.EXPAND_FRAMES)
return classWriter.toByteArray()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
*/
package com.sensorsdata.analytics.android.plugin

import com.android.build.gradle.AppExtension
import com.android.build.gradle.BaseExtension

class SensorsAnalyticsTransformHelper {

SensorsAnalyticsExtension extension
AppExtension android
BaseExtension android
RN_STATE rnState = RN_STATE.NOT_FOUND
String rnVersion = ""
SensorsAnalyticsSDKHookConfig sensorsAnalyticsHookConfig
Expand Down Expand Up @@ -68,7 +68,7 @@ class SensorsAnalyticsTransformHelper {
'android.support.v7.widget.ActionMenuPresenter$OverflowMenuButton']
URLClassLoader urlClassLoader

SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension, AppExtension android) {
SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension, BaseExtension android) {
this.extension = extension
this.android = android
}
Expand Down Expand Up @@ -126,7 +126,7 @@ class SensorsAnalyticsTransformHelper {
}
if (classNameAnalytics.methodCells.size() > 0 || classNameAnalytics.isSensorsDataAPI
|| (classNameAnalytics.isAppWebViewInterface && (extension.addUCJavaScriptInterface || extension.addXWalkJavaScriptInterface))
|| classNameAnalytics.isKeyboardViewUtil) {
|| classNameAnalytics.isKeyboardViewUtil || classNameAnalytics.isSensorsDataVersion) {
classNameAnalytics.isShouldModify = true
}
} else if (!classNameAnalytics.isAndroidGenerated()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sensorsdata.analytics.android.plugin.utils;

public class TextUtil {
public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.sensorsdata.analytics.android.plugin.version;

import com.sensorsdata.analytics.android.plugin.ClassNameAnalytics;
import com.sensorsdata.analytics.android.plugin.Logger;
import com.sensorsdata.analytics.android.plugin.SensorsAnalyticsTransform;
import com.sensorsdata.analytics.android.plugin.SensorsAnalyticsUtil;
import com.sensorsdata.analytics.android.plugin.utils.TextUtil;
import com.sensorsdata.analytics.android.plugin.version.SensorsDataSDKVersionHelper;

import org.objectweb.asm.FieldVisitor;

public class SensorsAnalyticsVersionFieldVisitor extends FieldVisitor {
private String mName, mClassName;
private Object mValue;
private SensorsDataSDKVersionHelper mSdkVersionHelper;
private ClassNameAnalytics mClassNameAnalytics;

public SensorsAnalyticsVersionFieldVisitor(int api, FieldVisitor fieldVisitor, String name, Object value, SensorsDataSDKVersionHelper sdkVersionHelper, String className, ClassNameAnalytics classNameAnalytics) {
super(api, fieldVisitor);
this.mName = name;
this.mValue = value;
this.mSdkVersionHelper = sdkVersionHelper;
this.mClassName = className;
this.mClassNameAnalytics = classNameAnalytics;
}

@Override
public void visitEnd() {
if (mClassNameAnalytics.getIsSensorsDataAPI()) {
if ("VERSION".equals(mName)) {
String version = (String) mValue;
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.MIN_SDK_VERSION, version) > 0) {
String errMessage = String.format("你目前集成的神策埋点 SDK 版本号为 v%s,请升级到 v%s 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android", version, SensorsAnalyticsTransform.MIN_SDK_VERSION);
Logger.error(errMessage);
throw new Error(errMessage);
}
String message = mSdkVersionHelper.getMessageBySDKCurrentVersion(mClassName, version);
if (!TextUtil.isEmpty(message)) {
throw new Error(message);
}
} else if ("MIN_PLUGIN_VERSION".equals(mName)) {
String minPluginVersion = (String) mValue;
if (!TextUtil.isEmpty(minPluginVersion)) {
if (SensorsAnalyticsUtil.compareVersion(SensorsAnalyticsTransform.VERSION, minPluginVersion) < 0) {
String errMessage = String.format("你目前集成的神策插件版本号为 v%s,请升级到 v%s 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android-plugin2", SensorsAnalyticsTransform.VERSION, minPluginVersion);
Logger.error(errMessage);
throw new Error(errMessage);
}
}
}
} else if (mClassNameAnalytics.getIsSensorsDataVersion()) {
if (SensorsDataSDKVersionHelper.VERSION_KEY_CURRENT_VERSION.equals(mName)) {
String version = (String) mValue;
String message = mSdkVersionHelper.getMessageBySDKCurrentVersion(mClassName, version);
if (!TextUtil.isEmpty(message)) {
throw new Error(message);
}
} else if (SensorsDataSDKVersionHelper.VERSION_KEY_DEPENDENT_SDK_VERSION.equals(mName)) {
String relatedOtherSDK = (String) mValue;
String message = mSdkVersionHelper.getMessageBySDKRelyVersion(mClassName, relatedOtherSDK);
if (!TextUtil.isEmpty(message)) {
throw new Error(message);
}
}
}
super.visitEnd();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.sensorsdata.analytics.android.plugin.version;

import com.google.gson.JsonObject;
import com.sensorsdata.analytics.android.plugin.utils.TextUtil;


public class SensorsDataSDKVersionBean {
/**
* 当前 SDK 要求的最小版本(必须)
*/
private String mMinSensorsDataSDKVersion;
/**
* 其他业务 SDK 的版本信息路径,也就是 SensorDataVersionOptions 类的路径
* 通过 SensorDataVersionOptions 类的路径匹配,当前依赖 SDK 的版本和已有的 SDK 的关系(每一个 SDK 唯一,用于匹配)
* (必须)
*/
private String mSensorsDataSDKPath;
/**
* 版本不匹配时,提醒信息,可为 null
*/
private String mMessage;

public SensorsDataSDKVersionBean(String sensorsSDKPath, String minVersion, String message) {
this.mSensorsDataSDKPath = sensorsSDKPath;
this.mMinSensorsDataSDKVersion = minVersion;
this.mMessage = message;
}

public String getSensorsDataSDKPath() {
return mSensorsDataSDKPath;
}

public String getSensorsDataSDKVersionMessage(String version) {
return !isVersionValid(version, mMinSensorsDataSDKVersion) ? String.format(TextUtil.isEmpty(mMessage) ? SensorsDataSDKVersionHelper.DEFAULT_MESSAGE : mMessage, version, mMinSensorsDataSDKVersion) : "";
}

private boolean isVersionValid(String saVersion, String requiredVersion) {
try {
if (saVersion.equals(requiredVersion)) {
return true;
} else {
String[] saVersions = saVersion.split("\\.");
String[] requiredVersions = requiredVersion.split("\\.");
for (int index = 0; index < requiredVersions.length; index++) {
int saVersionsNum = Integer.parseInt(saVersions[index]);
int requiredVersionsNum = Integer.parseInt(requiredVersions[index]);
if (saVersionsNum != requiredVersionsNum) {
return saVersionsNum > requiredVersionsNum;
}
}
return false;
}
} catch (Exception ex) {
// ignore
return false;
}
}

public static SensorsDataSDKVersionBean createSensorDataSDKBean(JsonObject jsonObject) {
if (null != jsonObject) {
try {
String path = jsonObject.get("SDK_VERSION_PATH").getAsString();
String minVersion = jsonObject.get("DEPENDENT_MIN_SDK_VERSIONS").getAsString();
if (!TextUtil.isEmpty(path) && !TextUtil.isEmpty(minVersion)) {
if (path.contains(".")) {
path = path.replaceAll("\\.", "/");
}
String message = jsonObject.get("ERROR_MESSAGE").getAsString();
return new SensorsDataSDKVersionBean(path, minVersion, message);
}
} catch (Exception e) {
// ignore
}
}
return null;
}

public String toString() {
return "\tminSensorsDataSDKVersion=" + mMinSensorsDataSDKVersion + "\n" +
"\tsensorsDataSDKPath=" + mSensorsDataSDKPath + "\n" +
"\tmessage=" + mMessage;
}

}
Loading

0 comments on commit b07d0c9

Please sign in to comment.