Skip to content

Commit 52c05da

Browse files
author
eespada
committed
dynamic applicationIds support
1 parent b4e05c7 commit 52c05da

File tree

7 files changed

+46
-27
lines changed

7 files changed

+46
-27
lines changed

src/main/kotlin/StringCare.kt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import components.*
2-
import org.gradle.api.DefaultTask
32
import org.gradle.api.NamedDomainObjectContainer
43
import org.gradle.api.Plugin
54
import org.gradle.api.Project
65
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
106

117
open class StringCare : Plugin<Project> {
128

@@ -49,21 +45,21 @@ open class StringCare : Plugin<Project> {
4945
extension.modules.forEach { module ->
5046
when {
5147
module.stringFiles.isNotEmpty() && module.srcFolders.isNotEmpty() -> {
52-
moduleMap[module.name!!] = Configuration(module.name).apply {
48+
moduleMap[module.name] = Configuration(module.name).apply {
5349
stringFiles.addAll(module.stringFiles)
5450
srcFolders.addAll(module.srcFolders)
5551
debug = extension.debug
5652
}
5753
}
5854
module.srcFolders.isNotEmpty() -> {
59-
moduleMap[module.name!!] = Configuration(module.name).apply {
55+
moduleMap[module.name] = Configuration(module.name).apply {
6056
stringFiles.addAll(defaultConfig().stringFiles)
6157
srcFolders.addAll(module.srcFolders)
6258
debug = extension.debug
6359
}
6460
}
6561
module.stringFiles.isNotEmpty() -> {
66-
moduleMap[module.name!!] = Configuration(module.name).apply {
62+
moduleMap[module.name] = Configuration(module.name).apply {
6763
stringFiles.addAll(module.stringFiles)
6864
srcFolders.addAll(defaultConfig().srcFolders)
6965
debug = extension.debug
@@ -88,15 +84,26 @@ open class StringCare : Plugin<Project> {
8884
}
8985
when {
9086
moduleMap.containsKey(module) -> {
87+
val variantOrFlavor = extension.variants.find {
88+
variant.toLowerCase().contains(it.name.toLowerCase())
89+
}
90+
if (variantOrFlavor != null && variantOrFlavor.skip) {
91+
PrintUtils.print(module, "Skipping $variant")
92+
return@fingerPrint
93+
}
94+
9195
PrintUtils.print(module, "$variant:$key")
9296
PrintUtils.print(module, backupStringRes)
9397
moduleMap[module]?.let { configuration ->
9498
backupFiles(absoluteProjectPath, configuration)
9599
}
100+
96101
moduleMap[module]?.let { configuration ->
97102
val files = locateFiles(absoluteProjectPath, configuration)
98103
files.forEach { file ->
99-
modifyXML(file.file, extension.main_module, key, extension.debug)
104+
modifyXML(file.file, extension.main_module, key, extension.debug,
105+
variantOrFlavor?.applicationId ?: ""
106+
)
100107
}
101108
}
102109
PrintUtils.print(module, obfuscateStringRes)
@@ -118,7 +125,13 @@ open class StringCare : Plugin<Project> {
118125
}
119126

120127
},
121-
mergeResourcesFinish = { module, _ ->
128+
mergeResourcesFinish = { module, variant ->
129+
val variantOrFlavor = extension.variants.find {
130+
variant.toLowerCase().contains(it.name.toLowerCase())
131+
}
132+
if (variantOrFlavor != null && variantOrFlavor.skip) {
133+
return@ExecutionListener
134+
}
122135
restoreFiles(absoluteProjectPath, module)
123136
}
124137
))
@@ -133,23 +146,23 @@ open class StringCare : Plugin<Project> {
133146
internal set(value) {
134147
DslObject(this).extensions.add("modules", value)
135148
}
136-
var buildVariants: NamedDomainObjectContainer<VariantApplicationId>
149+
var variants: NamedDomainObjectContainer<VariantApplicationId>
137150
@Suppress("UNCHECKED_CAST")
138-
get() = DslObject(this).extensions.getByName("buildVariants") as NamedDomainObjectContainer<VariantApplicationId>
151+
get() = DslObject(this).extensions.getByName("variants") as NamedDomainObjectContainer<VariantApplicationId>
139152
internal set(value) {
140-
DslObject(this).extensions.add("buildVariants", value)
153+
DslObject(this).extensions.add("variants", value)
141154
}
142155
}
143156

144-
open class Configuration(var name: String?) {
157+
open class Configuration(var name: String) {
145158
var stringFiles = mutableListOf<String>()
146159
var srcFolders = mutableListOf<String>()
147160
var debug = false
148161
}
149162

150-
open class VariantApplicationId(var name: String?) {
163+
open class VariantApplicationId(var name: String) {
151164
var applicationId = ""
152-
var exclude = false
165+
var skip = false
153166
}
154167

155168
}

src/main/kotlin/components/Extensions.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import task.SCPreview
1717
import task.SCTestObfuscation
1818
import java.io.*
1919
import javax.xml.parsers.DocumentBuilderFactory
20+
import javax.xml.transform.OutputKeys
2021
import javax.xml.transform.TransformerFactory
2122
import javax.xml.transform.dom.DOMSource
2223
import javax.xml.transform.stream.StreamResult
@@ -157,7 +158,7 @@ fun File.resourceFile(configuration: Configuration): ResourceFile? {
157158
}
158159
}
159160
}
160-
return if (valid) ResourceFile(validFile!!, sourceFolder, configuration.name!!) else null
161+
return if (valid) ResourceFile(validFile!!, sourceFolder, configuration.name) else null
161162
}
162163

163164
fun Project.absolutePath(): String = this.file(wrapperWindows).absolutePath.replace(
@@ -168,7 +169,7 @@ fun Project.absolutePath(): String = this.file(wrapperWindows).absolutePath.repl
168169
fun Project.createExtension(): Extension {
169170
val extension = this.extensions.create(extensionName, Extension::class.java)
170171
extension.modules = this.container(Configuration::class.java)
171-
extension.buildVariants = this.container(VariantApplicationId::class.java)
172+
extension.variants = this.container(VariantApplicationId::class.java)
172173

173174
StringCare.mainModule = extension.main_module
174175
StringCare.debug = extension.debug
@@ -266,9 +267,11 @@ fun File.getXML(): Document {
266267
fun File.updateXML(document: Document) {
267268
val output = StringWriter()
268269
val transformer = TransformerFactory.newInstance().newTransformer()
270+
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
269271
transformer.transform(DOMSource(document), StreamResult(output))
270272
val xml = output.toString()
271-
FileWriter(this.absolutePath).use { it.write(xml) }
273+
this.writeText(xml)
274+
//FileWriter(this.absolutePath).use { it.write(xml) }
272275
}
273276

274277
fun File.removeAttributes() {
@@ -279,7 +282,8 @@ fun File.removeAttributes() {
279282
.replace("containsHtml=\"false\"", "")
280283
.replace("androidTreatment=\"true\"", "")
281284
.replace("androidTreatment=\"false\"", "")
282-
FileWriter(this.absolutePath).use { it.write(content) }
285+
// FileWriter(this.absolutePath).use { it.write(content) }
286+
this.writeText(content)
283287
updateXML(this.getXML())
284288
}
285289

src/main/kotlin/components/Stark.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ open class Stark {
6666
}
6767

6868
@JvmStatic
69-
external fun obfuscate(mainModule: String, key: String, value: ByteArray): ByteArray
69+
external fun obfuscate(mainModule: String, key: String, value: ByteArray, mockId: String): ByteArray
7070

7171
@JvmStatic
7272
external fun reveal(mainModule: String, key: String, value: ByteArray): ByteArray

src/main/kotlin/components/XParser.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ fun parseXML(file: File): List<StringEntity> {
8080
return entities
8181
}
8282

83-
fun modifyXML(file: File, mainModule: String, key: String, debug: Boolean) {
83+
fun modifyXML(file: File, mainModule: String, key: String, debug: Boolean, mockId: String = "") {
8484
val stringEntities = parseXML(file)
8585
if (debug) {
8686
PrintUtils.print(null, file.getContent(), true)
@@ -94,7 +94,7 @@ fun modifyXML(file: File, mainModule: String, key: String, debug: Boolean) {
9494
it.tag == "string" && it.index == i
9595
}
9696
entity?.let {
97-
node.textContent = obfuscate(mainModule, key, it).value
97+
node.textContent = obfuscate(mainModule, key, it, mockId).value
9898
}
9999
}
100100

@@ -105,12 +105,13 @@ fun modifyXML(file: File, mainModule: String, key: String, debug: Boolean) {
105105
}
106106
}
107107

108-
fun obfuscate(mainModule: String, key: String, entity: StringEntity): StringEntity {
108+
fun obfuscate(mainModule: String, key: String, entity: StringEntity, mockId: String = ""): StringEntity {
109109
val obfuscation = Stark.obfuscate(
110110
mainModule, key, when (entity.androidTreatment) {
111111
true -> entity.value.androidTreatment()
112112
false -> entity.value.unescape()
113-
}.toByteArray()
113+
}.toByteArray(),
114+
mockId
114115
).toReadableString()
115116
return StringEntity(entity.name, entity.attributes, obfuscation, entity.tag, entity.index, entity.androidTreatment)
116117
}
515 Bytes
Binary file not shown.

src/main/kotlin/task/SCTestObfuscation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ open class SCTestObfuscation : DefaultTask() {
2626
moduleMap.forEach { entry ->
2727
var key = ""
2828
signingReportTask().runCommand { _, result ->
29-
key = result.extractFingerprint(entry.value.name!!, variant ?: defaultVariant, debug ?: defaultDebug)
29+
key = result.extractFingerprint(entry.value.name, variant ?: defaultVariant, debug ?: defaultDebug)
3030
}
3131
println("fingerprint: $key")
3232
println("variant: ${variant ?: "debug"}")
@@ -51,7 +51,7 @@ open class SCTestObfuscation : DefaultTask() {
5151
println(file.file.getContent())
5252
println("============================")
5353
}
54-
restoreFiles(absoluteProjectPath, entry.value.name!!)
54+
restoreFiles(absoluteProjectPath, entry.value.name)
5555
}
5656
println("== END OBFUSCATION ==================================")
5757

src/test/kotlin/SCTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ class SCTest {
107107
val obfuscated = obfuscate(
108108
"$temp${File.separator}$mainModuleTest",
109109
key,
110-
entity
110+
entity,
111+
""
111112
)
112113
assert(obfuscated.value != entity.value)
113114
}

0 commit comments

Comments
 (0)