Skip to content

Commit d7f0e90

Browse files
committed
Release 3.0.1
1 parent 7058457 commit d7f0e90

File tree

8 files changed

+181
-56
lines changed

8 files changed

+181
-56
lines changed

aop/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.0.0'
2+
pluginVersion = '3.0.1'
33
Properties properties = new Properties()
44
if (project.file('local.properties').exists()) {
55
properties.load(project.file('local.properties').newDataInputStream())

aop/maven.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if (!false.toBoolean()){
1212
uploadArchives {
1313
repositories {
1414
mavenDeployer {
15-
repository(url: uri('/Users/wangzhuozhou/Documents/repo'))
15+
repository(url: uri('../repo'))
1616
}
1717
}
1818
}

aop/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsExtension.groovy

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.sensorsdata.analytics.android.plugin
22

33
import org.gradle.api.Action
4-
import org.gradle.api.model.ObjectFactory
4+
import org.gradle.internal.reflect.Instantiator
55

66

77
class SensorsAnalyticsExtension {
@@ -15,9 +15,8 @@ class SensorsAnalyticsExtension {
1515

1616
SensorsAnalyticsSDKExtension sdk
1717

18-
@javax.inject.Inject
19-
SensorsAnalyticsExtension(ObjectFactory objectFactory) {
20-
sdk = objectFactory.newInstance(SensorsAnalyticsSDKExtension)
18+
SensorsAnalyticsExtension(Instantiator ins) {
19+
sdk = ins.newInstance(SensorsAnalyticsSDKExtension)
2120
}
2221

2322
void sdk(Action<? super SensorsAnalyticsSDKExtension> action) {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ package com.sensorsdata.analytics.android.plugin
33
import com.android.build.gradle.AppExtension
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
6+
import org.gradle.internal.reflect.Instantiator
7+
import org.gradle.invocation.DefaultGradle
68

79
class SensorsAnalyticsPlugin implements Plugin<Project> {
810
@Override
911
void apply(Project project) {
10-
Object extension = project.extensions.create("sensorsAnalytics", SensorsAnalyticsExtension,project.objects)
12+
Instantiator ins = ((DefaultGradle) project.getGradle()).getServices().get(
13+
Instantiator)
14+
def args = [ins] as Object[]
15+
Object extension = project.extensions.create("sensorsAnalytics", SensorsAnalyticsExtension,args)
1116

1217
boolean disableSensorsAnalyticsPlugin = false
1318
Properties properties = new Properties()

aop/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsSDKExtension.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ class SensorsAnalyticsSDKExtension {
77
boolean disableJsInterface = false
88
boolean disableAndroidID = false
99
boolean disableMacAddress = false
10+
boolean disableCarrier = false
1011
}
1112

aop/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsSDKHookConfig.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ class SensorsAnalyticsSDKHookConfig {
5151
methodCells.put(methodName,macMethodCells)
5252
}
5353

54+
void disableCarrier(String methodName) {
55+
def carrier = new SensorsAnalyticsMethodCell('getCarrier','(Landroid/content/Context;)Ljava/lang/String;','createGetCarrier')
56+
def macMethods = [carrier]
57+
def macMethodCells = new HashMap<String,ArrayList<SensorsAnalyticsMethodCell>>()
58+
macMethodCells.put("com/sensorsdata/analytics/android/sdk/util/SensorsDataUtils",macMethods)
59+
methodCells.put(methodName,macMethodCells)
60+
}
61+
5462
//todo 扩展
5563

5664
void createGetIMEI(ClassVisitor classVisitor, SensorsAnalyticsMethodCell methodCell) {
@@ -120,4 +128,15 @@ class SensorsAnalyticsSDKHookConfig {
120128
mv.visitEnd()
121129
}
122130

131+
void createGetCarrier(ClassVisitor classVisitor, SensorsAnalyticsMethodCell methodCell) {
132+
def mv = classVisitor.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, methodCell.name, methodCell.desc, null, null)
133+
mv.visitCode()
134+
mv.visitLdcInsn("")
135+
mv.visitInsn(Opcodes.ARETURN)
136+
mv.visitMaxs(1, 1)
137+
mv.visitEnd()
138+
}
139+
140+
//todo 扩展
141+
123142
}

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

Lines changed: 147 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import com.android.build.api.transform.DirectoryInput
55
import com.android.build.api.transform.Format
66
import com.android.build.api.transform.JarInput
77
import com.android.build.api.transform.QualifiedContent
8+
import com.android.build.api.transform.Status
89
import com.android.build.api.transform.Transform
910
import com.android.build.api.transform.TransformException
1011
import com.android.build.api.transform.TransformInput
1112
import com.android.build.api.transform.TransformOutputProvider
1213
import com.android.build.gradle.internal.pipeline.TransformManager
14+
import com.android.ide.common.internal.WaitableExecutor
1315
import groovy.io.FileType
1416
import org.apache.commons.codec.digest.DigestUtils
1517
import org.apache.commons.io.FileUtils
@@ -18,18 +20,21 @@ import org.objectweb.asm.ClassReader
1820
import org.objectweb.asm.ClassVisitor
1921
import org.objectweb.asm.ClassWriter
2022

23+
import java.util.concurrent.Callable
2124
import java.util.jar.JarEntry
2225
import java.util.jar.JarFile
2326
import java.util.jar.JarOutputStream
2427
import java.util.zip.ZipEntry
2528

2629
class SensorsAnalyticsTransform extends Transform {
2730
private SensorsAnalyticsTransformHelper transformHelper
28-
public static final String VERSION = "3.0.0"
31+
public static final String VERSION = "3.0.1"
2932
public static final String MIN_SDK_VERSION = "3.0.0"
33+
private WaitableExecutor waitableExecutor
3034

3135
SensorsAnalyticsTransform(SensorsAnalyticsTransformHelper transformHelper) {
3236
this.transformHelper = transformHelper
37+
this.waitableExecutor = WaitableExecutor.useGlobalSharedThreadPool()
3338
}
3439

3540
@Override
@@ -49,13 +54,17 @@ class SensorsAnalyticsTransform extends Transform {
4954

5055
@Override
5156
boolean isIncremental() {
52-
return false
57+
return true
5358
}
5459

55-
/**
60+
@Override
61+
boolean isCacheable() {
62+
return true
63+
}
64+
/**
5665
* 打印提示信息
5766
*/
58-
private void printCopyRight() {
67+
private static void printCopyRight() {
5968
println()
6069
println("\033[40;32m" + "####################################################################" + "\033[0m")
6170
println("\033[40;32m" + "######## ########" + "\033[0m")
@@ -75,12 +84,13 @@ class SensorsAnalyticsTransform extends Transform {
7584
*/
7685
printCopyRight()
7786

78-
if (!incremental) {
79-
outputProvider.deleteAll()
80-
}
81-
8287
transformHelper.onTransform()
8388

89+
println("[SensorsAnalytics]: 是否增量编译:$isIncremental")
90+
long startTime = System.currentTimeMillis()
91+
if (!isIncremental) {
92+
outputProvider.deleteAll()
93+
}
8494
/**
8595
* 遍历输入文件
8696
*/
@@ -89,59 +99,139 @@ class SensorsAnalyticsTransform extends Transform {
8999
* 遍历 jar
90100
*/
91101
input.jarInputs.each { JarInput jarInput ->
92-
String destName = jarInput.file.name
93-
/**
94-
* 截取文件路径的md5值重命名输出文件,因为可能同名,会覆盖
95-
*/
96-
def hexName = DigestUtils.md5Hex(jarInput.file.absolutePath).substring(0, 8)
97-
if (destName.endsWith(".jar")) {
98-
destName = destName.substring(0, destName.length() - 4)
99-
}
100-
/** 获得输出文件*/
101-
File dest = outputProvider.getContentLocation(destName + "_" + hexName, jarInput.contentTypes, jarInput.scopes, Format.JAR)
102-
103-
def modifiedJar = null
104-
if (!transformHelper.disableJar || jarInput.file.absolutePath.contains('SensorsAnalyticsSDK')) {
105-
Logger.info("开始遍历 jar:" + jarInput.file.absolutePath)
106-
modifiedJar = modifyJarFile(jarInput.file, context.getTemporaryDir())
107-
Logger.info("结束遍历 jar:" + jarInput.file.absolutePath)
108-
}
109-
if (modifiedJar == null) {
110-
modifiedJar = jarInput.file
111-
}
112-
FileUtils.copyFile(modifiedJar, dest)
102+
waitableExecutor.execute(new Callable<Object>() {
103+
@Override
104+
Object call() throws Exception {
105+
forEachJar(isIncremental, jarInput, outputProvider, context)
106+
return null
107+
}
108+
})
113109
}
114110

115111
/**
116112
* 遍历目录
117113
*/
118114
input.directoryInputs.each { DirectoryInput directoryInput ->
119-
File dest = outputProvider.getContentLocation(directoryInput.name, directoryInput.contentTypes, directoryInput.scopes, Format.DIRECTORY)
120115
//Logger.info("||-->开始遍历特定目录 ${dest.absolutePath}")
121116
File dir = directoryInput.file
122-
if (dir) {
123-
HashMap<String, File> modifyMap = new HashMap<>()
124-
dir.traverse(type: FileType.FILES, nameFilter: ~/.*\.class/) {
125-
File classFile ->
126-
File modified = modifyClassFile(dir, classFile, context.getTemporaryDir())
127-
if (modified != null) {
128-
//key为相对路径
129-
modifyMap.put(classFile.absolutePath.replace(dir.absolutePath, ""), modified)
130-
}
117+
File dest = outputProvider.getContentLocation(directoryInput.getName(),
118+
directoryInput.getContentTypes(), directoryInput.getScopes(),
119+
Format.DIRECTORY)
120+
FileUtils.forceMkdir(dest)
121+
String srcDirPath = dir.absolutePath
122+
String destDirPath = dest.absolutePath
123+
if (isIncremental) {
124+
Map<File, Status> fileStatusMap = directoryInput.getChangedFiles()
125+
for (Map.Entry<File, Status> changedFile : fileStatusMap.entrySet()) {
126+
Status status = changedFile.getValue()
127+
File inputFile = changedFile.getKey()
128+
String destFilePath = inputFile.absolutePath.replace(srcDirPath, destDirPath)
129+
File destFile = new File(destFilePath)
130+
switch (status) {
131+
case Status.NOTCHANGED:
132+
break
133+
case Status.REMOVED:
134+
Logger.info("目录 status = $status:$inputFile.absolutePath")
135+
if (destFile.exists()) {
136+
//noinspection ResultOfMethodCallIgnored
137+
destFile.delete()
138+
}
139+
break
140+
case Status.ADDED:
141+
case Status.CHANGED:
142+
Logger.info("目录 status = $status:$inputFile.absolutePath")
143+
File modified = modifyClassFile(dir, inputFile, context.getTemporaryDir())
144+
if (destFile.exists()) {
145+
destFile.delete()
146+
}
147+
if (modified != null) {
148+
FileUtils.copyFile(modified, destFile)
149+
modified.delete()
150+
} else {
151+
FileUtils.copyFile(inputFile, destFile)
152+
}
153+
break
154+
default:
155+
break
156+
}
157+
131158
}
132-
FileUtils.copyDirectory(directoryInput.file, dest)
133-
modifyMap.entrySet().each {
134-
Map.Entry<String, File> en ->
135-
File target = new File(dest.absolutePath + en.getKey())
136-
if (target.exists()) {
137-
target.delete()
138-
}
139-
FileUtils.copyFile(en.getValue(), target)
140-
en.getValue().delete()
159+
} else {
160+
FileUtils.copyDirectory(dir, dest)
161+
dir.traverse(type: FileType.FILES, nameFilter: ~/.*\.class/) {
162+
File inputFile ->
163+
waitableExecutor.execute(new Callable<Object>() {
164+
@Override
165+
Object call() throws Exception {
166+
File modified = modifyClassFile(dir, inputFile, context.getTemporaryDir())
167+
if (modified != null) {
168+
File target = new File(inputFile.absolutePath.replace(srcDirPath, destDirPath))
169+
if (target.exists()) {
170+
target.delete()
171+
}
172+
FileUtils.copyFile(modified, target)
173+
modified.delete()
174+
}
175+
return null
176+
}
177+
})
141178
}
142179
}
180+
143181
}
144182
}
183+
184+
waitableExecutor.waitForTasksWithQuickFail(true)
185+
186+
println("[SensorsAnalytics]: 此次编译共耗时:${System.currentTimeMillis() - startTime}毫秒")
187+
}
188+
189+
void forEachJar(boolean isIncremental,JarInput jarInput,TransformOutputProvider outputProvider,Context context){
190+
String destName = jarInput.file.name
191+
/**
192+
* 截取文件路径的md5值重命名输出文件,因为可能同名,会覆盖
193+
*/
194+
def hexName = DigestUtils.md5Hex(jarInput.file.absolutePath).substring(0, 8)
195+
if (destName.endsWith(".jar")) {
196+
destName = destName.substring(0, destName.length() - 4)
197+
}
198+
/** 获得输出文件*/
199+
File destFile = outputProvider.getContentLocation(destName + "_" + hexName, jarInput.contentTypes, jarInput.scopes, Format.JAR)
200+
if (isIncremental) {
201+
Status status = jarInput.getStatus()
202+
switch (status) {
203+
case Status.NOTCHANGED:
204+
break
205+
case Status.ADDED:
206+
case Status.CHANGED:
207+
Logger.info("jar status = $status:$destFile.absolutePath")
208+
transformJar(destFile,jarInput,context)
209+
break
210+
case Status.REMOVED:
211+
Logger.info("jar status = $status:$destFile.absolutePath")
212+
if (destFile.exists()) {
213+
FileUtils.forceDelete(destFile)
214+
}
215+
break
216+
default:
217+
break
218+
}
219+
} else {
220+
transformJar(destFile,jarInput,context)
221+
}
222+
}
223+
224+
void transformJar(File dest,JarInput jarInput,Context context) {
225+
def modifiedJar = null
226+
if (!transformHelper.disableJar || jarInput.file.absolutePath.contains('SensorsAnalyticsSDK')) {
227+
Logger.info("开始遍历 jar:" + jarInput.file.absolutePath)
228+
modifiedJar = modifyJarFile(jarInput.file, context.getTemporaryDir())
229+
Logger.info("结束遍历 jar:" + jarInput.file.absolutePath)
230+
}
231+
if (modifiedJar == null) {
232+
modifiedJar = jarInput.file
233+
}
234+
FileUtils.copyFile(modifiedJar, dest)
145235
}
146236

147237
/**
@@ -219,6 +309,10 @@ class SensorsAnalyticsTransform extends Transform {
219309
} catch (UnsupportedOperationException e) {
220310
throw e
221311
} catch (Exception ex) {
312+
ex.printStackTrace()
313+
if (transformHelper.debug) {
314+
throw new Error()
315+
}
222316
return srcByteCode
223317
}
224318
}
@@ -235,6 +329,10 @@ class SensorsAnalyticsTransform extends Transform {
235329
} catch (UnsupportedOperationException e) {
236330
throw e
237331
} catch(Exception ex) {
332+
ex.printStackTrace()
333+
if (transformHelper.debug) {
334+
throw new Error()
335+
}
238336
return srcClass
239337
}
240338
}
@@ -277,7 +375,7 @@ class SensorsAnalyticsTransform extends Transform {
277375
return modified
278376
}
279377

280-
private String path2ClassName(String pathName) {
378+
private static String path2ClassName(String pathName) {
281379
pathName.replace(File.separator, ".").replace(".class", "")
282380
}
283381
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class SensorsAnalyticsTransformHelper {
1212

1313
boolean useInclude
1414

15+
boolean debug
16+
1517
HashSet<String> exclude = ['com.sensorsdata.analytics.android.sdk', 'android.support', 'androidx']
1618
HashSet<String> include = ['butterknife.internal.DebouncingOnClickListener',
1719
'com.jakewharton.rxbinding.view.ViewClickOnSubscribe',
@@ -25,6 +27,7 @@ class SensorsAnalyticsTransformHelper {
2527
useInclude = extension.useInclude
2628
disableJar = extension.disableJar
2729
lambdaEnabled = extension.lambdaEnabled
30+
debug = extension.debug
2831
HashSet<String> excludePackages = extension.exclude
2932
if (excludePackages != null) {
3033
exclude.addAll(excludePackages)

0 commit comments

Comments
 (0)