Skip to content

Commit 28925f8

Browse files
author
zhangyang
committed
[feat] 增量编译插件调整
1 parent 521653c commit 28925f8

25 files changed

+210
-351
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
**/captures/
1313
**/*.iml
1414
**/local.properties
15-
local_repo.xml
15+
local_repo.xml
16+
.repo/

.repo/com/kronos/doubleTap/doubleTap/maven-metadata.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
<versioning>
66
<versions>
77
<version>0.1.3-SNAPSHOT</version>
8+
<version>0.1.4-SNAPSHOT</version>
89
</versions>
9-
<lastUpdated>20200508053037</lastUpdated>
10+
<lastUpdated>20200605080259</lastUpdated>
1011
</versioning>
1112
</metadata>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ecfcb947994577acaeef4cde1a250eae
1+
906f7162fe1dbb1e97be03bc877c1e09
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
804f5b5f8350c77cd0302fce8bf9f32c17688a52
1+
e2a4972f0f60a83e3861118bc62eee371d6fcfe4

.repo/com/kronos/plugin/basePlugin/maven-metadata.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
<version>0.1.3-SNAPSHOT</version>
88
<version>0.1.4-SNAPSHOT</version>
99
<version>0.1.5-SNAPSHOT</version>
10+
<version>0.1.6-SNAPSHOT</version>
1011
</versions>
11-
<lastUpdated>20200605074805</lastUpdated>
12+
<lastUpdated>20200605121031</lastUpdated>
1213
</versioning>
1314
</metadata>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
dae181d6cb92e40d36323a75c95a702e
1+
45a6f162d9cfc35bc24e1cfa3571f513
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
dcc5eeb8b6cb3d328f8d2a35cb94799a345ac528
1+
4bf70a16a009ed09c06bd2d531f484cf6a49d0dd

AutoTrackPlugin/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ repositories {
1515
}
1616
dependencies {
1717
implementation 'com.android.tools.build:gradle:3.3.0'
18-
implementation 'com.kronos.plugin:basePlugin:0.1.5-SNAPSHOT'
18+
implementation 'com.kronos.plugin:basePlugin:0.1.6-SNAPSHOT'
1919
// implementation project(':BasePlugin')
2020
implementation 'commons-io:commons-io:2.6'
2121
implementation 'org.javassist:javassist:3.20.0-GA'

BasePlugin/nexus.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
nexus_versionName=0.1.5
1+
nexus_versionName=0.1.7
22
nexus_artifactId=basePlugin
33
nexus_groupId=com.kronos.plugin
44
nexus_description=basePlugin

BasePlugin/src/main/java/com/kronos/plugin/base/BaseTransform.java

+89-34
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
import java.io.FileInputStream;
1919
import java.io.IOException;
2020
import java.util.Collection;
21+
import java.util.Collections;
2122
import java.util.HashMap;
23+
import java.util.HashSet;
24+
import java.util.List;
2225
import java.util.Map;
2326

2427
public class BaseTransform {
@@ -66,9 +69,11 @@ public void startTransform() {
6669
case NOTCHANGED:
6770
break;
6871
case ADDED:
69-
case CHANGED:
7072
foreachJar(dest, jarInput);
7173
break;
74+
case CHANGED:
75+
diffJar(dest, jarInput);
76+
break;
7277
case REMOVED:
7378
try {
7479
deleteScan(dest);
@@ -108,56 +113,87 @@ private void foreachClass(DirectoryInput directoryInput) throws IOException {
108113
break;
109114
case ADDED:
110115
case CHANGED:
116+
try {
117+
FileUtils.touch(destFile);
118+
} catch (Exception ignored) {
119+
Files.createParentDirs(destFile);
120+
}
111121
modifySingleFile(dir, file, dest);
112122
break;
113123
case REMOVED:
114-
deleteSingleFile(destFile, dest);
124+
Log.info(entry);
125+
deleteDirectory(destFile, dest);
115126
break;
116127
}
117128
}
118129
} else {
119130
changeFile(dir, dest);
120131
}
121-
Log.info("||-->结束遍历特定目录 ${dest.absolutePath}");
122132
}
123133

124-
private void deleteSingleFile(File destFile, File dest) {
134+
private void deleteDirectory(File destFile, File dest) {
125135
try {
126-
byte[] bytes = IOUtils.toByteArray(new FileInputStream(destFile));
127-
String absolutePath = destFile.getAbsolutePath().replace(dest.getAbsolutePath() + File.separator, "");
128-
String className = ClassUtils.path2Classname(absolutePath);
129-
if (deleteCallBack != null) {
130-
deleteCallBack.delete(className, bytes);
136+
if (destFile.isDirectory()) {
137+
for (File classFile : com.android.utils.FileUtils.getAllFiles(destFile)) {
138+
deleteSingle(classFile, dest);
139+
}
140+
} else {
141+
deleteSingle(destFile, dest);
131142
}
143+
} catch (Exception e) {
144+
e.printStackTrace();
145+
}
146+
try {
132147
if (destFile.exists()) {
133148
FileUtils.forceDelete(destFile);
134149
}
135-
} catch (Exception e) {
150+
} catch (IOException e) {
136151
e.printStackTrace();
137152
}
153+
}
138154

155+
private void deleteSingle(File classFile, File dest) {
156+
try {
157+
if (classFile.getName().endsWith(".class")) {
158+
String absolutePath = classFile.getAbsolutePath().replace(dest.getAbsolutePath() +
159+
File.separator, "");
160+
String className = ClassUtils.path2Classname(absolutePath);
161+
byte[] bytes = IOUtils.toByteArray(new FileInputStream(classFile));
162+
if (deleteCallBack != null) {
163+
deleteCallBack.delete(className, bytes);
164+
}
165+
}
166+
} catch (Exception e) {
167+
e.printStackTrace();
168+
}
139169
}
140170

141171
private void modifySingleFile(File dir, File file, File dest) throws IOException {
142172
try {
143-
FileUtils.touch(dest);
144-
} catch (Exception ignored) {
145-
//maybe mkdirs fail for some strange reason, try again.
146-
Files.createParentDirs(dest);
147-
}
148-
String absolutePath = file.getAbsolutePath().replace(dir.getAbsolutePath() + File.separator, "");
149-
String className = ClassUtils.path2Classname(absolutePath);
150-
byte[] bytes = IOUtils.toByteArray(new FileInputStream(file));
151-
byte[] modifiedBytes = callBack.process(className, bytes, this);
152-
if (modifiedBytes != null) {
153-
File modified = ClassUtils.saveFile(file, modifiedBytes);
154-
String key = file.getAbsolutePath().replace(dir.getAbsolutePath(), "");
155-
File target = new File(dest.getAbsolutePath() + key);
156-
if (target.exists()) {
157-
target.delete();
173+
String absolutePath = file.getAbsolutePath().replace(dir.getAbsolutePath() + File.separator, "");
174+
String className = ClassUtils.path2Classname(absolutePath);
175+
if (!ClassUtils.checkClassName(className)) {
176+
byte[] bytes = IOUtils.toByteArray(new FileInputStream(file));
177+
byte[] modifiedBytes = null;
178+
try {
179+
modifiedBytes = callBack.process(className, bytes, this);
180+
} catch (Exception ignored) {
181+
182+
}
183+
if (modifiedBytes == null) {
184+
modifiedBytes = bytes;
185+
}
186+
File modified = ClassUtils.saveFile(file, modifiedBytes);
187+
String key = file.getAbsolutePath().replace(dir.getAbsolutePath(), "");
188+
File target = new File(dest.getAbsolutePath() + key);
189+
if (target.exists()) {
190+
target.delete();
191+
}
192+
FileUtils.copyFile(modified, target);
193+
modified.delete();
158194
}
159-
FileUtils.copyFile(modified, target);
160-
modified.delete();
195+
} catch (Exception e) {
196+
e.printStackTrace();
161197
}
162198
}
163199

@@ -193,17 +229,36 @@ private void changeFile(File dir, File dest) throws IOException {
193229
}
194230
}
195231

196-
private void foreachJar(File dest, JarInput jarInput) throws IOException {
197-
File modifiedJar = JarUtils.modifyJarFile(jarInput.getFile(), context.getTemporaryDir(),
198-
callBack, this);
199-
if (modifiedJar == null) {
200-
modifiedJar = jarInput.getFile();
232+
private void foreachJar(File dest, JarInput jarInput) {
233+
try {
234+
File modifiedJar = JarUtils.modifyJarFile(jarInput.getFile(), context.getTemporaryDir(),
235+
callBack, this);
236+
if (modifiedJar == null) {
237+
modifiedJar = jarInput.getFile();
238+
}
239+
FileUtils.copyFile(modifiedJar, dest);
240+
} catch (Exception e) {
241+
e.printStackTrace();
201242
}
202-
FileUtils.copyFile(modifiedJar, dest);
203-
Log.info("||-->结束遍历jar");
204243
}
205244

206245

246+
private void diffJar(File dest, JarInput jarInput) {
247+
try {
248+
HashSet<String> oldJarFileName = JarUtils.scanJarFile(dest);
249+
HashSet<String> newJarFileName = JarUtils.scanJarFile(jarInput.getFile());
250+
SetDiff diff = new SetDiff<>(oldJarFileName, newJarFileName);
251+
List<String> removeList = diff.getRemovedList();
252+
Log.info("diffList:" + removeList);
253+
if (removeList.size() > 0) {
254+
JarUtils.deleteJarScan(dest, removeList, deleteCallBack);
255+
}
256+
foreachJar(dest, jarInput);
257+
} catch (Exception e) {
258+
e.printStackTrace();
259+
}
260+
}
261+
207262
private void deleteScan(File dest) {
208263
try {
209264
JarUtils.deleteJarScan(dest, deleteCallBack);

BasePlugin/src/main/java/com/kronos/plugin/base/JarUtils.java

+44-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.io.IOException;
99
import java.io.InputStream;
1010
import java.util.Enumeration;
11+
import java.util.HashSet;
12+
import java.util.List;
1113
import java.util.jar.JarEntry;
1214
import java.util.jar.JarFile;
1315
import java.util.jar.JarOutputStream;
@@ -21,7 +23,6 @@ public static File modifyJarFile(File jarFile, File tempDir, TransformCallBack c
2123
String hexName = DigestUtils.md5Hex(jarFile.getAbsolutePath()).substring(0, 8);
2224
File optJar = new File(tempDir, hexName + jarFile.getName());
2325
JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(optJar));
24-
2526
/**
2627
* 读取原jar
2728
*/
@@ -36,14 +37,13 @@ public static File modifyJarFile(File jarFile, File tempDir, TransformCallBack c
3637
ZipEntry zipEntry = new ZipEntry(entryName);
3738

3839
jarOutputStream.putNextEntry(zipEntry);
39-
4040
byte[] modifiedClassBytes = null;
4141
byte[] sourceClassBytes = IOUtils.toByteArray(inputStream);
4242
if (entryName.endsWith(".class")) {
4343
try {
4444
modifiedClassBytes = callBack.process(entryName, sourceClassBytes, transform);
4545
} catch (Exception e) {
46-
// e.printStackTrace()
46+
4747
}
4848
}
4949
if (modifiedClassBytes == null) {
@@ -59,6 +59,47 @@ public static File modifyJarFile(File jarFile, File tempDir, TransformCallBack c
5959
}
6060

6161

62+
static HashSet<String> scanJarFile(File jarFile) throws IOException {
63+
HashSet<String> hashSet = new HashSet<>();
64+
JarFile file = new JarFile(jarFile);
65+
Enumeration enumeration = file.entries();
66+
while (enumeration.hasMoreElements()) {
67+
JarEntry jarEntry = (JarEntry) enumeration.nextElement();
68+
String entryName = jarEntry.getName();
69+
if (entryName.endsWith(".class")) {
70+
hashSet.add(entryName);
71+
}
72+
}
73+
file.close();
74+
return hashSet;
75+
}
76+
77+
static void deleteJarScan(File jarFile, List<String> removeClasses, DeleteCallBack callBack) throws IOException {
78+
/**
79+
* 读取原jar
80+
*/
81+
JarFile file = new JarFile(jarFile);
82+
Enumeration enumeration = file.entries();
83+
while (enumeration.hasMoreElements()) {
84+
JarEntry jarEntry = (JarEntry) enumeration.nextElement();
85+
String entryName = jarEntry.getName();
86+
if (entryName.endsWith(".class") && removeClasses.contains(entryName)) {
87+
InputStream inputStream = file.getInputStream(jarEntry);
88+
byte[] sourceClassBytes = IOUtils.toByteArray(inputStream);
89+
try {
90+
if (callBack != null) {
91+
callBack.delete(entryName, sourceClassBytes);
92+
}
93+
} catch (Exception ignored) {
94+
95+
}
96+
}
97+
98+
}
99+
file.close();
100+
}
101+
102+
62103
static void deleteJarScan(File jarFile, DeleteCallBack callBack) throws IOException {
63104
/**
64105
* 读取原jar
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.kronos.plugin.base;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
public class SetDiff<T> {
8+
9+
private List<T> addedList = new ArrayList<>();
10+
private List<T> unchangedList = new ArrayList<>();
11+
private List<T> removedList = new ArrayList<>();
12+
13+
public SetDiff(Set<T> beforeList, Set<T> afterList) {
14+
addedList.addAll(afterList); // Will contain only new elements when all elements in the Before-list are removed.
15+
beforeList.forEach(e -> {
16+
boolean b = addedList.remove(e) ? unchangedList.add(e) : removedList.add(e);
17+
});
18+
}
19+
20+
public List<T> getAddedList() {
21+
return addedList;
22+
}
23+
24+
public List<T> getUnchangedList() {
25+
return unchangedList;
26+
}
27+
28+
public List<T> getRemovedList() {
29+
return removedList;
30+
}
31+
}

app/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android-extensions'
33
apply plugin: 'kotlin-android'
4-
apply plugin: 'auto-track'
4+
apply plugin: 'doubleTap'
55

66
android {
77
compileSdkVersion 28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.wallstreetcn.sample;
2+
3+
public class A {
4+
public void empty(){
5+
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.wallstreetcn.sample;
2+
3+
public class NewTest {
4+
}

0 commit comments

Comments
 (0)