Skip to content

Commit 5c6e40e

Browse files
author
huangx
committed
1.0.1 release,优化配置方式
1 parent 934755c commit 5c6e40e

8 files changed

Lines changed: 119 additions & 93 deletions

File tree

README.md

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Android垃圾代码生成插件
22

3+
[![Download](https://api.bintray.com/packages/qq549631030/maven/AndroidJunkCode/images/download.svg) ](https://bintray.com/qq549631030/maven/AndroidJunkCode/_latestVersion)
4+
35
此插件用于做马甲包时,减小马甲包与主包的代码相似度,避免被OPPO、VIVO等应用市场识别为马甲包。
46

57
### 使用方法
@@ -8,7 +10,7 @@
810
```
911
buildscript {
1012
dependencies {
11-
classpath "cn.hx.plugin:android-junk-code:1.0.0"
13+
classpath "cn.hx.plugin:android-junk-code:1.0.1"
1214
}
1315
}
1416
```
@@ -21,14 +23,21 @@ android {
2123
//xxx
2224
}
2325
24-
androidJunkCode {
25-
variants = ["debug"] //要生成垃圾代码的variant列表 eg:["vivoRelease","oppoRelease"]
26-
packages = ["cn.hx.test"] //要在哪些包名下生成Java类 eg:["cn.hx.test","cn.hx.demo"]
27-
activityCountPerPackage = 2 //每个包下生成Activity数量
28-
otherCountPerPackage = 10 //每个包下生成普通类数量
29-
methodCountPerClass = 10 每个类生生成方法数量
30-
resPrefix = "hx_junk_" 生成的layout、drawable、string等资源名前缀
31-
drawableCount = 30 生成drawable资源数量
32-
stringCount = 30 生成string数量
26+
android.applicationVariants.all { variant ->
27+
switch (variant.name) {
28+
case "debug":
29+
case "release":
30+
androidJunkCode.configMap.put(variant.name, {
31+
packageBase = "cn.hx.plugin.ui" //生成java类根包名
32+
packageCount = 30 //生成包数量
33+
activityCountPerPackage = 3 //每个包下生成Activity数量
34+
otherCountPerPackage = 10 //每个类生生成方法数量
35+
methodCountPerClass = 10 //每个类生生成方法数量
36+
resPrefix = "lite_junk_" //生成的layout、drawable、string等资源名前缀
37+
drawableCount = 30 //生成drawable资源数量
38+
stringCount = 30 //生成string数量
39+
})
40+
break
41+
}
3342
}
3443
```

app/build.gradle

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ android {
2424
}
2525
}
2626

27+
android.applicationVariants.all { variant ->
28+
switch (variant.name) {
29+
case "debug":
30+
case "release":
31+
androidJunkCode.configMap.put(variant.name, {
32+
packageBase = "cn.hx.plugin.ui"
33+
packageCount = 30
34+
activityCountPerPackage = 3
35+
otherCountPerPackage = 10
36+
methodCountPerClass = 10
37+
resPrefix = "lite_junk_"
38+
drawableCount = 30
39+
stringCount = 30
40+
})
41+
break
42+
}
43+
}
44+
2745
dependencies {
2846
implementation fileTree(dir: "libs", include: ["*.jar"])
2947
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
@@ -36,16 +54,7 @@ dependencies {
3654

3755
}
3856

39-
androidJunkCode {
40-
variants = ["debug"]
41-
packages = ["cn.hx.test"]
42-
activityCountPerPackage = 2
43-
otherCountPerPackage = 10
44-
methodCountPerClass = 10
45-
resPrefix = "hx_junk_"
46-
drawableCount = 30
47-
stringCount = 30
48-
}
57+
4958
//
5059
//afterEvaluate {
5160
// project.tasks.all { task ->

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ buildscript {
1212
classpath "com.android.tools.build:gradle:4.0.0"
1313
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1414
classpath 'com.novoda:bintray-release:0.9.2'
15-
classpath "cn.hx.plugin:android-junk-code:1.0.0"
15+
classpath "cn.hx.plugin:android-junk-code:1.0.1"
1616

1717
// NOTE: Do not place your application dependencies here; they belong
1818
// in the individual module build.gradle files

library/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ uploadArchives {
5757
// authentication(userName: mavenUserName, password: mavenUserPassword)
5858
// }
5959
repository(url: uri("../repo"))
60-
pom.version = '1.0.0'
60+
pom.version = '1.0.1'
6161
pom.artifactId = 'android-junk-code'
6262
pom.groupId = 'cn.hx.plugin'
6363
pom.project {
Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
package cn.hx.plugin.junkcode.ext
22

33
class AndroidJunkCodeExt {
4-
String[] variants = []
5-
String[] packages = []
6-
int activityCountPerPackage = 0
7-
int otherCountPerPackage = 0
8-
int methodCountPerClass = 0
9-
String resPrefix = "junk_"
10-
int drawableCount = 0
11-
int stringCount = 0
4+
Map<String, Closure<JunkCodeConfig>> configMap = [:]
125
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cn.hx.plugin.junkcode.ext
2+
3+
import org.gradle.api.tasks.Input
4+
5+
class JunkCodeConfig {
6+
@Input
7+
String packageBase = ""
8+
@Input
9+
int packageCount = 0
10+
@Input
11+
int activityCountPerPackage = 0
12+
@Input
13+
int otherCountPerPackage = 0
14+
@Input
15+
int methodCountPerClass = 0
16+
@Input
17+
String resPrefix = "junk_"
18+
@Input
19+
int drawableCount = 0
20+
@Input
21+
int stringCount = 0
22+
}

library/src/main/groovy/cn/hx/plugin/junkcode/plugin/AndroidJunkCodePlugin.groovy

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.hx.plugin.junkcode.plugin
22

33
import cn.hx.plugin.junkcode.ext.AndroidJunkCodeExt
4+
import cn.hx.plugin.junkcode.ext.JunkCodeConfig
45
import cn.hx.plugin.junkcode.task.AndroidJunkCodeTask
56
import com.android.build.gradle.AppExtension
67
import com.android.build.gradle.api.ApplicationVariant
@@ -16,32 +17,33 @@ class AndroidJunkCodePlugin implements Plugin<Project> {
1617
throw IllegalArgumentException("must apply this plugin after 'com.android.application'")
1718
}
1819
def generateJunkCodeExt = project.extensions.create("androidJunkCode", AndroidJunkCodeExt)
19-
android.applicationVariants.all { variant ->
20-
def variantName = variant.name
21-
if (variantName in generateJunkCodeExt.variants) {
22-
def dir = new File(project.buildDir, "generated/source/junk/$variantName")
23-
String packageName = findPackageName(variant)
24-
def generateJunkCodeTask = project.task("generateJunkCode${variantName.capitalize()}", type: AndroidJunkCodeTask) {
25-
manifestPackageName = packageName
26-
packages = generateJunkCodeExt.packages
27-
activityCountPerPackage = generateJunkCodeExt.activityCountPerPackage
28-
otherCountPerPackage = generateJunkCodeExt.otherCountPerPackage
29-
methodCountPerClass = generateJunkCodeExt.methodCountPerClass
30-
resPrefix = generateJunkCodeExt.resPrefix
31-
drawableCount = generateJunkCodeExt.drawableCount
32-
stringCount = generateJunkCodeExt.stringCount
33-
outDir = dir
34-
}
35-
//将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
36-
for (int i = 0; i < variant.sourceSets.size(); i++) {
37-
def sourceSet = variant.sourceSets[i]
38-
if (!sourceSet.manifestFile.exists()) {
39-
android.sourceSets."${sourceSet.name}".manifest.srcFile(new File(dir, "AndroidManifest.xml").absolutePath)
40-
break
20+
project.afterEvaluate {
21+
android.applicationVariants.all { variant ->
22+
def variantName = variant.name
23+
Closure<JunkCodeConfig> junkCodeConfig = generateJunkCodeExt.configMap[variantName]
24+
if (junkCodeConfig) {
25+
def dir = new File(project.buildDir, "generated/source/junk/$variantName")
26+
String packageName = findPackageName(variant)
27+
def generateJunkCodeTask = project.task("generateJunkCode${variantName.capitalize()}", type: AndroidJunkCodeTask) {
28+
junkCodeConfig.delegate = config
29+
junkCodeConfig.resolveStrategy = DELEGATE_FIRST
30+
junkCodeConfig.call()
31+
manifestPackageName = packageName
32+
outDir = dir
33+
}
34+
//将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
35+
for (int i = variant.sourceSets.size() - 1; i >= 0; i--) {
36+
def sourceSet = variant.sourceSets[i]
37+
if (!sourceSet.manifestFile.exists()) {
38+
android.sourceSets."${sourceSet.name}".manifest.srcFile(new File(dir, "AndroidManifest.xml").absolutePath)
39+
break
40+
}
4141
}
42+
android.sourceSets."${variantName}".res.srcDir(new File(dir, "res"))
43+
variant.registerJavaGeneratingTask(generateJunkCodeTask, new File(dir, "java"))
44+
//在执行generateBuildConfig之前执行generateJunkCodeTask
45+
variant.generateBuildConfigProvider.get().dependsOn(generateJunkCodeTask)
4246
}
43-
android.sourceSets."main".res.srcDir(new File(dir, "res"))
44-
variant.registerJavaGeneratingTask(generateJunkCodeTask, dir)
4547
}
4648
}
4749
}

library/src/main/groovy/cn/hx/plugin/junkcode/task/AndroidJunkCodeTask.groovy

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package cn.hx.plugin.junkcode.task
22

3-
4-
import cn.hx.plugin.junkcode.template.ResTemplate
3+
import cn.hx.plugin.junkcode.ext.JunkCodeConfig
54
import cn.hx.plugin.junkcode.template.ManifestTemplate
5+
import cn.hx.plugin.junkcode.template.ResTemplate
66
import com.squareup.javapoet.ClassName
77
import com.squareup.javapoet.JavaFile
88
import com.squareup.javapoet.MethodSpec
99
import com.squareup.javapoet.TypeSpec
1010
import groovy.text.GStringTemplateEngine
1111
import org.gradle.api.DefaultTask
1212
import org.gradle.api.tasks.Input
13+
import org.gradle.api.tasks.Nested
1314
import org.gradle.api.tasks.OutputDirectories
1415
import org.gradle.api.tasks.TaskAction
1516

@@ -21,28 +22,20 @@ class AndroidJunkCodeTask extends DefaultTask {
2122

2223
static abc = "abcdefghijklmnopqrstuvwxyz".toCharArray()
2324

25+
@Nested
26+
JunkCodeConfig config = new JunkCodeConfig()
27+
2428
@Input
2529
String manifestPackageName = ""
26-
@Input
27-
String[] packages = []
28-
@Input
29-
int activityCountPerPackage = 0
30-
@Input
31-
int otherCountPerPackage = 0
32-
@Input
33-
int methodCountPerClass = 0
34-
@Input
35-
String resPrefix = "junk_"
36-
@Input
37-
int drawableCount = 0
38-
@Input
39-
int stringCount = 0
4030

4131
@OutputDirectories
4232
File outDir
4333

4434
@TaskAction
4535
void execute() {
36+
if (outDir.exists()) {
37+
outDir.deleteDir()
38+
}
4639
//通过成类
4740
generateClasses()
4841
//生成资源
@@ -53,28 +46,26 @@ class AndroidJunkCodeTask extends DefaultTask {
5346
* 生成java代码和AndroidManifest.xml
5447
*/
5548
void generateClasses() {
56-
def manifestFile = new File(outDir, "AndroidManifest.xml")
57-
if (manifestFile.exists()) {
58-
manifestFile.delete()
59-
}
60-
packages.each { packageName ->
49+
def javaDir = new File(outDir, "java")
50+
for (int i = 0; i < config.packageCount; i++) {
51+
String packageName = config.packageBase + "." + generateName(i)
6152
//生成Activity
62-
for (int i = 0; i < activityCountPerPackage; i++) {
63-
def activityPreName = generateName(i)
53+
for (int j = 0; j < config.activityCountPerPackage; j++) {
54+
def activityPreName = generateName(j)
6455
generateActivity(packageName, activityPreName)
6556
}
6657
//生成其它类
67-
for (int i = 0; i < otherCountPerPackage; i++) {
68-
def className = generateName(i).capitalize()
58+
for (int j = 0; j < config.otherCountPerPackage; j++) {
59+
def className = generateName(j).capitalize()
6960
def typeBuilder = TypeSpec.classBuilder(className)
70-
for (int j = 0; j < methodCountPerClass; j++) {
71-
def methodName = generateName(j)
61+
for (int k = 0; k < config.methodCountPerClass; k++) {
62+
def methodName = generateName(k)
7263
def methodBuilder = MethodSpec.methodBuilder(methodName)
7364
generateMethods(methodBuilder)
7465
typeBuilder.addMethod(methodBuilder.build())
7566
}
7667
def fileBuilder = JavaFile.builder(packageName, typeBuilder.build())
77-
fileBuilder.build().writeTo(outDir)
68+
fileBuilder.build().writeTo(javaDir)
7869
}
7970
}
8071
}
@@ -133,8 +124,9 @@ class AndroidJunkCodeTask extends DefaultTask {
133124
* @param activityPreName
134125
*/
135126
void generateActivity(String packageName, String activityPreName) {
127+
def javaDir = new File(outDir, "java")
136128
def className = activityPreName.capitalize() + "Activity"
137-
def layoutName = "${resPrefix.toLowerCase()}${packageName.replace(".", "_")}_activity_${activityPreName}"
129+
def layoutName = "${config.resPrefix.toLowerCase()}${packageName.replace(".", "_")}_activity_${activityPreName}"
138130
generateLayout(layoutName)
139131
def typeBuilder = TypeSpec.classBuilder(className)
140132
typeBuilder.superclass(ClassName.get("android.app", "Activity"))
@@ -148,14 +140,14 @@ class AndroidJunkCodeTask extends DefaultTask {
148140
.addStatement("setContentView(\$T.layout.${layoutName})", ClassName.get(manifestPackageName, "R"))
149141
.build())
150142
//其它方法
151-
for (int j = 0; j < methodCountPerClass; j++) {
143+
for (int j = 0; j < config.methodCountPerClass; j++) {
152144
def methodName = generateName(j)
153145
def methodBuilder = MethodSpec.methodBuilder(methodName)
154146
generateMethods(methodBuilder)
155147
typeBuilder.addMethod(methodBuilder.build())
156148
}
157149
def fileBuilder = JavaFile.builder(packageName, typeBuilder.build())
158-
fileBuilder.build().writeTo(outDir)
150+
fileBuilder.build().writeTo(javaDir)
159151
addToManifestByFileIo(className, packageName)
160152
}
161153

@@ -164,17 +156,13 @@ class AndroidJunkCodeTask extends DefaultTask {
164156
*/
165157
void generateRes() {
166158
//生成drawable
167-
for (int i = 0; i < drawableCount; i++) {
168-
def drawableName = "${resPrefix.toLowerCase()}${generateName(i)}"
159+
for (int i = 0; i < config.drawableCount; i++) {
160+
def drawableName = "${config.resPrefix.toLowerCase()}${generateName(i)}"
169161
generateDrawable(drawableName)
170162
}
171163
//生成string
172-
def stringFile = new File(outDir, "res/values/strings.xml")
173-
if (stringFile.exists()) {
174-
stringFile.delete()
175-
}
176-
for (int i = 0; i < stringCount; i++) {
177-
def name = "${resPrefix.toLowerCase()}${generateName(i)}"
164+
for (int i = 0; i < config.stringCount; i++) {
165+
def name = "${config.resPrefix.toLowerCase()}${generateName(i)}"
178166
def value = name
179167
addStringByFileIo(name, value)
180168
}
@@ -242,6 +230,9 @@ class AndroidJunkCodeTask extends DefaultTask {
242230
*/
243231
void addToManifestByFileIo(String activityName, String packageName) {
244232
def manifestFile = new File(outDir, "AndroidManifest.xml")
233+
if (!manifestFile.getParentFile().exists()) {
234+
manifestFile.getParentFile().mkdirs()
235+
}
245236
if (!manifestFile.exists()) {
246237
def template = ManifestTemplate.TEMPLATE
247238
FileWriter writer

0 commit comments

Comments
 (0)