Skip to content
This repository was archived by the owner on Jan 22, 2023. It is now read-only.

Commit eb29f2a

Browse files
authored
Merge pull request #71 from artyomd/development
version 0.4.1
2 parents 424d3fd + a3cdb51 commit eb29f2a

File tree

17 files changed

+142
-114
lines changed

17 files changed

+142
-114
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ android:
33
components:
44
- platform-tools
55
- build-tools-28.0.3
6-
- android-28
6+
- android-29
77
script:
88
- cd .buildscript/
99
- ./before.sh

injector-android-example/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
compileSdkVersion 28
4+
compileSdkVersion 29
55
defaultConfig {
66
applicationId "app.artyomd.inject.example"
77
minSdkVersion 16
8-
targetSdkVersion 28
8+
targetSdkVersion 29
99
versionCode 1
1010
versionName "1.0"
1111
}
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
package app.artyomd.injector.example;
22

3-
import app.artyomd.injector.DexUtils;
4-
53
import java.io.File;
64
import java.util.ArrayList;
75
import java.util.List;
86

7+
import app.artyomd.injector.DexUtils;
8+
99
public class Application extends android.app.Application {
1010
@Override
1111
public void onCreate() {
1212
super.onCreate();
13-
File dexPath = new File(getFilesDir() + "/dex", "lottie.zip");
13+
File dexPath = new File(getFilesDir() + "/dex", "inject.zip");
1414
if (!dexPath.exists()) {
15-
DexUtils.prepareDex(getApplicationContext(), dexPath, "lottie.zip");
15+
DexUtils.prepareDex(getApplicationContext(), dexPath, "inject.zip");
1616
}
1717
List<File> dexs = new ArrayList<>();
1818
dexs.add(dexPath);
19-
DexUtils.loadDex(getApplicationContext(), dexs);
19+
try {
20+
DexUtils.loadDex(getApplicationContext(), dexs);
21+
} catch (Exception e) {
22+
e.printStackTrace();
23+
}
2024
}
2125
}
26+

injector-android-example/lib/build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ apply plugin: 'com.android.library'
22
apply plugin: 'app.artyomd.injector'
33

44
android {
5-
compileSdkVersion 28
5+
compileSdkVersion 29
66
defaultConfig {
77
minSdkVersion 16
8-
targetSdkVersion 28
8+
targetSdkVersion 29
99
}
1010
lintOptions {
1111
abortOnError false
@@ -22,7 +22,5 @@ dependencies {
2222
}
2323
injectConfig {
2424
enabled = true
25-
groups = [
26-
"lottie": ["com.airbnb.android"]
27-
]
25+
forceExcludeGroups = ["com.squareup.okio"]
2826
}

injector-android-example/lib/src/main/assets/lottie.zip renamed to injector-android-example/lib/src/main/assets/inject.zip

File renamed without changes.

injector-android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ repositories {
2323
}
2424

2525
android {
26-
compileSdkVersion 28
26+
compileSdkVersion 29
2727
defaultConfig {
2828
minSdkVersion 15
29-
targetSdkVersion 28
29+
targetSdkVersion 29
3030
}
3131
}
3232

injector-android/src/main/java/app/artyomd/injector/DexUtils.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.io.FileOutputStream;
1010
import java.io.IOException;
1111
import java.io.OutputStream;
12+
import java.lang.reflect.InvocationTargetException;
1213
import java.util.List;
1314

1415
public class DexUtils {
@@ -21,13 +22,11 @@ public class DexUtils {
2122
* @param context context
2223
* @param list list with dex files
2324
*/
24-
public static void loadDex(Context context, List<File> list) {
25-
try {
26-
File optimizedDir = context.getDir("outdex", Context.MODE_PRIVATE);
27-
DexInjector.installSecondaryDexes(context.getClassLoader(), optimizedDir, list);
28-
} catch (Exception ex) {
29-
Log.e(TAG, ex.toString());
30-
}
25+
public static void loadDex(Context context, List<File> list) throws IllegalAccessException,
26+
IOException, InstantiationException, ClassNotFoundException, NoSuchMethodException,
27+
InvocationTargetException, NoSuchFieldException {
28+
File optimizedDir = context.getDir("outdex", Context.MODE_PRIVATE);
29+
DexInjector.installSecondaryDexes(context.getClassLoader(), optimizedDir, list);
3130
}
3231

3332
/**

injector/src/main/java/app/artyomd/injector/InjectorPlugin.java

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
import org.gradle.api.Plugin;
1111
import org.gradle.api.Project;
1212
import org.gradle.api.artifacts.Configuration;
13-
import org.gradle.api.artifacts.DependencyResolutionListener;
14-
import org.gradle.api.artifacts.ResolvableDependencies;
13+
import org.gradle.api.artifacts.Dependency;
1514
import org.gradle.api.artifacts.ResolvedArtifact;
1615
import org.gradle.api.tasks.TaskProvider;
1716
import org.jetbrains.annotations.NotNull;
@@ -32,12 +31,13 @@ public class InjectorPlugin implements Plugin<Project> {
3231
private Set<AndroidArchiveLibrary> aars;
3332

3433
@Override
35-
public void apply(@NotNull Project project) {
36-
this.project = project;
34+
public void apply(@NotNull Project target) {
35+
this.project = target;
3736
createExtension();
3837
createConfiguration();
3938
createExtractAARsTask();
40-
project.afterEvaluate(project1 -> {
39+
target.afterEvaluate(project1 -> {
40+
System.out.println("After evaluate");
4141
resolveArtifacts();
4242
if (jars.isEmpty() && aars.isEmpty()) {
4343
return;
@@ -63,24 +63,6 @@ private void createConfiguration() {
6363
injectConf = project.getConfigurations().create("inject");
6464
injectConf.setVisible(false);
6565
injectConf.setTransitive(true);
66-
project.getGradle().addListener(new DependencyResolutionListener() {
67-
@Override
68-
public void beforeResolve(@NotNull ResolvableDependencies dependencies) {
69-
injectConf.getDependencies().forEach(dependency -> {
70-
if (extension.checkGroup(dependency.getGroup()) && extension.checkName(dependency.getName())) {
71-
project.getDependencies().add("compileOnly", dependency);
72-
} else if (!extension.checkForceExcluded(dependency)) {
73-
project.getDependencies().add("implementation", dependency);
74-
}
75-
});
76-
project.getGradle().removeListener(this);
77-
}
78-
79-
@Override
80-
public void afterResolve(@NotNull ResolvableDependencies dependencies) {
81-
//Nothing to do
82-
}
83-
});
8466
}
8567

8668
private void createExtractAARsTask() {
@@ -91,14 +73,29 @@ private void createExtractAARsTask() {
9173
private void resolveArtifacts() {
9274
Set<ResolvedArtifact> jars = new HashSet<>();
9375
Set<AndroidArchiveLibrary> aars = new HashSet<>();
76+
9477
injectConf.getResolvedConfiguration().getResolvedArtifacts().forEach(resolvedArtifact -> {
95-
if (extension.checkArtifact(resolvedArtifact) && !extension.checkForceExcluded(resolvedArtifact)) {
78+
Dependency dependency = Utils.createDependencyFrom(resolvedArtifact);
79+
if (!extension.isExcluded(resolvedArtifact) && !extension.isForceExcluded(resolvedArtifact)) {
9680
System.out.println("inject-->[injection detected][" + resolvedArtifact.getType() + ']' + resolvedArtifact.getModuleVersion().getId());
9781
if ("jar".equals(resolvedArtifact.getType())) {
9882
jars.add(resolvedArtifact);
9983
} else if ("aar".equals(resolvedArtifact.getType())) {
10084
aars.add(new AndroidArchiveLibrary(project, resolvedArtifact));
10185
}
86+
87+
System.out.println("compileOnly:" + resolvedArtifact.getName());
88+
project.getDependencies().add("compileOnly", dependency);
89+
} else {
90+
System.out.println("inject-->[injection skipped][" + resolvedArtifact.getType() + ']' + resolvedArtifact.getModuleVersion().getId());
91+
92+
if (extension.isForceExcluded(dependency)) {
93+
System.out.println("implementation:" + dependency.getName());
94+
project.getDependencies().add("implementation", dependency);
95+
} else {
96+
System.out.println("compileOnly:" + resolvedArtifact.getName());
97+
project.getDependencies().add("compileOnly", dependency);
98+
}
10299
}
103100
});
104101
this.jars = Collections.unmodifiableSet(jars);

injector/src/main/java/app/artyomd/injector/VariantProcessor.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121

2222
import javax.annotation.Nonnull;
2323
import javax.xml.parsers.ParserConfigurationException;
24-
import java.io.*;
24+
import java.io.BufferedWriter;
25+
import java.io.File;
26+
import java.io.FileWriter;
27+
import java.io.IOException;
28+
import java.io.PrintWriter;
2529
import java.util.ArrayList;
2630
import java.util.HashSet;
2731
import java.util.List;
@@ -38,8 +42,8 @@ class VariantProcessor {
3842
private JavaVersion sourceCompatibilityVersion;
3943
private JavaVersion targetCompatibilityVersion;
4044

41-
private Set<AndroidArchiveLibrary> androidArchiveLibraries;
42-
private Set<ResolvedArtifact> jarFiles;
45+
private Set<? extends AndroidArchiveLibrary> androidArchiveLibraries;
46+
private Set<? extends ResolvedArtifact> jarFiles;
4347

4448
private String variantName;
4549
private String projectPackageName;
@@ -51,18 +55,19 @@ class VariantProcessor {
5155
this.variantName = variant.getName();
5256
this.variantName = variantName.substring(0, 1).toUpperCase() + variantName.substring(1);
5357
try {
54-
projectPackageName = new XmlSlurper().parse(androidExtension.getSourceSets().getByName("main").getManifest().getSrcFile()).getProperty("@package").toString();
58+
projectPackageName = new XmlSlurper().parse(androidExtension.getSourceSets().getByName("main").getManifest()
59+
.getSrcFile()).getProperty("@package").toString();
5560
} catch (IOException | SAXException | ParserConfigurationException e) {
5661
e.printStackTrace();
5762
}
5863
}
5964

60-
public void setAndroidArchiveLibraries(Set<AndroidArchiveLibrary> androidArchiveLibraries) {
61-
this.androidArchiveLibraries = androidArchiveLibraries;
65+
public void setAndroidArchiveLibraries(Set<? extends AndroidArchiveLibrary> androidArchiveLibraries) {
66+
this.androidArchiveLibraries = new HashSet<>(androidArchiveLibraries);
6267
}
6368

64-
public void setJarFiles(Set<ResolvedArtifact> jarFiles) {
65-
this.jarFiles = jarFiles;
69+
public void setJarFiles(Set<? extends ResolvedArtifact> jarFiles) {
70+
this.jarFiles = new HashSet<>(jarFiles);
6671
}
6772

6873
public void processVariant(InjectorExtension extension) {
@@ -219,9 +224,9 @@ private void createDexTask(InjectorExtension extension) {
219224
sourceCompatibilityVersion, targetCompatibilityVersion);
220225

221226
taskProvider.configure(createInjectDexes -> {
222-
TaskProvider extractAARsTask = project.getTasks().named(InjectorPlugin.EXTRACT_AARS_TASK_NAME);
223-
TaskProvider assembleTask = project.getTasks().named("assemble" + variantName);
224-
TaskProvider rGenerationTask = project.getTasks().named("generate" + variantName + "RFile");
227+
TaskProvider<?> extractAARsTask = project.getTasks().named(InjectorPlugin.EXTRACT_AARS_TASK_NAME);
228+
TaskProvider<?> assembleTask = project.getTasks().named("assemble" + variantName);
229+
TaskProvider<?> rGenerationTask = project.getTasks().named("generate" + variantName + "RFile");
225230
createInjectDexes.dependsOn(extractAARsTask);
226231
createInjectDexes.dependsOn(rGenerationTask);
227232
createInjectDexes.dependsOn(assembleTask);

injector/src/main/java/app/artyomd/injector/extension/InjectorExtension.java

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.List;
1111
import java.util.Map;
1212

13-
@SuppressWarnings({"unused"})
13+
@SuppressWarnings("unused")
1414
public class InjectorExtension {
1515
private boolean enabled = true;
1616
private List<String> defaultExcludeGroups = new ArrayList<>();
@@ -19,7 +19,7 @@ public class InjectorExtension {
1919
private List<String> forceExcludeNames = new ArrayList<>();
2020
private List<String> forceExcludeGroups = new ArrayList<>();
2121
private String dexLocation = "/outputs/inject/";
22-
private String defaultDexName = "inject.dex";
22+
private String defaultDexName = "inject";
2323
private Map<String, List<String>> groups = new HashMap<>();
2424

2525
public InjectorExtension() {
@@ -49,69 +49,65 @@ public void setDexLocation(String dexLocation) {
4949
}
5050

5151
public void setExcludeGroups(List<String> excludeGroups) {
52-
this.excludeGroups = excludeGroups;
52+
this.excludeGroups = new ArrayList<>(excludeGroups);
5353
}
5454

5555
public void setExcludeNames(List<String> excludeNames) {
56-
this.excludeNames = excludeNames;
56+
this.excludeNames = new ArrayList<>(excludeNames);
5757
}
5858

5959
public void setForceExcludeNames(List<String> forceExcludeNames) {
60-
this.forceExcludeNames = forceExcludeNames;
60+
this.forceExcludeNames = new ArrayList<>(forceExcludeNames);
6161
}
6262

6363
public void setForceExcludeGroups(List<String> forceExcludeGroups) {
64-
this.forceExcludeGroups = forceExcludeGroups;
64+
this.forceExcludeGroups = new ArrayList<>(forceExcludeGroups);
6565
}
6666

6767
public void setDefaultDexName(String defaultDexName) {
6868
this.defaultDexName = defaultDexName;
6969
}
7070

71-
public void setGroups(Map<String, List<String>> groups) {
72-
this.groups = groups;
71+
public void setGroups(Map<String, ? extends List<String>> groups) {
72+
this.groups = new HashMap<>(groups);
7373
}
7474

75-
public boolean checkArtifact(ResolvedArtifact artifact) {
75+
public boolean isExcluded(ResolvedArtifact artifact) {
7676
ModuleVersionIdentifier id = artifact.getModuleVersion().getId();
77-
return checkGroup(id.getGroup()) && checkName(id.getName());
77+
return isGroupExcluded(id.getGroup()) || isNameExcluded(id.getName());
7878
}
7979

80-
public boolean checkForceExcluded(ResolvedArtifact artifact) {
80+
public boolean isExcluded(Dependency dependency) {
81+
return isGroupExcluded(dependency.getGroup()) || isNameExcluded(dependency.getName());
82+
}
83+
84+
private boolean isNameExcluded(String name) {
85+
return Utils.listContainsMatcher(name, excludeNames);
86+
}
87+
88+
private boolean isGroupExcluded(String group) {
89+
return group != null && (Utils.listContainsMatcher(group, defaultExcludeGroups)
90+
|| Utils.listContainsMatcher(group, excludeGroups));
91+
}
92+
93+
public boolean isForceExcluded(ResolvedArtifact artifact) {
8194
ModuleVersionIdentifier id = artifact.getModuleVersion().getId();
82-
String name = id.getName();
83-
String group = id.getGroup();
84-
return Utils.listContainsMatcher(name, forceExcludeNames) || Utils.listContainsMatcher(group, forceExcludeGroups);
95+
return isGroupForceExcluded(id.getGroup()) || isNameForceExcluded(id.getName());
8596
}
8697

87-
public boolean checkForceExcluded(Dependency dependency) {
88-
String name = dependency.getName();
89-
for (String excludeName : forceExcludeNames) {
90-
if (name.matches(excludeName)) {
91-
return true;
92-
}
93-
}
94-
String group = dependency.getGroup();
95-
if (group != null) {
96-
for (String excludeName : forceExcludeGroups) {
97-
if (group.matches(excludeName)) {
98-
return true;
99-
}
100-
}
101-
}
102-
return false;
98+
public boolean isForceExcluded(Dependency dependency) {
99+
return isGroupForceExcluded(dependency.getGroup()) || isNameForceExcluded(dependency.getName());
103100
}
104101

105-
public boolean checkName(String name) {
106-
return !Utils.listContainsMatcher(name, excludeNames);
102+
private boolean isNameForceExcluded(String name) {
103+
return Utils.listContainsMatcher(name, forceExcludeNames);
107104
}
108105

109-
public boolean checkGroup(String group) {
110-
return !Utils.listContainsMatcher(group, defaultExcludeGroups)
111-
&& !Utils.listContainsMatcher(group, excludeGroups);
106+
private boolean isGroupForceExcluded(String group) {
107+
return group != null && Utils.listContainsMatcher(group, forceExcludeGroups);
112108
}
113109

114-
public Map<String, List<ResolvedArtifact>> getDexes(List<ResolvedArtifact> artifacts) {
110+
public Map<String, List<ResolvedArtifact>> getDexes(List<? extends ResolvedArtifact> artifacts) {
115111
Map<String, List<ResolvedArtifact>> dexMap = new HashMap<>();
116112
artifacts.forEach(resolvedArtifact -> {
117113
List<String> names = getDexName(resolvedArtifact);

0 commit comments

Comments
 (0)