Skip to content

Commit da979aa

Browse files
author
dengshiwei
committed
Release 3.2.1
1 parent 5527792 commit da979aa

File tree

6 files changed

+121
-35
lines changed

6 files changed

+121
-35
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.2.0'
2+
pluginVersion = '3.2.1'
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: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
267267
}
268268
}
269269

270-
void handleCode(){
270+
void handleCode() {
271271
if (isHasInstrumented || classNameAnalytics.isSensorsDataAPI) {
272272
return
273273
}
@@ -287,7 +287,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
287287
methodVisitor.visitVarInsn(ALOAD, 0)
288288
methodVisitor.visitVarInsn(ILOAD, variableID)
289289
methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, sensorsAnalyticsMethodCell.agentName, sensorsAnalyticsMethodCell.agentDesc, false)
290-
} else if (localIds != null){
290+
} else if (localIds != null) {
291291
methodVisitor.visitVarInsn(ALOAD, 0)
292292
for (localId in localIds) {
293293
methodVisitor.visitVarInsn(ALOAD, localId)
@@ -348,20 +348,11 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
348348
return
349349
}
350350

351-
/**
352-
* React Native
353-
*/
354-
if (nameDesc == 'setJSResponder(IIZ)V' && mClassName == 'com/facebook/react/uimanager/NativeViewHierarchyManager') {
355-
methodVisitor.visitVarInsn(ALOAD, 0)
356-
methodVisitor.visitVarInsn(ILOAD, 1)
357-
methodVisitor.visitVarInsn(ILOAD, 2)
358-
methodVisitor.visitVarInsn(ILOAD, 3)
359-
methodVisitor.visitMethodInsn(INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, "trackRN", "(Ljava/lang/Object;IIZ)V", false)
351+
if (handleRN()) {
360352
isHasTracked = true
361353
return
362354
}
363355

364-
365356
/**
366357
* Menu
367358
* 目前支持 onContextItemSelected(MenuItem item)、onOptionsItemSelected(MenuItem item)
@@ -447,6 +438,34 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
447438
}
448439
}
449440

441+
boolean handleRN() {
442+
boolean result = false
443+
switch (transformHelper.rnState) {
444+
case SensorsAnalyticsTransformHelper.RN_STATE.NOT_FOUND:
445+
break
446+
case SensorsAnalyticsTransformHelper.RN_STATE.HAS_VERSION:
447+
if (nameDesc == 'handleTouchEvent(Landroid/view/MotionEvent;Lcom/facebook/react/uimanager/events/EventDispatcher;)V' && mClassName == 'com/facebook/react/uimanager/JSTouchDispatcher') {
448+
methodVisitor.visitVarInsn(ALOAD, 0)
449+
methodVisitor.visitVarInsn(ALOAD, 1)
450+
methodVisitor.visitVarInsn(ALOAD, 2)
451+
methodVisitor.visitMethodInsn(INVOKESTATIC, "com/sensorsdata/analytics/RNAgent", "handleTouchEvent", "(Lcom/facebook/react/uimanager/JSTouchDispatcher;Landroid/view/MotionEvent;Lcom/facebook/react/uimanager/events/EventDispatcher;)V", false)
452+
result = true
453+
}
454+
break
455+
case SensorsAnalyticsTransformHelper.RN_STATE.NO_VERSION:
456+
if (nameDesc == 'setJSResponder(IIZ)V' && mClassName == 'com/facebook/react/uimanager/NativeViewHierarchyManager') {
457+
methodVisitor.visitVarInsn(ALOAD, 0)
458+
methodVisitor.visitVarInsn(ILOAD, 1)
459+
methodVisitor.visitVarInsn(ILOAD, 2)
460+
methodVisitor.visitVarInsn(ILOAD, 3)
461+
methodVisitor.visitMethodInsn(INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, "trackRN", "(Ljava/lang/Object;IIZ)V", false)
462+
result = true
463+
}
464+
break
465+
}
466+
return result
467+
}
468+
450469
void trackViewOnClick(MethodVisitor mv, int index) {
451470
mv.visitVarInsn(ALOAD, index)
452471
mv.visitMethodInsn(INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, "trackViewOnClick", "(Landroid/view/View;)V", false)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class SensorsAnalyticsPlugin implements Plugin<Project> {
4545
}
4646
if (!disableSensorsAnalyticsPlugin) {
4747
AppExtension appExtension = project.extensions.findByType(AppExtension.class)
48-
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension)
48+
SensorsAnalyticsTransformHelper transformHelper = new SensorsAnalyticsTransformHelper(extension, appExtension)
4949
transformHelper.disableSensorsAnalyticsIncremental = disableSensorsAnalyticsIncrementalBuild
5050
transformHelper.disableSensorsAnalyticsMultiThread = disableSensorsAnalyticsMultiThreadBuild
5151
transformHelper.isHookOnMethodEnter = isHookOnMethodEnter

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

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,10 @@ import java.util.jar.JarOutputStream
4545

4646
class SensorsAnalyticsTransform extends Transform {
4747
private SensorsAnalyticsTransformHelper transformHelper
48-
public static final String VERSION = "3.2.0"
48+
public static final String VERSION = "3.2.1"
4949
public static final String MIN_SDK_VERSION = "3.0.0"
5050
private WaitableExecutor waitableExecutor
51+
private URLClassLoader urlClassLoader
5152

5253
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper) {
5354
this.transformHelper = transformHelper
@@ -78,18 +79,12 @@ class SensorsAnalyticsTransform extends Transform {
7879

7980
@Override
8081
void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
81-
transform2(transformInvocation.context, transformInvocation.inputs, transformInvocation.outputProvider, transformInvocation.incremental)
82+
beforeTransform(transformInvocation)
83+
transformClass(transformInvocation.context, transformInvocation.inputs, transformInvocation.outputProvider, transformInvocation.incremental)
8284
}
8385

84-
private void transform2(Context context, Collection<TransformInput> inputs, TransformOutputProvider outputProvider, boolean isIncremental)
86+
private void transformClass(Context context, Collection<TransformInput> inputs, TransformOutputProvider outputProvider, boolean isIncremental)
8587
throws IOException, TransformException, InterruptedException {
86-
//打印提示信息
87-
Logger.printCopyright()
88-
transformHelper.onTransform()
89-
println("[SensorsAnalytics]: 是否开启多线程编译:${!transformHelper.disableSensorsAnalyticsMultiThread}")
90-
println("[SensorsAnalytics]: 是否开启增量编译:${!transformHelper.disableSensorsAnalyticsIncremental}")
91-
println("[SensorsAnalytics]: 此次是否增量编译:$isIncremental")
92-
println("[SensorsAnalytics]: 是否在方法进入时插入代码:${transformHelper.isHookOnMethodEnter}")
9388
long startTime = System.currentTimeMillis()
9489
if (!isIncremental) {
9590
outputProvider.deleteAll()
@@ -134,7 +129,52 @@ class SensorsAnalyticsTransform extends Transform {
134129
println("[SensorsAnalytics]: 此次编译共耗时:${System.currentTimeMillis() - startTime}毫秒")
135130
}
136131

137-
void forEachDirectory(boolean isIncremental, DirectoryInput directoryInput, TransformOutputProvider outputProvider, Context context){
132+
private void beforeTransform(TransformInvocation transformInvocation) {
133+
//打印提示信息
134+
Logger.printCopyright()
135+
transformHelper.onTransform()
136+
println("[SensorsAnalytics]: 是否开启多线程编译:${!transformHelper.disableSensorsAnalyticsMultiThread}")
137+
println("[SensorsAnalytics]: 是否开启增量编译:${!transformHelper.disableSensorsAnalyticsIncremental}")
138+
println("[SensorsAnalytics]: 此次是否增量编译:$transformInvocation.incremental")
139+
println("[SensorsAnalytics]: 是否在方法进入时插入代码:${transformHelper.isHookOnMethodEnter}")
140+
141+
traverseForClassLoader(transformInvocation)
142+
}
143+
144+
private void traverseForClassLoader(TransformInvocation transformInvocation) {
145+
def urlList = []
146+
def androidJar = transformHelper.androidJar()
147+
urlList << androidJar.toURI().toURL()
148+
transformInvocation.inputs.each { transformInput ->
149+
transformInput.jarInputs.each { jarInput ->
150+
urlList << jarInput.getFile().toURI().toURL()
151+
}
152+
153+
transformInput.directoryInputs.each { directoryInput ->
154+
urlList << directoryInput.getFile().toURI().toURL()
155+
}
156+
}
157+
def urlArray = urlList as URL[]
158+
urlClassLoader = new URLClassLoader(urlArray)
159+
transformHelper.urlClassLoader = urlClassLoader
160+
checkRNState()
161+
}
162+
163+
private void checkRNState() {
164+
try {
165+
Class rnClazz = urlClassLoader.loadClass("com.sensorsdata.analytics.RNSensorsAnalyticsPackage")
166+
try {
167+
rnClazz.getDeclaredField("VERSION")
168+
transformHelper.rnState = SensorsAnalyticsTransformHelper.RN_STATE.HAS_VERSION
169+
} catch (Exception e) {
170+
transformHelper.rnState = SensorsAnalyticsTransformHelper.RN_STATE.NO_VERSION
171+
}
172+
} catch (Exception e) {
173+
transformHelper.rnState = SensorsAnalyticsTransformHelper.RN_STATE.NOT_FOUND
174+
}
175+
}
176+
177+
void forEachDirectory(boolean isIncremental, DirectoryInput directoryInput, TransformOutputProvider outputProvider, Context context) {
138178
File dir = directoryInput.file
139179
File dest = outputProvider.getContentLocation(directoryInput.getName(),
140180
directoryInput.getContentTypes(), directoryInput.getScopes(),

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

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,46 @@
1717

1818
package com.sensorsdata.analytics.android.plugin
1919

20+
import com.android.build.gradle.AppExtension
21+
2022
class SensorsAnalyticsTransformHelper {
2123

2224
SensorsAnalyticsExtension extension
25+
AppExtension android
26+
RN_STATE rnState = RN_STATE.NOT_FOUND
27+
28+
2329
SensorsAnalyticsSDKHookConfig sensorsAnalyticsHookConfig
2430
boolean disableSensorsAnalyticsMultiThread
2531
boolean disableSensorsAnalyticsIncremental
2632
boolean isHookOnMethodEnter
27-
HashSet<String> exclude = ['com.sensorsdata.analytics.android.sdk', 'android.support', 'androidx', 'com.qiyukf', 'android.arch', 'com.google.android']
28-
HashSet<String> include = ['butterknife.internal.DebouncingOnClickListener',
29-
'com.jakewharton.rxbinding.view.ViewClickOnSubscribe',
30-
'com.facebook.react.uimanager.NativeViewHierarchyManager']
33+
HashSet<String> exclude = new HashSet<>(['com.sensorsdata.analytics.android.sdk', 'android.support', 'androidx', 'com.qiyukf', 'android.arch', 'com.google.android'])
34+
HashSet<String> include = new HashSet<>(['butterknife.internal.DebouncingOnClickListener',
35+
'com.jakewharton.rxbinding.view.ViewClickOnSubscribe',
36+
'com.facebook.react.uimanager.NativeViewHierarchyManager'])
3137
/** 将一些特例需要排除在外 */
32-
public static final HashSet<String> special = ['android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener',
33-
'com.google.android.material.tabs.TabLayout$ViewPagerOnTabSelectedListener',
34-
'android.support.v7.app.ActionBarDrawerToggle',
35-
'androidx.appcompat.app.ActionBarDrawerToggle']
38+
public static final HashSet<String> special = new HashSet<>(['android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener',
39+
'com.google.android.material.tabs.TabLayout$ViewPagerOnTabSelectedListener',
40+
'android.support.v7.app.ActionBarDrawerToggle',
41+
'androidx.appcompat.app.ActionBarDrawerToggle'])
42+
URLClassLoader urlClassLoader
3643

37-
SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension) {
44+
SensorsAnalyticsTransformHelper(SensorsAnalyticsExtension extension, AppExtension android) {
3845
this.extension = extension
46+
this.android = android
47+
}
48+
49+
File androidJar() throws FileNotFoundException {
50+
File jar = new File(getSdkJarDir(), "android.jar")
51+
if (!jar.exists()) {
52+
throw new FileNotFoundException("Android jar not found!")
53+
}
54+
return jar
55+
}
56+
57+
private String getSdkJarDir() {
58+
String compileSdkVersion = android.getCompileSdkVersion()
59+
return String.join(File.separator, android.getSdkDirectory().getAbsolutePath(), "platforms", compileSdkVersion)
3960
}
4061

4162
void onTransform() {
@@ -106,5 +127,9 @@ class SensorsAnalyticsTransformHelper {
106127
}
107128
return classNameAnalytics
108129
}
130+
131+
enum RN_STATE{
132+
NOT_FOUND, NO_VERSION, HAS_VERSION
133+
}
109134
}
110135

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717

1818
package com.sensorsdata.analytics.android.plugin
1919

20+
import groovy.transform.CompileStatic
2021
import org.objectweb.asm.Opcodes
2122

23+
@CompileStatic
2224
class SensorsAnalyticsUtil {
23-
public static final ASM_VERSION = Opcodes.ASM6
25+
public static final int ASM_VERSION = Opcodes.ASM6
2426
private static final HashSet<String> targetFragmentClass = new HashSet()
2527
private static final HashSet<String> targetMenuMethodDesc = new HashSet()
2628
private static final HashSet<String> specialClass = new HashSet()

0 commit comments

Comments
 (0)