Skip to content

Commit 8a86fe3

Browse files
committed
preview and obfuscationtest task
1 parent 55e3454 commit 8a86fe3

File tree

8 files changed

+234
-6
lines changed

8 files changed

+234
-6
lines changed

src/main/kotlin/StringCare.kt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,43 @@
11
import components.*
2+
import org.gradle.api.DefaultTask
23
import org.gradle.api.NamedDomainObjectContainer
34
import org.gradle.api.Plugin
45
import org.gradle.api.Project
56
import org.gradle.api.internal.plugins.DslObject
7+
import org.gradle.api.tasks.Input
8+
import org.gradle.api.tasks.TaskAction
9+
import java.io.File
610

711
open class StringCare : Plugin<Project> {
812

913
companion object {
1014
@JvmStatic
11-
private lateinit var absoluteProjectPath: String
15+
internal lateinit var absoluteProjectPath: String
1216

13-
internal var internalTempDir: String? = null
17+
private var internalTempDir: String? = null
1418
@JvmStatic
1519
var tempFolder: String
16-
get() = internalTempDir?: tempPath()
20+
get() = internalTempDir ?: tempPath()
1721
set(value) {
1822
internalTempDir = value
1923
}
2024

2125
fun resetFolder() {
2226
internalTempDir = null
2327
}
28+
29+
@JvmStatic
30+
internal val moduleMap: MutableMap<String, Configuration> = mutableMapOf()
31+
32+
@JvmStatic
33+
internal var mainModule: String = defaultMainModule
34+
35+
@JvmStatic
36+
internal var debug: Boolean = defaultDebug
2437
}
2538

2639
private lateinit var project: Project
2740
private lateinit var extension: Extension
28-
private val moduleMap: MutableMap<String, Configuration> = mutableMapOf()
29-
3041

3142
override fun apply(target: Project) {
3243
this@StringCare.project = target
@@ -57,6 +68,10 @@ open class StringCare : Plugin<Project> {
5768
}
5869
}
5970
}
71+
if (moduleMap.isEmpty()) {
72+
moduleMap[defaultMainModule] = defaultConfig().normalize()
73+
}
74+
this.project.registerTask()
6075
}
6176
this.project.gradle.addBuildListener(ExecutionListener(
6277
debug = extension.debug,
@@ -103,6 +118,7 @@ open class StringCare : Plugin<Project> {
103118
}
104119
))
105120
}
121+
106122
open class Extension {
107123
var debug: Boolean = false
108124
var main_module: String = "app"
@@ -118,6 +134,7 @@ open class StringCare : Plugin<Project> {
118134
var stringFiles = mutableListOf<String>()
119135
var srcFolders = mutableListOf<String>()
120136
}
137+
121138
}
122139

123140

src/main/kotlin/components/Extensions.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import org.slf4j.LoggerFactory
1212
import org.w3c.dom.Document
1313
import org.w3c.dom.Node
1414
import org.xml.sax.InputSource
15+
import task.SCPreview
16+
import task.SCTestObfuscation
1517
import java.io.*
1618
import javax.xml.parsers.DocumentBuilderFactory
1719
import javax.xml.transform.TransformerFactory
@@ -44,6 +46,17 @@ fun String.normalizePath(): String {
4446
}
4547
}
4648

49+
fun String.uncapitalize(): String {
50+
val original = this.trim()
51+
if (original.isEmpty()) {
52+
return ""
53+
}
54+
val char = original[0].toLowerCase()
55+
return when {
56+
original.length == 1 -> char.toString()
57+
else -> char + original.substring(1, original.length)
58+
}
59+
}
4760
fun String.escape(): String = Regex.escape(this)
4861
fun String.unescape(): String = StringEscapeUtils.unescapeJava(this)
4962
fun String.removeNewLines(): String = this.replace("\n", "")
@@ -134,9 +147,30 @@ fun Project.absolutePath(): String = this.file(wrapperWindows).absolutePath.repl
134147
fun Project.createExtension(): Extension {
135148
val extension = this.extensions.create(extensionName, Extension::class.java)
136149
extension.modules = this.container<Configuration>(Configuration::class.java)
150+
StringCare.mainModule = extension.main_module
151+
StringCare.debug = extension.debug
137152
return extension
138153
}
139154

155+
fun Project.registerTask() {
156+
this.tasks.addRule("Pattern: $gradleTaskNameObfuscate<variant>") { taskName ->
157+
if (taskName.startsWith(gradleTaskNameObfuscate)) {
158+
task(taskName) {
159+
it.doLast {
160+
val variant = taskName.replace(gradleTaskNameObfuscate, "").uncapitalize()
161+
val task = this.tasks.getByName(gradleTaskNameObfuscate) as SCTestObfuscation
162+
task.variant = variant
163+
task.module = StringCare.mainModule
164+
task.debug = StringCare.debug
165+
task.greet()
166+
}
167+
}
168+
}
169+
}
170+
this.tasks.register(gradleTaskNameDoctor, SCPreview::class.java)
171+
this.tasks.register(gradleTaskNameObfuscate, SCTestObfuscation::class.java)
172+
}
173+
140174
fun Process.outputString(): String {
141175
val input = this.inputStream.bufferedReader().use { it.readText() }
142176
val error = this.errorStream.bufferedReader().use { it.readText() }

src/main/kotlin/components/Tasks.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ internal fun buildTask(directory: String): String {
3737
""".trimIndent()
3838
}
3939

40+
internal fun basicGradleTask(directory: String): String {
41+
return """
42+
${buildTask(directory)} &&
43+
${gradleWrapper()} $gradleTaskNameDoctor
44+
""".trimIndent()
45+
}
46+
47+
internal fun obfuscationTestGradleTask(directory: String): String {
48+
return """
49+
${buildTask(directory)} &&
50+
${gradleWrapper()} ${gradleTaskNameObfuscate}Debug
51+
""".trimIndent()
52+
}
53+
4054
// gradlew task needs export ANDROID_SDK_ROOT=/Users/efrainespada/Library/Android/sdk
4155
// echo "sdk.dir=${System.getenv("ANDROID_SDK_ROOT")}" > local.properties &&
4256
internal fun signingReportTask(directory: String): String {

src/main/kotlin/components/Vars.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package components
22

33
import java.io.File
44

5+
internal const val version = "3.0"
56
internal const val testProjectName = "KotlinSample"
7+
internal const val defaultDebug = false
68
internal const val defaultMainModule = "app"
9+
internal const val defaultVariant = "debug"
710
internal val mainModuleTest = "$testProjectName${File.separator}$defaultMainModule"
11+
internal const val gradleTaskNameDoctor = "stringcarePreview"
12+
internal const val gradleTaskNameObfuscate = "stringcareObfuscate"
813
internal const val extensionName = "stringcare"
914
internal const val winLib = "libsignKey.dll"
1015
internal const val osxLib = "libsignKey.dylib"

src/main/kotlin/task/SCPreview.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package task
2+
3+
import StringCare.Companion.absoluteProjectPath
4+
import StringCare.Companion.moduleMap
5+
import components.getContent
6+
import components.locateFiles
7+
import components.parseXML
8+
import org.gradle.api.DefaultTask
9+
import org.gradle.api.tasks.TaskAction
10+
import java.io.File
11+
12+
open class SCPreview : DefaultTask() {
13+
@TaskAction
14+
fun greet() {
15+
println("== REPORT ======================================")
16+
println("Modules (${moduleMap.size})")
17+
18+
moduleMap.forEach { entry ->
19+
val files = locateFiles(absoluteProjectPath, entry.value)
20+
println("Located files(${files.size}) for obfuscating")
21+
files.forEach { file ->
22+
println("- ${file.file.name}")
23+
println("\t${file.module}${File.separator}${file.sourceFolder}${File.separator}")
24+
val entities = parseXML(file.file)
25+
println("path: ${file.file.absolutePath}")
26+
println("")
27+
println("============================")
28+
entities.forEach { entity ->
29+
entity.attributes.forEach { attribute ->
30+
println("\"${attribute.name}\": \"${attribute.value}\"")
31+
}
32+
println("\"value\": \"${entity.value}\"")
33+
println("============================")
34+
}
35+
println("")
36+
println("=== content ================")
37+
println(file.file.getContent())
38+
println("============================")
39+
40+
}
41+
}
42+
println("== END REPORT ==================================")
43+
44+
45+
}
46+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package task
2+
3+
import StringCare.Companion.absoluteProjectPath
4+
import StringCare.Companion.moduleMap
5+
import components.*
6+
import org.gradle.api.DefaultTask
7+
import org.gradle.api.tasks.Input
8+
import org.gradle.api.tasks.TaskAction
9+
10+
open class SCTestObfuscation : DefaultTask() {
11+
12+
@Input
13+
var variant: String? = null
14+
15+
@Input
16+
var module: String? = null
17+
18+
@Input
19+
var debug: Boolean? = null
20+
21+
@TaskAction
22+
fun greet() {
23+
println("== OBFUSCATION ======================================")
24+
println("Modules (${moduleMap.size})")
25+
26+
moduleMap.forEach { entry ->
27+
var key = ""
28+
signingReportTask().runCommand { _, result ->
29+
key = result.extractFingerprint(entry.value.name!!, variant ?: defaultVariant, debug ?: defaultDebug)
30+
}
31+
println("fingerprint: $key")
32+
println("variant: ${variant ?: "debug"}")
33+
val filesToObfuscate = backupFiles(absoluteProjectPath, entry.value)
34+
filesToObfuscate.forEach { file ->
35+
val originalEntities = parseXML(file.file)
36+
println("============================")
37+
originalEntities.forEach { entity ->
38+
entity.attributes.forEach { attribute ->
39+
println("\"${attribute.name}\": \"${attribute.value}\"")
40+
}
41+
println("\"value\": \"${entity.value}\"")
42+
println("============================")
43+
}
44+
println("")
45+
println("=== content ================")
46+
println(file.file.getContent())
47+
println("============================")
48+
modifyXML(file.file, module!!, key, true)
49+
println("=== content obfuscated ================")
50+
println(file.file.getContent())
51+
println("============================")
52+
}
53+
restoreFiles(absoluteProjectPath, entry.value.name!!)
54+
}
55+
println("== END OBFUSCATION ==================================")
56+
57+
58+
}
59+
}

src/test/kotlin/SCTest.kt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class SCTest {
1919
librarySetupTask.runCommand()
2020
}
2121

22+
/*
23+
2224
@Test
2325
fun `01 - (PLUGIN) terminal verification`() {
2426
"echo $extensionName".runCommand { command, result ->
@@ -252,4 +254,54 @@ class SCTest {
252254
}
253255
}
254256
257+
@Test
258+
fun `15 - (GRADLE TASK) basic task test`() {
259+
pluginBuildTask().runCommand { _, report ->
260+
assert(report.contains("BUILD SUCCESSFUL"))
261+
}
262+
val temp = tempPath()
263+
prepareTask(temp).runCommand { _, _ ->
264+
modifyForTest(temp, testProjectName)
265+
basicGradleTask("$temp${File.separator}$testProjectName").runCommand { _, androidReport ->
266+
assert(androidReport.contains("BUILD SUCCESSFUL"))
267+
assert(androidReport.contains(gradleTaskNameDoctor))
268+
}
269+
270+
}
271+
}*/
272+
273+
@Test
274+
fun `16 - (GRADLE TASK) basic task test`() {
275+
pluginBuildTask().runCommand { _, report ->
276+
assert(report.contains("BUILD SUCCESSFUL"))
277+
}
278+
val temp = tempPath()
279+
prepareTask(temp).runCommand { _, _ ->
280+
modifyForTest(temp, testProjectName)
281+
basicGradleTask("$temp${File.separator}$testProjectName").runCommand { _, androidReport ->
282+
assert(androidReport.contains("BUILD SUCCESSFUL"))
283+
assert(androidReport.contains("END REPORT"))
284+
println(androidReport)
285+
}
286+
287+
}
288+
}
289+
290+
@Test
291+
fun `17 - (GRADLE TASK) test obfuscate`() {
292+
pluginBuildTask().runCommand { _, report ->
293+
assert(report.contains("BUILD SUCCESSFUL"))
294+
}
295+
val temp = tempPath()
296+
prepareTask(temp).runCommand { _, _ ->
297+
modifyForTest(temp, testProjectName)
298+
obfuscationTestGradleTask("$temp${File.separator}$testProjectName").runCommand { _, androidReport ->
299+
assert(androidReport.contains("BUILD SUCCESSFUL"))
300+
assert(androidReport.contains("END OBFUSCATION"))
301+
println(androidReport)
302+
}
303+
304+
}
305+
}
306+
255307
}

src/test/kotlin/utils/Helper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package utils
33
import components.Os
44
import components.getContent
55
import components.getOs
6+
import components.version
67
import java.io.File
78
import java.io.FileWriter
89

@@ -13,7 +14,7 @@ fun modifyForTest(directory: String, projectPath: String) {
1314
"classpath \"com.stringcare:plugin:\$stringcare_version\"",
1415
when (getOs()) {
1516
Os.WINDOWS -> "\nclasspath files(\"${current.absolutePath.replace("\\", "\\\\")}${File.separator}${File.separator}build${File.separator}${File.separator}libs${File.separator}${File.separator}plugin-2.2.jar\")\n"
16-
Os.OSX -> "\nclasspath files(\"${current.absolutePath}${File.separator}build${File.separator}libs${File.separator}plugin-2.2.jar\")\n"
17+
Os.OSX -> "\nclasspath files(\"${current.absolutePath}${File.separator}build${File.separator}libs${File.separator}plugin-$version.jar\")\n"
1718
}
1819
)
1920
FileWriter(file.absolutePath).use { it.write(content) }

0 commit comments

Comments
 (0)