Skip to content

Commit 58da120

Browse files
author
weiqiangliu
committed
Release 3.3.7
1 parent 1e47661 commit 58da120

File tree

7 files changed

+132
-3
lines changed

7 files changed

+132
-3
lines changed

plugin/bintray.gradle

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,32 @@ publishing {
5757
developerConnection = 'https://github.com/sensorsdata/sa-sdk-android-plugin2.git'
5858
url = 'https://github.com/sensorsdata/sa-sdk-android-plugin2'
5959
}
60+
pom.withXml {
61+
def dependenciesNode = asNode().appendNode('dependencies')
62+
project.configurations.all { configuration ->
63+
def name = configuration.name
64+
if (name == 'implementation' || name == 'releaseImplementation') {
65+
configuration.allDependencies.each {
66+
if (it.group != null && it.name != "unspecified" && it.version != null) {
67+
def groupId = it.group
68+
def artifactId = it.name
69+
def version = it.version
70+
if (it instanceof ProjectDependency) {
71+
def properties = it.getDependencyProject().getProperties()
72+
groupId = properties.get("GROUP")
73+
artifactId = properties.get("POM_ARTIFACT_ID")
74+
}
75+
println "dependency:" + groupId + ":" + artifactId + ":" + version
76+
def dependencyNode = dependenciesNode.appendNode('dependency')
77+
dependencyNode.appendNode('groupId', groupId)
78+
dependencyNode.appendNode('artifactId', artifactId)
79+
dependencyNode.appendNode('version', version)
80+
dependencyNode.appendNode('scope', 'compile')
81+
}
82+
}
83+
}
84+
}
85+
}
6086
}
6187
}
6288
}
@@ -67,6 +93,7 @@ publishing {
6793
def mavenUser = properties.getProperty("maven.user")
6894
def mavenPassword = properties.getProperty("maven.password")
6995
maven {
96+
// url ='../repo'
7097
url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
7198
credentials {
7299
username mavenUser

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.3.6'
2+
pluginVersion = '3.3.7'
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/SensorsAnalyticsClassVisitor.groovy

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

1919
import com.sensorsdata.analytics.android.plugin.hook.SensorsPushInjected
20+
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
2021
import org.objectweb.asm.AnnotationVisitor
2122
import org.objectweb.asm.ClassVisitor
2223
import org.objectweb.asm.FieldVisitor
@@ -42,6 +43,10 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
4243

4344
private HashMap<String, SensorsAnalyticsMethodCell> mLambdaMethodCells = new HashMap<>()
4445

46+
private boolean isExtendsActivity
47+
// 是否是 AndroidTV 版本
48+
private boolean isAndroidTv
49+
4550
@Override
4651
protected Object clone() throws CloneNotSupportedException {
4752
return super.clone()
@@ -52,6 +57,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
5257
this.classVisitor = classVisitor
5358
this.classNameAnalytics = classNameAnalytics
5459
this.transformHelper = transformHelper
60+
isAndroidTv = VersionUtils.isTvVersion();
5561
}
5662

5763
private
@@ -83,6 +89,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
8389
mInterfaces = interfaces
8490
this.version = version
8591
super.visit(version, access, name, signature, superName, interfaces)
92+
isExtendsActivity = SensorsAnalyticsUtil.isInstanceOfActivity(superName)
8693
if (Logger.debug) {
8794
Logger.info("开始扫描类:${mClassName}")
8895
Logger.info("类详情:version=${version};\taccess=${Logger.accCode2String(access)};\tname=${name};\tsignature=${signature};\tsuperName=${superName};\tinterfaces=${interfaces.toArrayString()}\n")
@@ -545,6 +552,14 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
545552
return
546553
}
547554

555+
if (isAndroidTv && isExtendsActivity && nameDesc == 'dispatchKeyEvent(Landroid/view/KeyEvent;)Z') {
556+
methodVisitor.visitVarInsn(ALOAD, 0)
557+
methodVisitor.visitVarInsn(ALOAD, 1)
558+
methodVisitor.visitMethodInsn(INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, "trackViewOnClick", "(Landroid/app/Activity;Landroid/view/KeyEvent;)V", false)
559+
isHasTracked = true
560+
return
561+
}
562+
548563
if (handleRN()) {
549564
isHasTracked = true
550565
return

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

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

1919
import com.android.build.gradle.AppExtension
20+
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
2021
import org.gradle.api.Plugin
2122
import org.gradle.api.Project
2223
import org.gradle.internal.reflect.Instantiator
@@ -33,6 +34,7 @@ class SensorsAnalyticsPlugin implements Plugin<Project> {
3334
boolean disableSensorsAnalyticsMultiThreadBuild = false
3435
boolean disableSensorsAnalyticsIncrementalBuild = false
3536
boolean isHookOnMethodEnter = false
37+
boolean isAndroidTv = false
3638
Properties properties = new Properties()
3739
if (project.rootProject.file('gradle.properties').exists()) {
3840
properties.load(project.rootProject.file('gradle.properties').newDataInputStream())
@@ -41,13 +43,15 @@ class SensorsAnalyticsPlugin implements Plugin<Project> {
4143
disableSensorsAnalyticsMultiThreadBuild = Boolean.parseBoolean(properties.getProperty("sensorsAnalytics.disableMultiThreadBuild", "false"))
4244
disableSensorsAnalyticsIncrementalBuild = Boolean.parseBoolean(properties.getProperty("sensorsAnalytics.disableIncrementalBuild", "false"))
4345
isHookOnMethodEnter = Boolean.parseBoolean(properties.getProperty("sensorsAnalytics.isHookOnMethodEnter", "false"))
46+
isAndroidTv = Boolean.parseBoolean(properties.getProperty("sensorsAnalytics.isAndroidTv", "false"))
4447
}
4548
if (!disableSensorsAnalyticsPlugin) {
4649
AppExtension appExtension = project.extensions.findByType(AppExtension.class)
4750
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, appExtension)
4851
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
4952
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
5053
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter
54+
VersionUtils.isAndroidTv = isAndroidTv
5155
appExtension.registerTransform(new SensorsAnalyticsTransform(transformHelper))
5256
} else {
5357
Logger.error("------------您已关闭了神策插件--------------")

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import com.android.build.api.transform.TransformInvocation
2929
import com.android.build.api.transform.TransformOutputProvider
3030
import com.android.build.gradle.internal.pipeline.TransformManager
3131
import com.android.ide.common.internal.WaitableExecutor
32+
import com.sensorsdata.analytics.android.plugin.utils.VersionUtils
3233
import groovy.io.FileType
3334
import org.apache.commons.codec.digest.DigestUtils
3435
import org.apache.commons.io.FileUtils
@@ -38,17 +39,22 @@ import org.objectweb.asm.ClassVisitor
3839
import org.objectweb.asm.ClassWriter
3940

4041
import java.lang.reflect.Field
42+
import java.security.CodeSource
43+
import java.security.ProtectionDomain
4144
import java.util.concurrent.Callable
4245
import java.util.jar.JarEntry
4346
import java.util.jar.JarFile
4447
import java.util.jar.JarOutputStream
4548

4649
class SensorsAnalyticsTransform extends Transform {
4750
private SensorsAnalyticsTransformHelper transformHelper
48-
public static final String VERSION = "3.3.6"
51+
public static final String VERSION = "3.3.7"
4952
public static final String MIN_SDK_VERSION = "5.1.0"
5053
private WaitableExecutor waitableExecutor
5154
private URLClassLoader urlClassLoader
55+
// “com.sensorsdata.analytics.android.sdk.SensorsDataAPI” 类所在路径
56+
private String sensorsSdkJarPath
57+
private volatile boolean isFoundSDKJar = false
5258

5359
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper) {
5460
this.transformHelper = transformHelper
@@ -170,6 +176,19 @@ class SensorsAnalyticsTransform extends Transform {
170176
urlClassLoader = new URLClassLoader(urlArray)
171177
transformHelper.urlClassLoader = urlClassLoader
172178
checkRNState()
179+
VersionUtils.loadAndroidSDKVersion(urlClassLoader)
180+
checkSensorsSDK()
181+
}
182+
183+
private void checkSensorsSDK() {
184+
try {
185+
Class sdkClazz = urlClassLoader.loadClass("com.sensorsdata.analytics.android.sdk.SensorsDataAPI")
186+
ProtectionDomain pd = sdkClazz.getProtectionDomain()
187+
CodeSource cs = pd.getCodeSource()
188+
sensorsSdkJarPath = cs.getLocation().toURI().getPath()
189+
} catch (Throwable throwable) {
190+
Logger.error("Can not load 'com.sensorsdata.analytics.android.sdk.SensorsDataAPI' class: ${throwable.localizedMessage}")
191+
}
173192
}
174193

175194
private void checkRNState() {
@@ -287,7 +306,7 @@ class SensorsAnalyticsTransform extends Transform {
287306

288307
void transformJar(File dest, JarInput jarInput, Context context) {
289308
def modifiedJar = null
290-
if (!transformHelper.extension.disableJar || jarInput.file.absolutePath.contains('SensorsAnalyticsSDK')) {
309+
if (!transformHelper.extension.disableJar || checkJarValidate(jarInput)) {
291310
Logger.info("开始遍历 jar:" + jarInput.file.absolutePath)
292311
modifiedJar = modifyJarFile(jarInput.file, context.getTemporaryDir())
293312
Logger.info("结束遍历 jar:" + jarInput.file.absolutePath)
@@ -298,6 +317,24 @@ class SensorsAnalyticsTransform extends Transform {
298317
FileUtils.copyFile(modifiedJar, dest)
299318
}
300319

320+
private boolean checkJarValidate(JarInput jarInput) {
321+
try {
322+
if (isFoundSDKJar || sensorsSdkJarPath == null) {
323+
return false
324+
}
325+
def jarLocation = jarInput.file.toURI().getPath()
326+
if (sensorsSdkJarPath.length() == jarLocation.length() && sensorsSdkJarPath == jarLocation) {
327+
isFoundSDKJar = true
328+
return true
329+
} else {
330+
return false
331+
}
332+
} catch (Throwable throwable) {
333+
Logger.error("Checking jar's validation error: " + throwable.localizedMessage)
334+
return false
335+
}
336+
}
337+
301338
/**
302339
* 修改 jar 文件中对应字节码
303340
*/

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class SensorsAnalyticsUtil {
2727
private static final HashSet<String> targetFragmentClass = new HashSet()
2828
private static final HashSet<String> targetMenuMethodDesc = new HashSet()
2929
private static final HashSet<String> specialClass = new HashSet()
30+
private static final HashSet<String> targetActivityClass = new HashSet<>()
3031

3132
static {
3233
/**
@@ -56,6 +57,10 @@ class SensorsAnalyticsUtil {
5657
targetFragmentClass.add('androidx/fragment/app/ListFragment')
5758
targetFragmentClass.add('androidx/fragment/app/DialogFragment')
5859

60+
targetActivityClass.add('android/app/Activity')
61+
targetActivityClass.add('android/support/v7/app/AppCompatActivity')
62+
targetActivityClass.add('androidx/appcompat/app/AppCompatActivity')
63+
5964
for (className in SensorsAnalyticsTransformHelper.special) {
6065
specialClass.add(className.replace('.', '/'))
6166
}
@@ -186,4 +191,8 @@ class SensorsAnalyticsUtil {
186191
}
187192
return result
188193
}
194+
195+
static boolean isInstanceOfActivity(String superName) {
196+
return targetActivityClass.contains(superName)
197+
}
189198
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.sensorsdata.analytics.android.plugin.utils;
2+
3+
import com.sensorsdata.analytics.android.plugin.Logger;
4+
5+
import java.lang.reflect.Field;
6+
import java.net.URLClassLoader;
7+
8+
public class VersionUtils {
9+
// 是否打开 TV 开关
10+
public static boolean isAndroidTv;
11+
// 神策埋点 SDK 版本号
12+
public static String sensorsSDKVersion = "";
13+
14+
/**
15+
* 是否是 TV 版本
16+
* @return true 是,false 不是
17+
*/
18+
public static boolean isTvVersion() {
19+
return isAndroidTv && sensorsSDKVersion.endsWith("tv");
20+
}
21+
22+
/**
23+
* 读取神策 Android 埋点 SDK 版本号
24+
* @param urlClassLoader ClassLoader
25+
*/
26+
public static void loadAndroidSDKVersion(URLClassLoader urlClassLoader) {
27+
try {
28+
Class sensorsDataAPI = urlClassLoader.loadClass("com.sensorsdata.analytics.android.sdk.SensorsDataAPI");
29+
Field versionField = sensorsDataAPI.getDeclaredField("VERSION");
30+
versionField.setAccessible(true);
31+
sensorsSDKVersion = (String) versionField.get(null);
32+
Logger.info("神策埋点 SDK 版本号:" + sensorsSDKVersion);
33+
} catch(Throwable throwable) {
34+
Logger.info("神策埋点 SDK 版本号读取失败,reason: " + throwable.getMessage());
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)