Skip to content

Commit 54f22be

Browse files
committed
obfuscating assets
1 parent ea04ffd commit 54f22be

File tree

5 files changed

+164
-57
lines changed

5 files changed

+164
-57
lines changed

src/main/kotlin/StringCare.kt

Lines changed: 75 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -43,32 +43,25 @@ open class StringCare : Plugin<Project> {
4343

4444
this.project.afterEvaluate {
4545
extension.modules.forEach { module ->
46-
when {
47-
module.stringFiles.isNotEmpty() && module.srcFolders.isNotEmpty() -> {
48-
moduleMap[module.name] = Configuration(module.name).apply {
49-
stringFiles.addAll(module.stringFiles)
50-
srcFolders.addAll(module.srcFolders)
51-
debug = extension.debug
52-
}
53-
}
54-
module.srcFolders.isNotEmpty() -> {
55-
moduleMap[module.name] = Configuration(module.name).apply {
56-
stringFiles.addAll(defaultConfig().stringFiles)
57-
srcFolders.addAll(module.srcFolders)
58-
debug = extension.debug
59-
}
60-
}
61-
module.stringFiles.isNotEmpty() -> {
62-
moduleMap[module.name] = Configuration(module.name).apply {
63-
stringFiles.addAll(module.stringFiles)
64-
srcFolders.addAll(defaultConfig().srcFolders)
65-
debug = extension.debug
66-
}
67-
}
46+
moduleMap[module.name] = Configuration(module.name).apply {
47+
debug = extension.debug
48+
}
49+
if (module.srcFolders.isNotEmpty()) {
50+
moduleMap[module.name]!!.srcFolders.addAll(module.srcFolders)
51+
}
52+
if (module.stringFiles.isNotEmpty()) {
53+
moduleMap[module.name]!!.stringFiles.addAll(module.stringFiles)
54+
}
55+
if (module.assetsFiles.isNotEmpty()) {
56+
moduleMap[module.name]!!.assetsFiles.addAll(module.assetsFiles)
57+
}
58+
59+
if (moduleMap[module.name]!!.srcFolders.isEmpty()) {
60+
moduleMap[module.name]!!.srcFolders.addAll(defaultConfig().srcFolders)
61+
}
62+
if (moduleMap[module.name]!!.stringFiles.isEmpty()) {
63+
moduleMap[module.name]!!.stringFiles.addAll(defaultConfig().stringFiles)
6864
}
69-
}
70-
if (moduleMap.isEmpty()) {
71-
moduleMap[defaultMainModule] = defaultConfig().normalize()
7265
}
7366
this.project.registerTask()
7467
}
@@ -101,7 +94,8 @@ open class StringCare : Plugin<Project> {
10194
moduleMap[module]?.let { configuration ->
10295
val files = locateResourceFiles(absoluteProjectPath, configuration)
10396
files.forEach { file ->
104-
modifyXML(file.file, extension.main_module, key, extension.debug,
97+
modifyXML(
98+
file.file, extension.main_module, key, extension.debug,
10599
variantOrFlavor?.applicationId ?: ""
106100
)
107101
}
@@ -126,14 +120,69 @@ open class StringCare : Plugin<Project> {
126120

127121
},
128122
mergeResourcesFinish = { module, variant ->
123+
PrintUtils.print(module, restoreStringRes)
129124
val variantOrFlavor = extension.variants.find {
130125
variant.toLowerCase().contains(it.name.toLowerCase())
131126
}
132127
if (variantOrFlavor != null && variantOrFlavor.skip) {
133128
return@ExecutionListener
134129
}
135130
restoreResourceFiles(absoluteProjectPath, module)
131+
},
132+
mergeAssetsStart = { module, variant ->
133+
fingerPrint(module, variant, extension.debug) { key ->
134+
if ("none" == key) {
135+
return@fingerPrint
136+
}
137+
when {
138+
moduleMap.containsKey(module) -> {
139+
val variantOrFlavor = extension.variants.find {
140+
variant.toLowerCase().contains(it.name.toLowerCase())
141+
}
142+
if (variantOrFlavor != null && variantOrFlavor.skip) {
143+
PrintUtils.print(module, "Skipping $variant")
144+
return@fingerPrint
145+
}
146+
147+
PrintUtils.print(module, "$variant:$key")
148+
PrintUtils.print(module, backupAssets)
149+
moduleMap[module]?.let { configuration ->
150+
backupAssetsFiles(absoluteProjectPath, configuration)
151+
}
152+
153+
moduleMap[module]?.let { configuration ->
154+
val files = locateAssetsFiles(absoluteProjectPath, configuration)
155+
files.forEach { file ->
156+
if (extension.debug) {
157+
PrintUtils.print(null, file.file.getContent())
158+
}
159+
obfuscateFile(
160+
extension.main_module,
161+
key,
162+
file.file
163+
)
164+
if (extension.debug) {
165+
PrintUtils.print(null, file.file.getContent())
166+
}
167+
}
168+
}
169+
PrintUtils.print(module, obfuscateAssets)
170+
}
171+
}
172+
}
173+
174+
},
175+
mergeAssetsFinish = { module, variant ->
176+
PrintUtils.print(module, restoreAssets)
177+
val variantOrFlavor = extension.variants.find {
178+
variant.toLowerCase().contains(it.name.toLowerCase())
179+
}
180+
if (variantOrFlavor != null && variantOrFlavor.skip) {
181+
return@ExecutionListener
182+
}
183+
restoreAssetsFiles(absoluteProjectPath, module)
136184
}
185+
137186
))
138187
}
139188

src/main/kotlin/components/ExecutionListener.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ class ExecutionListener(
1212
private val debug: Boolean = false,
1313
val dataFound: (module: String, variant: String) -> Unit,
1414
val mergeResourcesStart: (module: String, variant: String) -> Unit,
15-
val mergeResourcesFinish: (module: String, variant: String) -> Unit
15+
val mergeResourcesFinish: (module: String, variant: String) -> Unit,
16+
val mergeAssetsStart: (module: String, variant: String) -> Unit,
17+
val mergeAssetsFinish: (module: String, variant: String) -> Unit
1618
) : BuildListener,
1719
TaskExecutionListener {
1820

@@ -27,6 +29,12 @@ class ExecutionListener(
2729
}
2830
mergeResourcesStart(it, PrintUtils.uncapitalize(task.onMergeResourcesStartsVariant()))
2931
}
32+
task.onMergeAssetsStarts() -> task.getModuleName()?.let {
33+
if (debug) {
34+
PrintUtils.print(it, "Module: $it", true)
35+
}
36+
mergeAssetsStart(it, PrintUtils.uncapitalize(task.onMergeAssetsStartsVariant()))
37+
}
3038
}
3139
}
3240

@@ -35,6 +43,9 @@ class ExecutionListener(
3543
task.onMergeResourcesFinish() -> task.getModuleName()?.let {
3644
mergeResourcesFinish(it, PrintUtils.uncapitalize(task.onMergeResourcesFinishVariant()))
3745
}
46+
task.onMergeAssetsFinish() -> task.getModuleName()?.let {
47+
mergeAssetsFinish(it, PrintUtils.uncapitalize(task.onMergeAssetsFinishVariant()))
48+
}
3849
}
3950
}
4051

src/main/kotlin/components/Extensions.kt

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package components
22

33
import StringCare
4-
import StringCare.VariantApplicationId
5-
import StringCare.Configuration
6-
import StringCare.Extension
4+
import StringCare.*
75
import groovy.json.StringEscapeUtils
86
import models.AssetsFile
97
import models.ResourceFile
@@ -16,7 +14,10 @@ import org.w3c.dom.Node
1614
import org.xml.sax.InputSource
1715
import task.SCPreview
1816
import task.SCTestObfuscation
19-
import java.io.*
17+
import java.io.File
18+
import java.io.FileInputStream
19+
import java.io.InputStreamReader
20+
import java.io.StringWriter
2021
import javax.xml.parsers.DocumentBuilderFactory
2122
import javax.xml.transform.OutputKeys
2223
import javax.xml.transform.TransformerFactory
@@ -117,15 +118,16 @@ fun File.validForAssetsConfiguration(configuration: Configuration): Boolean {
117118
&& excludedForAssets().not()
118119
if (valid) {
119120
valid = false
120-
if (configuration.assetsFiles.isEmpty()) {
121-
valid = true
122-
} else {
123-
configuration.assetsFiles.forEach { file ->
124-
if (this.absolutePath.normalizePath().endsWith("${File.separator}$file".normalizePath())
125-
|| (file.contains("*.")
126-
&& this.absolutePath.normalizePath().endsWith(file.replace("*","")))) {
127-
valid = true
128-
}
121+
configuration.assetsFiles.forEach { file ->
122+
if (this.absolutePath.endsWith(
123+
"${File.separator}$file".replace(
124+
"${File.separator}${File.separator}",
125+
File.separator
126+
)
127+
)
128+
|| (file.contains("*.") && this.absolutePath.endsWith(file.replace("*", "")))
129+
) {
130+
valid = true
129131
}
130132
}
131133
}
@@ -138,6 +140,7 @@ fun File.validForAssetsConfiguration(configuration: Configuration): Boolean {
138140
val exclude = listOf(
139141
"/build/",
140142
"/.git/",
143+
"/.idea/",
141144
"/.gradle/",
142145
"/gradle/"
143146
)
@@ -214,22 +217,30 @@ fun File.assetsFile(configuration: Configuration): AssetsFile? {
214217
}
215218
if (valid) {
216219
valid = false
217-
if (configuration.assetsFiles.isEmpty()) {
218-
valid = true
219-
validFile = this
220-
} else {
221-
configuration.assetsFiles.forEach { file ->
222-
if (this.absolutePath.normalizePath().endsWith("${File.separator}$file".normalizePath())
223-
|| (file.contains("*.")
224-
&& this.absolutePath.normalizePath().endsWith(file.replace("*","")))) {
225-
valid = true
226-
validFile = this
227-
}
220+
configuration.assetsFiles.forEach { file ->
221+
if (this.absolutePath.endsWith(
222+
"${File.separator}$file".replace(
223+
"${File.separator}${File.separator}",
224+
File.separator
225+
)
226+
)
227+
|| (file.contains("*.") && this.absolutePath.endsWith(file.replace("*", "")))
228+
) {
229+
valid = true
230+
validFile = this
228231
}
229232
}
230233
}
231234
if (configuration.debug && excludedForAssets().not()) {
232-
println(if (valid) validFile?.getContent() else "")
235+
println(
236+
"${when {
237+
valid -> "valid file"
238+
else -> ""
239+
}}${when {
240+
validFile != null -> validFile?.getContent()
241+
else -> "the file is null"
242+
}}"
243+
)
233244
}
234245
return if (valid) AssetsFile(validFile!!, sourceFolder, configuration.name) else null
235246
}
@@ -393,6 +404,14 @@ fun Task.onMergeResourcesFinish(): Boolean = this.name.contains(merge)
393404
&& this.name.contains(resources)
394405
&& !this.name.contains(test)
395406

407+
fun Task.onMergeAssetsStarts(): Boolean = this.name.contains(generate)
408+
&& this.name.contains(assets)
409+
&& !this.name.contains(test)
410+
411+
fun Task.onMergeAssetsFinish(): Boolean = this.name.contains(merge)
412+
&& this.name.contains(assets)
413+
&& !this.name.contains(test)
414+
396415
fun Task.dataFoundVariant(): String = this.name.substring(pre.length)
397416
.substring(0, this.name.substring(pre.length).length - build.length)
398417

@@ -402,6 +421,12 @@ fun Task.onMergeResourcesStartsVariant(): String = this.name.substring(merge.len
402421
fun Task.onMergeResourcesFinishVariant(): String = this.name.substring(merge.length)
403422
.substring(0, this.name.substring(merge.length).length - resources.length)
404423

424+
fun Task.onMergeAssetsStartsVariant(): String = this.name.substring(generate.length)
425+
.substring(0, this.name.substring(generate.length).length - assets.length)
426+
427+
fun Task.onMergeAssetsFinishVariant(): String = this.name.substring(merge.length)
428+
.substring(0, this.name.substring(merge.length).length - assets.length)
429+
405430
fun <R : Any> R.logger(): Lazy<Logger> {
406431
return lazy { LoggerFactory.getLogger(this.javaClass) }
407432
}

src/main/kotlin/components/Vars.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@ internal const val copyCommandWindows = "copy"
2020
internal const val emptyChar = ""
2121
internal const val backupStringRes = "backupStringResources"
2222
internal const val obfuscateStringRes = "obfuscateStringResources"
23+
internal const val restoreStringRes = "restoreStringResources"
24+
internal const val backupAssets = "backupAssets"
25+
internal const val obfuscateAssets = "obfuscateAssets"
26+
internal const val restoreAssets = "restoreAssets"
2327
internal const val test = "Test"
2428
internal const val pre = "pre"
2529
internal const val build = "Build"
30+
internal const val generate = "generate"
2631
internal const val merge = "merge"
2732
internal const val resources = "Resources"
33+
internal const val assets = "Assets"

src/test/kotlin/AssetsTest.kt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ class AssetsTest {
2222
fun `01 - (PLUGIN) locate assets files for default configuration`() {
2323
val temp = tempPath()
2424
prepareTask(temp).runCommand { _, _ ->
25-
assert(locateAssetsFiles("$temp${File.separator}$testProjectName", configuration).isNotEmpty())
25+
assert(locateAssetsFiles("$temp${File.separator}$testProjectName", configuration.apply {
26+
assetsFiles = mutableListOf("*.json")
27+
}).isNotEmpty())
2628
}
2729
StringCare.resetFolder()
2830
}
@@ -31,7 +33,9 @@ class AssetsTest {
3133
fun `02 - (PLUGIN) backup assets files`() {
3234
val temp = tempPath()
3335
prepareTask(temp).runCommand { _, _ ->
34-
assert(backupAssetsFiles("$temp${File.separator}$testProjectName", configuration).isNotEmpty())
36+
assert(backupAssetsFiles("$temp${File.separator}$testProjectName", configuration.apply {
37+
assetsFiles = mutableListOf("*.json")
38+
}).isNotEmpty())
3539
}
3640
StringCare.resetFolder()
3741
}
@@ -45,7 +49,9 @@ class AssetsTest {
4549
restoreAssetsFiles("$temp${File.separator}$testProjectName", defaultMainModule).isEmpty()
4650
)
4751
assert(
48-
backupAssetsFiles("$temp${File.separator}$testProjectName", configuration).isNotEmpty()
52+
backupAssetsFiles("$temp${File.separator}$testProjectName", configuration.apply {
53+
assetsFiles = mutableListOf("*.json")
54+
}).isNotEmpty()
4955
)
5056
assert(
5157
restoreAssetsFiles("$temp${File.separator}$testProjectName", defaultMainModule).isNotEmpty()
@@ -61,7 +67,12 @@ class AssetsTest {
6167
val key = report.extractFingerprint()
6268
println(key)
6369
assert(key.isNotEmpty())
64-
val files = locateAssetsFiles("$temp${File.separator}$testProjectName", configuration)
70+
val files = locateAssetsFiles(
71+
"$temp${File.separator}$testProjectName",
72+
configuration.apply {
73+
assetsFiles = mutableListOf("*.json")
74+
})
75+
assert(files.isNotEmpty())
6576
files.forEach {
6677
println("-------------------------------------------------------")
6778
val original = it.file.getContent()
@@ -86,7 +97,12 @@ class AssetsTest {
8697
val key = report.extractFingerprint()
8798
println(key)
8899
assert(key.isNotEmpty())
89-
val files = locateAssetsFiles("$temp${File.separator}$testProjectName", configuration)
100+
val files = locateAssetsFiles(
101+
"$temp${File.separator}$testProjectName",
102+
configuration.apply {
103+
assetsFiles = mutableListOf("*.json")
104+
})
105+
assert(files.isNotEmpty())
90106
files.forEach {
91107
println("-------------------------------------------------------")
92108
val original = it.file.getContent()

0 commit comments

Comments
 (0)