From ac981052152a7dae517881ee80cf3ff1b2d2ce74 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:35:25 +0300 Subject: [PATCH 01/12] Bump version to 0.1.8 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 6326329..0d65f7d 100644 --- a/version.properties +++ b/version.properties @@ -1,6 +1,6 @@ version.major=0 version.minor=1 -version.patch=7 +version.patch=8 version.snapshot=false version.dryRun=false From a1bdadfe35ba42a31a043d5e2e25f8ab74226943 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:35:46 +0300 Subject: [PATCH 02/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf91141..1e06dd4 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ buildscript { } dependencies { - classpath 'io.michaelrocks:paranoid-gradle-plugin:0.1.7' + classpath 'io.michaelrocks:paranoid-gradle-plugin:0.1.8' } } From 0b88ca3a007dbf92c5d6f0ce6a77e1dd6fe43a48 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:36:41 +0300 Subject: [PATCH 03/12] Bump Kotlin version to 1.2.21 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f9644e4..5d388c3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ allprojects { - ext.kotlinVersion = '1.1.51' + ext.kotlinVersion = '1.2.21' buildscript { repositories { From 18d2e49f5d825bc74937cf940f99283a5e4f21cc Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:38:15 +0300 Subject: [PATCH 04/12] Bump Gradle version to 4.5.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 54783 -> 54712 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 6 +++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d12aae84f5db1b86df701d7466a5618f6497cef2..ed88a042a287c140a32e1639edfc91b2a233da8c 100644 GIT binary patch delta 17164 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 It|K5Z0D5rW;s5{u diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c583957..8941bfb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-all.zip diff --git a/gradlew b/gradlew index 4453cce..cccdd3d 100755 --- a/gradlew +++ b/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } From ae3d944ee8727adbffe7cffe90bab7877f78dade Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:38:37 +0300 Subject: [PATCH 05/12] Bump Android Gradle plugin version to 3.0.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5d388c3..51d2ef6 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,6 @@ ext { junitVersion = '4.12' - androidToolsVersion = '3.0.0' + androidToolsVersion = '3.0.1' supportVersion = '27.0.0' } From d11db296ff80c5b85fa90a1b52d49bc50eed0249 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 00:38:58 +0300 Subject: [PATCH 06/12] Bump Android Support version to 27.0.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 51d2ef6..afb7bc3 100644 --- a/build.gradle +++ b/build.gradle @@ -39,5 +39,5 @@ ext { junitVersion = '4.12' androidToolsVersion = '3.0.1' - supportVersion = '27.0.0' + supportVersion = '27.0.2' } From 2435dd831d38d767da3dc08d3d37d4241db25c02 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Thu, 22 Feb 2018 11:36:20 +0300 Subject: [PATCH 07/12] Remove an extra space --- .../paranoid/processor/StringConstantsClassPatcher.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringConstantsClassPatcher.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringConstantsClassPatcher.kt index 5ed15cb..343e324 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringConstantsClassPatcher.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringConstantsClassPatcher.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ class StringConstantsClassPatcher( delegate: ClassVisitor ) : ClassVisitor(ASM5, delegate) { - private val logger = getLogger() + private val logger = getLogger() private var isStaticInitializerPatched = false From 88cebc4e8bb444db13d3d24d163502bbd96b9084 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Fri, 23 Feb 2018 00:20:01 +0300 Subject: [PATCH 08/12] Rerun the transform when the plugin version changes --- .../java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt b/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt index 13a58e6..fe6d122 100644 --- a/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt +++ b/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt @@ -100,6 +100,10 @@ class ParanoidTransform(private val android: BaseExtension) : Transform() { return false } + override fun getParameterInputs(): MutableMap { + return mutableMapOf("version" to Build.VERSION) + } + private fun TransformOutputProvider.getContentLocation( name: String, contentType: QualifiedContent.ContentType, From 98cde588647833a9bbae2bd18078d1a1e3cfaa02 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Fri, 23 Feb 2018 00:20:35 +0300 Subject: [PATCH 09/12] Bump Android Build Tools version to 27.0.3 --- sample/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/build.gradle b/sample/build.gradle index e09d514..6bb4a41 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'io.michaelrocks.paranoid' android { compileSdkVersion 27 - buildToolsVersion "27.0.0" + buildToolsVersion "27.0.3" defaultConfig { applicationId "io.michaelrocks.paranoid.sample" From cffbb23e9022307f77457a31e63f2972e7b5a0c8 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Fri, 23 Feb 2018 00:20:48 +0300 Subject: [PATCH 10/12] Fix warnings --- .../java/io/michaelrocks/paranoid/sample/MainActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sample/src/main/java/io/michaelrocks/paranoid/sample/MainActivity.java b/sample/src/main/java/io/michaelrocks/paranoid/sample/MainActivity.java index ed35710..e89a47b 100644 --- a/sample/src/main/java/io/michaelrocks/paranoid/sample/MainActivity.java +++ b/sample/src/main/java/io/michaelrocks/paranoid/sample/MainActivity.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; + import io.michaelrocks.paranoid.Obfuscate; @Obfuscate @@ -31,10 +32,10 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); - final TextView questionTextView = (TextView) findViewById(R.id.questionTextView); + final TextView questionTextView = findViewById(R.id.questionTextView); questionTextView.setText(String.format(QUESTION, "How does it work?")); - final TextView answerTextView = (TextView) findViewById(R.id.answerTextView); + final TextView answerTextView = findViewById(R.id.answerTextView); answerTextView.setText(String.format(ANSWER, "It's magic! ¯\\_(ツ)_/¯")); } } From ad1e6e16ad881321c1ab47d981d5d6a13ae24c05 Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Fri, 23 Feb 2018 00:23:17 +0300 Subject: [PATCH 11/12] Generate a unique Deobfuscator class per project #14 --- .../paranoid/plugin/ParanoidTransform.kt | 5 +-- .../paranoid/processor/Generator.kt | 14 +++++--- .../paranoid/processor/ParanoidProcessor.kt | 32 ++++++++++++++++--- .../paranoid/processor/Patcher.kt | 6 ++-- .../processor/StringLiteralsClassPatcher.kt | 7 ++-- .../paranoid/processor/StringRegistry.kt | 7 +--- .../paranoid/processor/model/Deobfuscator.kt | 25 +++++++++++++++ 7 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 processor/src/main/kotlin/io/michaelrocks/paranoid/processor/model/Deobfuscator.kt diff --git a/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt b/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt index fe6d122..8db4d47 100644 --- a/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt +++ b/gradle-plugin/src/main/java/io/michaelrocks/paranoid/plugin/ParanoidTransform.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,7 +54,8 @@ class ParanoidTransform(private val android: BaseExtension) : Transform() { classpath = invocation.referencedInputs.flatMap { it.jarInputs.map { it.file } + it.directoryInputs.map { it.file } }, - bootClasspath = android.bootClasspath + bootClasspath = android.bootClasspath, + projectName = invocation.context.path.replace(":transformClassesWithParanoidFor", ":").replace(':', '$') ) try { diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Generator.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Generator.kt index 2a2a968..829bc9f 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Generator.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Generator.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package io.michaelrocks.paranoid.processor import io.michaelrocks.paranoid.processor.logging.getLogger +import io.michaelrocks.paranoid.processor.model.Deobfuscator import java.io.File import java.util.Collections import java.util.HashSet @@ -25,7 +26,10 @@ import javax.tools.JavaFileObject import javax.tools.StandardLocation import javax.tools.ToolProvider -class Generator(private val stringRegistry: StringRegistry) { +class Generator( + private val deobfuscator: Deobfuscator, + private val stringRegistry: StringRegistry +) { private val logger = getLogger() fun generateDeobfuscator( @@ -35,7 +39,7 @@ class Generator(private val stringRegistry: StringRegistry) { bootClasspath: Collection ) { val sourceCode = generateDeobfuscatorSourceCode() - val sourceFile = File(sourcePath, "${DEOBFUSCATOR_TYPE.internalName}.java") + val sourceFile = File(sourcePath, "${deobfuscator.type.internalName}.java") sourceFile.parentFile.mkdirs() genPath.mkdirs() @@ -107,7 +111,7 @@ class Generator(private val stringRegistry: StringRegistry) { val locationChunkCount = (stringCount + chunkSize - 1) / chunkSize return buildString { - val internalName = DEOBFUSCATOR_TYPE.internalName + val internalName = deobfuscator.type.internalName val packageName = internalName.substringBeforeLast('/').replace('/', '.') val className = internalName.substringAfterLast('/') appendln("package $packageName;") @@ -169,7 +173,7 @@ class Generator(private val stringRegistry: StringRegistry) { } appendln() - appendln(" public static String ${DEOBFUSCATION_METHOD.name}(final int id) {") + appendln(" public static String ${deobfuscator.deobfuscationMethod.name}(final int id) {") appendln(" final int offset = locations[id * 2];") appendln(" final int length = locations[id * 2 + 1];") appendln(" final char[] stringChars = new char[length];") diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/ParanoidProcessor.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/ParanoidProcessor.kt index aa46ba2..7fc8b1f 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/ParanoidProcessor.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/ParanoidProcessor.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,11 @@ package io.michaelrocks.paranoid.processor import io.michaelrocks.grip.Grip import io.michaelrocks.grip.GripFactory +import io.michaelrocks.grip.mirrors.getObjectTypeByInternalName import io.michaelrocks.paranoid.processor.logging.getLogger +import io.michaelrocks.paranoid.processor.model.Deobfuscator +import org.objectweb.asm.Type +import org.objectweb.asm.commons.Method import java.io.File class ParanoidProcessor( @@ -27,7 +31,8 @@ class ParanoidProcessor( private val sourcePath: File, private val genPath: File, private val classpath: Collection, - private val bootClasspath: Collection + private val bootClasspath: Collection, + private val projectName: String ) { private val logger = getLogger() @@ -41,8 +46,11 @@ class ParanoidProcessor( val analysisResult = Analyzer(grip).analyze(inputs) analysisResult.dump() - Patcher(stringRegistry, grip.classRegistry).copyAndPatchClasses(inputs, outputs, analysisResult) - Generator(stringRegistry).generateDeobfuscator(sourcePath, genPath, outputs + classpath, bootClasspath) + + val deobfuscator = createDeobfuscator() + logger.info("Prepare to generate {}", deobfuscator) + Patcher(deobfuscator, stringRegistry, grip.classRegistry).copyAndPatchClasses(inputs, outputs, analysisResult) + Generator(deobfuscator, stringRegistry).generateDeobfuscator(sourcePath, genPath, outputs + classpath, bootClasspath) } private fun AnalysisResult.dump() { @@ -60,4 +68,20 @@ class ParanoidProcessor( } } } + + private fun createDeobfuscator(): Deobfuscator { + val deobfuscatorInternalName = "io/michaelrocks/paranoid/Deobfuscator${composeDeobfuscatorNameSuffix()}" + val deobfuscatorType = getObjectTypeByInternalName(deobfuscatorInternalName) + val deobfuscationMethod = Method("getString", Type.getType(String::class.java), arrayOf(Type.INT_TYPE)) + return Deobfuscator(deobfuscatorType, deobfuscationMethod) + } + + private fun composeDeobfuscatorNameSuffix(): String { + val normalizedProjectName = projectName.filter { it.isLetterOrDigit() || it == '_' || it == '$' } + return if (normalizedProjectName.isEmpty() || normalizedProjectName.startsWith('$')) { + normalizedProjectName + } else { + '$' + normalizedProjectName + } + } } diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Patcher.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Patcher.kt index 076869e..8b38d0c 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Patcher.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/Patcher.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,11 +20,13 @@ import io.michaelrocks.grip.ClassRegistry import io.michaelrocks.grip.mirrors.Type import io.michaelrocks.grip.mirrors.getObjectTypeByInternalName import io.michaelrocks.paranoid.processor.logging.getLogger +import io.michaelrocks.paranoid.processor.model.Deobfuscator import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassWriter import java.io.File class Patcher( + private val deobfuscator: Deobfuscator, private val stringRegistry: StringRegistry, private val classRegistry: ClassRegistry ) { @@ -73,7 +75,7 @@ class Patcher( logger.debug(" Target: {}", targetFile) val reader = ClassReader(sourceFile.readBytes()) val writer = StandaloneClassWriter(reader, ClassWriter.COMPUTE_MAXS or ClassWriter.COMPUTE_FRAMES, classRegistry) - val stringLiteralsPatcher = StringLiteralsClassPatcher(stringRegistry, writer) + val stringLiteralsPatcher = StringLiteralsClassPatcher(deobfuscator, stringRegistry, writer) val stringConstantsPatcher = StringConstantsClassPatcher(configuration, stringLiteralsPatcher) reader.accept(stringConstantsPatcher, ClassReader.SKIP_FRAMES) targetFile.parentFile.mkdirs() diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringLiteralsClassPatcher.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringLiteralsClassPatcher.kt index 526f5c1..4d12d18 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringLiteralsClassPatcher.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringLiteralsClassPatcher.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,16 @@ package io.michaelrocks.paranoid.processor +import io.michaelrocks.grip.mirrors.toAsmType import io.michaelrocks.paranoid.processor.logging.getLogger +import io.michaelrocks.paranoid.processor.model.Deobfuscator import org.objectweb.asm.ClassVisitor import org.objectweb.asm.MethodVisitor import org.objectweb.asm.Opcodes.ASM5 import org.objectweb.asm.commons.GeneratorAdapter class StringLiteralsClassPatcher( + private val deobfuscator: Deobfuscator, private val stringRegistry: StringRegistry, delegate: ClassVisitor ) : ClassVisitor(ASM5, delegate) { @@ -65,7 +68,7 @@ class StringLiteralsClassPatcher( logger.info(" Obfuscating string literal: \"{}\"", string) val stringId = stringRegistry.registerString(string) push(stringId) - invokeStatic(DEOBFUSCATOR_TYPE, DEOBFUSCATION_METHOD) + invokeStatic(deobfuscator.type.toAsmType(), deobfuscator.deobfuscationMethod) } } } diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringRegistry.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringRegistry.kt index 7eb3297..c22b95f 100644 --- a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringRegistry.kt +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/StringRegistry.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 Michael Rozumyanskiy + * Copyright 2018 Michael Rozumyanskiy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,8 @@ package io.michaelrocks.paranoid.processor -import org.objectweb.asm.Type -import org.objectweb.asm.commons.Method import java.util.HashMap -val DEOBFUSCATOR_TYPE = Type.getObjectType("io/michaelrocks/paranoid/Deobfuscator") -val DEOBFUSCATION_METHOD: Method = Method("getString", Type.getType(String::class.java), arrayOf(Type.INT_TYPE)) - interface StringRegistry { fun registerString(string: String): Int fun getAllIds(): Collection diff --git a/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/model/Deobfuscator.kt b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/model/Deobfuscator.kt new file mode 100644 index 0000000..666063b --- /dev/null +++ b/processor/src/main/kotlin/io/michaelrocks/paranoid/processor/model/Deobfuscator.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2018 Michael Rozumyanskiy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.michaelrocks.paranoid.processor.model + +import io.michaelrocks.grip.mirrors.Type +import org.objectweb.asm.commons.Method + +data class Deobfuscator( + val type: Type.Object, + val deobfuscationMethod: Method +) From a51e69b2db8d5c9ee037a49d84a47087b1ad361d Mon Sep 17 00:00:00 2001 From: Michael Rozumyanskiy Date: Fri, 23 Feb 2018 01:07:59 +0300 Subject: [PATCH 12/12] Add tests to the sample project --- build.gradle | 3 ++ sample/build.gradle | 9 +++- .../paranoid/sample/MainActivityTest.java | 46 +++++++++++++++++++ .../paranoid/sample/SampleTest.java | 29 ++++++++++++ 4 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 sample/src/androidTest/java/io/michaelrocks/paranoid/sample/MainActivityTest.java create mode 100644 sample/src/test/java/io/michaelrocks/paranoid/sample/SampleTest.java diff --git a/build.gradle b/build.gradle index afb7bc3..0a362c3 100644 --- a/build.gradle +++ b/build.gradle @@ -40,4 +40,7 @@ ext { androidToolsVersion = '3.0.1' supportVersion = '27.0.2' + + runnerVersion = '1.0.1' + espressoVersion = '3.0.1' } diff --git a/sample/build.gradle b/sample/build.gradle index 6bb4a41..993ad28 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -19,6 +19,8 @@ android { targetSdkVersion 27 versionCode 1 versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } signingConfigs { @@ -32,7 +34,7 @@ android { buildTypes { debug { - minifyEnabled true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } @@ -46,4 +48,9 @@ android { dependencies { implementation "com.android.support:appcompat-v7:$supportVersion" + + testImplementation "junit:junit:$junitVersion" + + androidTestImplementation "com.android.support.test:runner:$runnerVersion" + androidTestImplementation "com.android.support.test.espresso:espresso-core:$espressoVersion" } diff --git a/sample/src/androidTest/java/io/michaelrocks/paranoid/sample/MainActivityTest.java b/sample/src/androidTest/java/io/michaelrocks/paranoid/sample/MainActivityTest.java new file mode 100644 index 0000000..c5b0923 --- /dev/null +++ b/sample/src/androidTest/java/io/michaelrocks/paranoid/sample/MainActivityTest.java @@ -0,0 +1,46 @@ +/* + * Copyright 2018 Michael Rozumyanskiy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.michaelrocks.paranoid.sample; + +import android.support.test.filters.LargeTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class MainActivityTest { + @Rule + public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class); + + @Test + public void textViewsHaveProperText() { + onView(withId(R.id.questionTextView)) + .check(matches(withText("Q:\r\nHow does it work?"))); + onView(withId(R.id.answerTextView)) + .check(matches(withText("A:\r\nIt's magic! ¯\\_(ツ)_/¯"))); + } +} diff --git a/sample/src/test/java/io/michaelrocks/paranoid/sample/SampleTest.java b/sample/src/test/java/io/michaelrocks/paranoid/sample/SampleTest.java new file mode 100644 index 0000000..73d538c --- /dev/null +++ b/sample/src/test/java/io/michaelrocks/paranoid/sample/SampleTest.java @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Michael Rozumyanskiy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.michaelrocks.paranoid.sample; + +import org.junit.Test; + + +import static org.junit.Assert.assertTrue; + +public class SampleTest { + @Test + public void runsJustFine() { + assertTrue(true); + } +}