Skip to content

Commit 9a36948

Browse files
committed
更换新的配置方式
1 parent 4738c1f commit 9a36948

File tree

11 files changed

+163
-107
lines changed

11 files changed

+163
-107
lines changed

README.md

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ buildscript {
1111
mavenCentral()
1212
}
1313
dependencies {
14-
classpath "com.github.qq549631030:android-junk-code:1.0.7"
14+
classpath "com.github.qq549631030:android-junk-code:1.0.8"
1515
}
1616
}
1717
```
@@ -20,29 +20,45 @@ buildscript {
2020

2121

2222
app目录的build.gradle模块中:
23-
```
23+
```groovy
2424
apply plugin: 'com.android.application'
2525
apply plugin: 'android-junk-code'
2626
27-
android {
28-
//xxx
27+
androidJunkCode {
28+
variantConfig {
29+
release {//变体名称,如果没有设置productFlavors就是buildType名称,如果有设置productFlavors就是flavor+buildType,例如(freeRelease、proRelease)
30+
packageBase = "cn.hx.plugin.ui" //生成java类根包名
31+
packageCount = 30 //生成包数量
32+
activityCountPerPackage = 3 //每个包下生成Activity类数量
33+
excludeActivityJavaFile = false //是否排除生成Activity的Java文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
34+
otherCountPerPackage = 50 //每个包下生成其它类的数量
35+
methodCountPerClass = 20 //每个类下生成方法数量
36+
resPrefix = "junk_" //生成的layout、drawable、string等资源名前缀
37+
drawableCount = 300 //生成drawable资源数量
38+
stringCount = 300 //生成string数量
39+
}
40+
}
2941
}
42+
```
3043

31-
android.applicationVariants.all { variant ->
32-
switch (variant.name) {//变体名称,如果没有设置productFlavors就是buildType名称,如果有设置productFlavors就是flavor+buildType,例如(freeRelease、proRelease)
33-
case "release":
34-
androidJunkCode.configMap.put(variant.name, {
35-
packageBase = "cn.hx.plugin.ui" //生成java类根包名
36-
packageCount = 30 //生成包数量
37-
activityCountPerPackage = 3 //每个包下生成Activity类数量
38-
excludeActivityJavaFile = false //是否排除生成Activity的Java文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
39-
otherCountPerPackage = 50 //每个包下生成其它类的数量
40-
methodCountPerClass = 20 //每个类下生成方法数量
41-
resPrefix = "junk_" //生成的layout、drawable、string等资源名前缀
42-
drawableCount = 300 //生成drawable资源数量
43-
stringCount = 300 //生成string数量
44-
})
45-
break
44+
**原configMap配置方式已过时,1.0.8版以后请使用variantConfig配置方式"**
45+
如果有多个变体共用一个配置可以这样做
46+
```groovy
47+
androidJunkCode {
48+
def config = {
49+
packageBase = "cn.hx.plugin.ui"
50+
packageCount = 30
51+
activityCountPerPackage = 3
52+
excludeActivityJavaFile = false
53+
otherCountPerPackage = 50
54+
methodCountPerClass = 20
55+
resPrefix = "junk_"
56+
drawableCount = 300
57+
stringCount = 300
58+
}
59+
variantConfig {
60+
debug config
61+
release config
4662
}
4763
}
4864
```

app/build.gradle

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ apply plugin: 'com.getkeepsafe.dexcount'
55
apply plugin: 'kotlin-kapt'
66

77
android {
8-
compileSdkVersion 30
8+
compileSdkVersion 31
99

1010
defaultConfig {
1111
applicationId "cn.hx.plugin.junkcode.demo"
1212
minSdkVersion 16
13-
targetSdkVersion 30
13+
targetSdkVersion 31
1414
versionCode 1
1515
versionName "1.0"
1616
multiDexEnabled true
@@ -32,33 +32,32 @@ android {
3232
}
3333
}
3434

35-
android.applicationVariants.all { variant ->
36-
switch (variant.name) {
37-
case "release":
38-
androidJunkCode.configMap.put(variant.name, {
39-
packageBase = "cn.hx.plugin.ui"
40-
packageCount = 30
41-
activityCountPerPackage = 3
42-
excludeActivityJavaFile = false
43-
otherCountPerPackage = 50
44-
methodCountPerClass = 20
45-
resPrefix = "junk_"
46-
drawableCount = 300
47-
stringCount = 300
48-
})
49-
break
35+
androidJunkCode {
36+
def config = {
37+
packageBase = "cn.hx.plugin.ui"
38+
packageCount = 30
39+
activityCountPerPackage = 3
40+
excludeActivityJavaFile = false
41+
otherCountPerPackage = 50
42+
methodCountPerClass = 20
43+
resPrefix = "junk_"
44+
drawableCount = 300
45+
stringCount = 300
46+
}
47+
variantConfig {
48+
debug config
49+
release config
5050
}
5151
}
5252

5353
dependencies {
5454
implementation fileTree(dir: "libs", include: ["*.jar"])
5555
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
5656
implementation 'androidx.multidex:multidex:2.0.1'
57-
implementation 'androidx.core:core-ktx:1.5.0'
58-
implementation 'androidx.appcompat:appcompat:1.3.0'
57+
implementation 'androidx.core:core-ktx:1.6.0'
58+
implementation 'androidx.appcompat:appcompat:1.3.1'
5959
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
6060
testImplementation 'junit:junit:4.13.2'
61-
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
62-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
63-
61+
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
62+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
6463
}

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
android:roundIcon="@mipmap/ic_launcher_round"
1111
android:supportsRtl="true"
1212
android:theme="@style/AppTheme">
13-
<activity android:name=".MainActivity">
13+
<activity
14+
android:name=".MainActivity"
15+
android:exported="true">
1416
<intent-filter>
1517
<action android:name="android.intent.action.MAIN" />
1618

build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
buildscript {
3-
ext.kotlin_version = "1.5.10"
3+
ext.kotlin_version = "1.5.31"
44
repositories {
55
google()
66
mavenCentral()
77
mavenLocal()
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:4.2.1'
10+
classpath 'com.android.tools.build:gradle:7.0.2'
1111
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12-
classpath "com.github.qq549631030:android-junk-code:1.0.7"
13-
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2'
14-
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:2.1.0-RC01"
12+
classpath "com.github.qq549631030:android-junk-code:1.0.8"
13+
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.18.0'
14+
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:3.0.1"
1515

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

gradle.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@ android.useAndroidX=true
1818
# Automatically convert third-party libraries to use AndroidX
1919
android.enableJetifier=true
2020
# Kotlin code style for this project: "official" or "obsolete":
21-
kotlin.code.style=official
21+
kotlin.code.style=official
22+
23+
org.gradle.warning.mode=all
24+
25+
RELEASE_SIGNING_ENABLED=true

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip

library/gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#project
22
GROUP=com.github.qq549631030
3-
VERSION_NAME=1.0.7
3+
VERSION_NAME=1.0.8
44

55
POM_ARTIFACT_ID=android-junk-code
66
POM_NAME=AndroidJunkCode
@@ -26,5 +26,5 @@ POM_DEVELOPER_URL=https://github.com/qq549631030/
2626
#signing.password=[you key password]
2727
#signing.secretKeyRingFile=[you gpg key file location]
2828
#
29-
#mavenCentralRepositoryUsername=[you sonatype username]
30-
#mavenCentralRepositoryPassword=[you sonatype password]
29+
#mavenCentralUsername=[you sonatype username]
30+
#mavenCentralPassword=[you sonatype password]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package cn.hx.plugin.junkcode.ext
22

3+
import org.gradle.api.NamedDomainObjectContainer
4+
35
class AndroidJunkCodeExt {
6+
@Deprecated(since = "1.0.8")
47
Map<String, Closure<JunkCodeConfig>> configMap = [:]
8+
9+
NamedDomainObjectContainer<JunkCodeConfig> variantConfig
510
}

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

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

33
import org.gradle.api.tasks.Input
4+
import org.gradle.api.tasks.Internal
45

56
class JunkCodeConfig {
67
@Input
@@ -21,4 +22,11 @@ class JunkCodeConfig {
2122
int drawableCount = 0
2223
@Input
2324
int stringCount = 0
25+
26+
@Internal
27+
String name = ""
28+
29+
JunkCodeConfig(String name) {
30+
this.name = name
31+
}
2432
}

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

Lines changed: 65 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import cn.hx.plugin.junkcode.ext.AndroidJunkCodeExt
44
import cn.hx.plugin.junkcode.ext.JunkCodeConfig
55
import cn.hx.plugin.junkcode.task.AndroidJunkCodeTask
66
import com.android.build.gradle.AppExtension
7-
import com.android.build.gradle.api.ApplicationVariant
87
import org.gradle.api.Plugin
98
import org.gradle.api.Project
109

@@ -17,71 +16,82 @@ class AndroidJunkCodePlugin implements Plugin<Project> {
1716
throw IllegalArgumentException("must apply this plugin after 'com.android.application'")
1817
}
1918
def generateJunkCodeExt = project.extensions.create("androidJunkCode", AndroidJunkCodeExt)
19+
generateJunkCodeExt.variantConfig = project.container(JunkCodeConfig.class, new JunkCodeConfigFactory())
20+
21+
android.applicationVariants.all { variant ->
22+
def variantName = variant.name
23+
def junkCodeConfig = generateJunkCodeExt.variantConfig.findByName(variantName)
24+
if (junkCodeConfig) {
25+
createGenerateJunkCodeTask(project, android, variant, junkCodeConfig)
26+
}
27+
}
28+
2029
project.afterEvaluate {
2130
android.applicationVariants.all { variant ->
2231
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-
def resDir = new File(dir, "res")
27-
def javaDir = new File(dir, "java")
28-
def manifestFile = new File(dir, "AndroidManifest.xml")
29-
String packageName = findPackageName(variant)
30-
def generateJunkCodeTask = project.task("generate${variantName.capitalize()}JunkCode", type: AndroidJunkCodeTask) {
31-
junkCodeConfig.delegate = config
32-
junkCodeConfig.resolveStrategy = DELEGATE_FIRST
33-
junkCodeConfig.call()
34-
manifestPackageName = packageName
35-
outDir = dir
36-
}
37-
//将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
38-
for (int i = variant.sourceSets.size() - 1; i >= 0; i--) {
39-
def sourceSet = variant.sourceSets[i]
40-
if (!sourceSet.manifestFile.exists()) {
41-
android.sourceSets."${sourceSet.name}".manifest.srcFile(manifestFile.absolutePath)
42-
break
43-
}
44-
}
45-
if (variant.respondsTo("registerGeneratedResFolders")) {
46-
generateJunkCodeTask.ext.generatedResFolders = project
47-
.files(resDir)
48-
.builtBy(generateJunkCodeTask)
49-
variant.registerGeneratedResFolders(generateJunkCodeTask.generatedResFolders)
50-
if (variant.hasProperty("mergeResourcesProvider")) {
51-
variant.mergeResourcesProvider.configure { dependsOn(generateJunkCodeTask) }
52-
} else {
53-
//noinspection GrDeprecatedAPIUsage
54-
variant.mergeResources.dependsOn(generateJunkCodeTask)
55-
}
56-
} else {
57-
//noinspection GrDeprecatedAPIUsage
58-
variant.registerResGeneratingTask(generateJunkCodeTask, resDir)
59-
}
60-
variant.registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
32+
def generateJunkCodeTaskName = "generate${variantName.capitalize()}JunkCode"
33+
def generateJunkCodeTask = project.tasks.findByName(generateJunkCodeTaskName)
34+
if (generateJunkCodeTask) {
35+
//已经用variantConfig方式配置过了
36+
return
37+
}
38+
def closure = generateJunkCodeExt.configMap[variantName]
39+
if (closure) {
40+
def junkCodeConfig = new JunkCodeConfig()
41+
closure.delegate = junkCodeConfig
42+
closure.resolveStrategy = Closure.DELEGATE_FIRST
43+
closure.call()
44+
println("AndroidJunkCode: configMap配置方式已过时,请使用variantConfig配置方式")
45+
createGenerateJunkCodeTask(project, android, variant, junkCodeConfig)
6146
}
6247
}
6348
}
6449
}
6550

66-
67-
/**
68-
* 从AndroidManifest.xml找到package name
69-
* @param variant
70-
* @return
71-
*/
72-
static String findPackageName(ApplicationVariant variant) {
73-
String packageName = null
74-
for (int i = 0; i < variant.sourceSets.size(); i++) {
51+
private def createGenerateJunkCodeTask = { project, android, variant, junkCodeConfig ->
52+
def variantName = variant.name
53+
def generateJunkCodeTaskName = "generate${variantName.capitalize()}JunkCode"
54+
def dir = new File(project.buildDir, "generated/source/junk/$variantName")
55+
def resDir = new File(dir, "res")
56+
def javaDir = new File(dir, "java")
57+
def manifestFile = new File(dir, "AndroidManifest.xml")
58+
//从main/AndroidManifest.xml找到package name
59+
def mainManifestFile = android.sourceSets.findByName("main").manifest.srcFile
60+
def parser = new XmlParser()
61+
def node = parser.parse(mainManifestFile)
62+
def packageName = node.attribute("package")
63+
def generateJunkCodeTask = project.task(generateJunkCodeTaskName, type: AndroidJunkCodeTask) {
64+
config = junkCodeConfig
65+
manifestPackageName = packageName
66+
outDir = dir
67+
}
68+
//将自动生成的AndroidManifest.xml加入到一个未被占用的manifest位置(如果都占用了就不合并了,通常较少出现全被占用情况)
69+
for (int i = variant.sourceSets.size() - 1; i >= 0; i--) {
7570
def sourceSet = variant.sourceSets[i]
76-
if (sourceSet.manifestFile.exists()) {
77-
def parser = new XmlParser()
78-
Node node = parser.parse(sourceSet.manifestFile)
79-
packageName = node.attribute("package")
80-
if (packageName != null) {
81-
break
71+
if (!sourceSet.manifestFile.exists()) {
72+
android.sourceSets."${sourceSet.name}".manifest.srcFile(manifestFile.absolutePath)
73+
def processMainManifestTask = project.tasks.findByName("process${variantName.capitalize()}MainManifest")
74+
if (processMainManifestTask) {
75+
processMainManifestTask.dependsOn(generateJunkCodeTask)
8276
}
77+
break
78+
}
79+
}
80+
if (variant.respondsTo("registerGeneratedResFolders")) {
81+
generateJunkCodeTask.ext.generatedResFolders = project
82+
.files(resDir)
83+
.builtBy(generateJunkCodeTask)
84+
variant.registerGeneratedResFolders(generateJunkCodeTask.generatedResFolders)
85+
if (variant.hasProperty("mergeResourcesProvider")) {
86+
variant.mergeResourcesProvider.configure { dependsOn(generateJunkCodeTask) }
87+
} else {
88+
//noinspection GrDeprecatedAPIUsage
89+
variant.mergeResources.dependsOn(generateJunkCodeTask)
8390
}
91+
} else {
92+
//noinspection GrDeprecatedAPIUsage
93+
variant.registerResGeneratingTask(generateJunkCodeTask, resDir)
8494
}
85-
return packageName
95+
variant.registerJavaGeneratingTask(generateJunkCodeTask, javaDir)
8696
}
8797
}

0 commit comments

Comments
 (0)