Skip to content

Commit 223f8b1

Browse files
committed
支持完全自定义
1 parent 245c92a commit 223f8b1

File tree

7 files changed

+245
-53
lines changed

7 files changed

+245
-53
lines changed

README.md

Lines changed: 171 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,6 @@ androidJunkCode {
5656
resPrefix = "junk_"
5757
drawableCount = 300
5858
stringCount = 300
59-
60-
//如果不想用插件默认生成的代码,可通过下面实现自定义。注意,修改生成方式后必须先clean再build才生效
61-
typeGenerator = { typeBuilder ->
62-
//自定义类实现(类名已经实现随机,Activity类已经实现了onCreate,其它自己实现随机)
63-
//注意设置了此实现将忽略methodGenerator
64-
//TypeSpec.Builder用法请参考(https://github.com/square/javapoet)
65-
}
66-
methodGenerator = { methodBuilder ->
67-
//自定义方法实现(方法名已经实现随机,其它自己实现随机)
68-
//MethodSpec.Builder用法请参考(https://github.com/square/javapoet)
69-
}
70-
layoutGenerator = { stringBuilder ->
71-
//自定义drawable实现(自己实现随机)
72-
}
73-
drawableGenerator = { stringBuilder ->
74-
//自定义layout实现(自己实现随机)
75-
}
7659
}
7760
variantConfig {
7861
//注意:这里的debug,release为变体名称,如果没有设置productFlavors就是buildType名称,如果有设置productFlavors就是flavor+buildType,例如(freeRelease、proRelease)
@@ -89,6 +72,177 @@ androidJunkCode {
8972
-keep class cn.hx.plugin.ui.** {*;}
9073
```
9174

75+
**如果不想用插件默认生成的代码,可通过下面实现自定义。注意,修改生成方式后必须先clean再build才生效**
76+
77+
```groovy
78+
androidJunkCode {
79+
variantConfig {
80+
release {
81+
packageBase = "cn.hx.plugin.ui"
82+
packageCount = 30
83+
activityCountPerPackage = 30
84+
excludeActivityJavaFile = false
85+
otherCountPerPackage = 50
86+
methodCountPerClass = 20
87+
resPrefix = "junk_"
88+
drawableCount = 300
89+
stringCount = 300
90+
91+
//自定义生成包名(设置此项后packageBase将无效)
92+
//注意,要把生成的包名加入混淆文件
93+
packageCreator = { tuple2 ->
94+
//int:下标 [0,packageCount)
95+
def index = tuple2.first
96+
//StringBuilder: 生成包名格式xx.xx.xx
97+
def packageNameBuilder = tuple2.second
98+
packageNameBuilder.append("cn.hx.package" + index)
99+
}
100+
101+
/**
102+
* 自定义生成Activity
103+
*/
104+
activityCreator = { tuple4 ->
105+
//int:下标 [0,activityCountPerPackage)
106+
def index = tuple4.first
107+
//StringBuilder: 生成Activity文件名
108+
def activityNameBuilder = tuple4.second
109+
//StringBuilder: 生成layout文件名
110+
def layoutNameBuilder = tuple4.third
111+
//StringBuilder: 生成layout内容
112+
def layoutContentBuilder = tuple4.fourth
113+
114+
//例
115+
activityNameBuilder.append("Activity${index}")
116+
layoutNameBuilder.append("activity_${index}")
117+
layoutContentBuilder.append('''<?xml version="1.0" encoding="utf-8"?>
118+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
119+
android:layout_width="match_parent"
120+
android:layout_height="match_parent"
121+
android:orientation="vertical">
122+
123+
<TextView
124+
android:layout_width="wrap_content"
125+
android:layout_height="wrap_content"
126+
android:layout_gravity="center" />
127+
</LinearLayout>''')
128+
}
129+
130+
//自定义生成类名(Activity除外)
131+
classNameCreator = { tuple2 ->
132+
//int:下标 [0,otherCountPerPackage)
133+
def index = tuple2.first
134+
//StringBuilder: 生成Java文件名
135+
def classNameBuilder = tuple2.second
136+
137+
//例
138+
classNameBuilder.append("Class${index}")
139+
}
140+
141+
//自定义生成方法名
142+
methodNameCreator = { tuple2 ->
143+
//int:下标 [0,methodCountPerClass)
144+
def index = tuple2.first
145+
//StringBuilder: 生成的方法名
146+
def classNameBuilder = tuple2.second
147+
148+
//例
149+
classNameBuilder.append("method${index}")
150+
}
151+
152+
//自定义生成drawable(只支持xml)
153+
drawableCreator = { tuple3 ->
154+
//int:下标 [0,drawableCount)
155+
def index = tuple3.first
156+
//StringBuilder: 生成drawable文件名
157+
def fileNameBuilder = tuple3.second
158+
//StringBuilder: 生成drawable文件内容
159+
def contentBuilder = tuple3.third
160+
161+
//例
162+
fileNameBuilder.append("drawable${index}")
163+
contentBuilder.append('''<?xml version="1.0" encoding="utf-8"?>
164+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
165+
<corners android:radius="4dp" />
166+
<stroke
167+
android:width="1dp"
168+
android:color="#333333" />
169+
</shape>
170+
''')
171+
}
172+
173+
//自定义生成 string
174+
stringCreator = { tuple3 ->
175+
//int:下标 [0,drawableCount)
176+
def index = tuple3.first
177+
//StringBuilder: 生成string名
178+
def keyBuilder = tuple3.second
179+
//StringBuilder: 生成string值
180+
def valueBuilder = tuple3.third
181+
182+
//例
183+
keyBuilder.append("string${index}")
184+
valueBuilder.append("value${index}")
185+
}
186+
187+
//自定义生成keep.xm
188+
keepCreator = { tuple2 ->
189+
//StringBuilder:生成文件名
190+
def fileNameBuilder = tuple2.first
191+
//StringBuilder: 生成的文件内容
192+
def contentBuilder = tuple2.second
193+
194+
//例
195+
fileNameBuilder.append("android_junk_code_keep")
196+
contentBuilder.append( "<resources xmlns:tools=\"http://schemas.android.com/tools\"\n" +
197+
" tools:keep=\"@layout/junk_*, @drawable/junk_*\" />\n")
198+
}
199+
200+
//自定义类实现(类名已经实现随机,Activity类已经实现了onCreate,其它自己实现随机)
201+
//注意设置了此实现将忽略 methodGenerator,methodCountPerClass
202+
//TypeSpec.Builder用法请参考(https://github.com/square/javapoet)
203+
// typeGenerator = { typeBuilder ->
204+
// //例
205+
// for (i in 0..<10) {
206+
// typeBuilder.addMethod(MethodSpec.methodBuilder("method" + i)
207+
// .addCode("" + "int total = 0;\n" + "for (int i = 0; i < 10; i++) {\n" + " total += i;\n" + "}\n")
208+
// .build())
209+
// }
210+
// }
211+
212+
//自定义方法实现(方法名已经实现随机,其它自己实现随机)
213+
//MethodSpec.Builder用法请参考(https://github.com/square/javapoet)
214+
// methodGenerator = { methodBuilder ->
215+
// //例
216+
// methodBuilder.addCode("" + "int total = 0;\n" + "for (int i = 0; i < 10; i++) {\n" + " total += i;\n" + "}\n")
217+
// }
218+
}
219+
}
220+
}
221+
```
222+
223+
如果所有代码生成都不想用插件来完成,可用如下实现。插件只负责把你生成的文件打进包里
224+
```groovy
225+
androidJunkCode {
226+
variantConfig {
227+
release {
228+
javaGenerator = { javaDir ->
229+
//File:java目录
230+
//把你生成的所有java文件放到这个目录下
231+
}
232+
resGenerator = { resDir ->
233+
//File:res目录
234+
//把你生成的所有资源文件放到这个目录下
235+
}
236+
237+
manifestGenerator = { manifestFile ->
238+
//File:AndroidManifest.xml文件
239+
//把你生成的AndroidManifest.xml内容写入到这个文件
240+
}
241+
}
242+
}
243+
}
244+
```
245+
92246
### 打包
93247

94248
执行配置变体的打包命令:assembleXXX(XXX是你配置的变体,如:assembleRelease、assembleFreeRelease)

app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ if (PLUGIN_ENABLE.toBoolean()) {
6868
stringCount = 300
6969

7070
//自定义生成包名(设置此项后packageBase将无效)
71+
//注意,要把生成的包名加入混淆文件
7172
packageCreator = { tuple2 ->
7273
//int:下标 [0,packageCount)
7374
def index = tuple2.first
@@ -172,7 +173,7 @@ if (PLUGIN_ENABLE.toBoolean()) {
172173
//
173174
fileNameBuilder.append("android_junk_code_keep")
174175
contentBuilder.append( "<resources xmlns:tools=\"http://schemas.android.com/tools\"\n" +
175-
" tools:keep=\"@layout/junk_*, @drawable/junk_*\" />\n")
176+
" tools:keep=\"@layout/activity_*, @drawable/drawable*\" />\n")
176177
}
177178

178179
//自定义类实现(类名已经实现随机,Activity类已经实现了onCreate,其它自己实现随机)

app/proguard-rules.pro

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@
2020
# hide the original source file name.
2121
#-renamesourcefileattribute SourceFile
2222

23-
-keep class cn.hx.plugin.ui.** {*;}
23+
-keep class cn.hx.plugin.ui.** {*;}
24+
-keep class cn.hx.package*.** {*;}

library/src/main/groovy/cn/hx/plugin/junkcode/ext/JunkCodeConfig.groovy

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ class JunkCodeConfig {
6161
@Internal
6262
Action<Tuple2<StringBuilder, StringBuilder>> keepCreator = null
6363

64+
@Internal
65+
Action<File> javaGenerator = null
66+
67+
@Internal
68+
Action<File> resGenerator = null
69+
70+
@Internal
71+
Action<File> manifestGenerator = null
72+
6473
@Internal
6574
String name = ""
6675

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

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,38 @@ abstract class AndroidJunkCodeTask extends DefaultTask {
3131
void generateJunkCode() {
3232
javaOutDir.deleteDir()
3333
resOutDir.deleteDir()
34-
for (int i = 0; i < config.packageCount; i++) {
35-
String packageName
36-
if (config.packageCreator) {
37-
def packageNameBuilder = new StringBuffer()
38-
config.packageCreator.execute(new Tuple2(i, packageNameBuilder))
39-
packageName = packageNameBuilder.toString()
40-
} else {
41-
if (config.packageBase.isEmpty()) {
42-
packageName = JunkUtil.generateName(i)
34+
if (config.javaGenerator) {//自定义生成java逻辑
35+
config.javaGenerator.execute(javaOutDir)
36+
} else {
37+
for (int i = 0; i < config.packageCount; i++) {
38+
String packageName
39+
if (config.packageCreator) {
40+
def packageNameBuilder = new StringBuffer()
41+
config.packageCreator.execute(new Tuple2(i, packageNameBuilder))
42+
packageName = packageNameBuilder.toString()
4343
} else {
44-
packageName = config.packageBase + "." + JunkUtil.generateName(i)
44+
if (config.packageBase.isEmpty()) {
45+
packageName = JunkUtil.generateName(i)
46+
} else {
47+
packageName = config.packageBase + "." + JunkUtil.generateName(i)
48+
}
4549
}
50+
def list = JunkUtil.generateActivity(javaOutDir, resOutDir, namespace, packageName, config)
51+
activityList.addAll(list)
52+
JunkUtil.generateJava(javaOutDir, packageName, config)
4653
}
47-
def list = JunkUtil.generateActivity(javaOutDir, resOutDir, namespace, packageName, config)
48-
activityList.addAll(list)
49-
JunkUtil.generateJava(javaOutDir, packageName, config)
5054
}
51-
JunkUtil.generateManifest(manifestOutFile, activityList)
52-
JunkUtil.generateDrawableFiles(resOutDir, config)
53-
JunkUtil.generateStringsFile(resOutDir, config)
54-
JunkUtil.generateKeep(resOutDir, config)
55+
if (config.resGenerator) {//自定义生成res逻辑
56+
config.resGenerator.execute(resOutDir)
57+
} else {
58+
JunkUtil.generateDrawableFiles(resOutDir, config)
59+
JunkUtil.generateStringsFile(resOutDir, config)
60+
JunkUtil.generateKeep(resOutDir, config)
61+
}
62+
if (config.manifestGenerator) {//自定义生成manifest逻辑
63+
config.manifestGenerator.execute(manifestOutFile)
64+
} else {
65+
JunkUtil.generateManifest(manifestOutFile, activityList)
66+
}
5567
}
5668
}

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

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,38 @@ abstract class GenerateJunkCodeTask extends DefaultTask {
3333
def resDir = getResOutputFolder().get().asFile
3434
javaDir.deleteDir()
3535
resDir.deleteDir()
36-
for (int i = 0; i < config.packageCount; i++) {
37-
String packageName
38-
if (config.packageCreator) {
39-
def packageNameBuilder = new StringBuffer()
40-
config.packageCreator.execute(new Tuple2(i, packageNameBuilder))
41-
packageName = packageNameBuilder.toString()
42-
} else {
43-
if (config.packageBase.isEmpty()) {
44-
packageName = JunkUtil.generateName(i)
36+
if (config.javaGenerator) {
37+
config.javaGenerator.execute(javaDir)
38+
} else {
39+
for (int i = 0; i < config.packageCount; i++) {
40+
String packageName
41+
if (config.packageCreator) {
42+
def packageNameBuilder = new StringBuffer()
43+
config.packageCreator.execute(new Tuple2(i, packageNameBuilder))
44+
packageName = packageNameBuilder.toString()
4545
} else {
46-
packageName = config.packageBase + "." + JunkUtil.generateName(i)
46+
if (config.packageBase.isEmpty()) {
47+
packageName = JunkUtil.generateName(i)
48+
} else {
49+
packageName = config.packageBase + "." + JunkUtil.generateName(i)
50+
}
4751
}
52+
def list = JunkUtil.generateActivity(javaDir, resDir, namespace, packageName, config)
53+
activityList.addAll(list)
54+
JunkUtil.generateJava(javaDir, packageName, config)
4855
}
49-
def list = JunkUtil.generateActivity(javaDir, resDir, namespace, packageName, config)
50-
activityList.addAll(list)
51-
JunkUtil.generateJava(javaDir, packageName, config)
5256
}
53-
JunkUtil.generateManifest(getManifestOutputFile().get().asFile, activityList)
54-
JunkUtil.generateDrawableFiles(resDir, config)
55-
JunkUtil.generateStringsFile(resDir, config)
56-
JunkUtil.generateKeep(resDir, config)
57+
if (config.resGenerator) {
58+
config.resGenerator.execute(resOutDir)
59+
} else {
60+
JunkUtil.generateDrawableFiles(resDir, config)
61+
JunkUtil.generateStringsFile(resDir, config)
62+
JunkUtil.generateKeep(resDir, config)
63+
}
64+
if (config.manifestGenerator) {
65+
config.manifestGenerator.execute(getManifestOutputFile().get().asFile)
66+
} else {
67+
JunkUtil.generateManifest(getManifestOutputFile().get().asFile, activityList)
68+
}
5769
}
5870
}

library/src/main/groovy/cn/hx/plugin/junkcode/utils/JunkUtil.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,9 @@ class JunkUtil {
316316
keepName = fileNameBuilder.toString()
317317
keepContent = contentBuilder.toString()
318318
} else {
319+
if (config.resPrefix.isEmpty()) {
320+
return
321+
}
319322
keepName = "android_junk_code_keep"
320323
keepContent = "<resources xmlns:tools=\"http://schemas.android.com/tools\"\n" +
321324
" tools:keep=\"@layout/${config.resPrefix}*, @drawable/${config.resPrefix}*\" />\n"

0 commit comments

Comments
 (0)