Tag: ProGuard

建立签名apk失败与proguard(项目中的不同模块)

我需要混淆代码,但是当我尝试构建APK时,我得到一个错误“输出jar是空的,你指定了正确的”-keep“选项吗? 错误 Caused by: java.io.IOException: The output jar is empty. Did you specify the proper '-keep' options? at proguard.shrink.Shrinker.execute(Shrinker.java:186) at proguard.ProGuard.shrink(ProGuard.java:298) at proguard.ProGuard.execute(ProGuard.java:113) at com.android.build.gradle.internal.transforms.BaseProguardAction.runProguard(BaseProguardAction.java:54) at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:254) at com.android.build.gradle.internal.transforms.ProGuardTransform.access$000(ProGuardTransform.java:63) at com.android.build.gradle.internal.transforms.ProGuardTransform$1.run(ProGuardTransform.java:173) at com.android.builder.tasks.Job.runTask(Job.java:48) at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41) at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:225) build.gradle应用程序 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'io.fabric' android { compileSdkVersion compile_sdk_version buildToolsVersion build_tools_version defaultConfig { […]

JsonProperty不能在缩小时启用

我有以下班级 class CodeRequest(@JsonProperty("phone") val phoneNumber: String) 当我发送请求(使用改进)与这个类的对象作为正文(而缩小未启用)时,一切正常和请求将以这种形式发送{"phone": "123"} 但使用以下proguard-rules.pro启用缩小将导致{"phoneNumber": "123"}请求正文。 # Jackson -keep class com.fasterxml.jackson.databind.ObjectMapper { public <methods>; protected <methods>; } -keep class com.fasterxml.jackson.databind.ObjectWriter { public ** writeValueAsString(**); } -keep @com.fasterxml.jackson.annotation.* class * { *; } -keep @com.fasterxml.jackson.annotation.** class * { *; } -keep class com.fasterxml.** { *; } -keepattributes *Annotation*,EnclosingMethod,Signature,Exceptions,InnerClasses -keep class * { […]

Android架构组件 – ViewModel Observable&Proguard

我无法使ViewModel组件与Proguard一起使用。 我已经不得不添加以下内容来防止由于NoSuchMethodException导致崩溃:init() 保持类com …. SlideshowViewModel {*;} 但是,我在活动中的观察员没有收到任何数据。 这工作正常,直到我启用Proguard,所以我知道Proguard是原因,我只是不知道为什么(新手Proguard在这里)。 我需要添加什么规则才能使观测值工作? 我有以下在我的ViewModel(Kotlin) val currentItem = MediatorLiveData<MediaItem>() ….后来… Timber.d("Setting next image: " + position + " out of " + mediaItemList.size) currentItem.value = mediaItemList[position] 和活动(Java) viewModel.getCurrentItem().observe(this, new Observer<MediaItem>() { @Override public void onChanged(@Nullable final MediaItem mediaItem) { Timber.d("Activity received new item"); } }); 在日志中,我收到:D / SlideshowViewModel:设置下一个图像:0出18 但是onChanged Observable中没有任何东西被解雇。

如何跳过基础包中的retrofit2使用的proguard模型?

我正在用Kotlin和Retrotif 2写一个应用程序。当我使用proguard时,我遵循这里的规则 https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-retrofit2.pro 除此之外,我也需要推进我的模型,如https://stackoverflow.com/a/41136007/3286489 如果我在一个包中有我的模型,并且我有-keep class com.elyeproj.wikisearchcount.model.** { *; } -keep class com.elyeproj.wikisearchcount.model.** { *; } package com.elyeproj.wikisearchcount.model object Model { data class Result(val query: Query) data class Query(val searchinfo: SearchInfo) data class SearchInfo(val totalhits: Int) } 但是,如果我保留我的模型在基础包中的代码如下,但我不想保留整个包即-keep class com.elyeproj.wikisearchcount.** { *; } 因为这打败了proguard的目的 package com.elyeproj.wikisearchcount object Model { data class Result(val query: Query) data […]

重复Zip条目MultiDex.class

我有一个Android应用程序,只是超过了方法的限制,所以我试图启用multidex。 一旦我这样做,我得到以下错误: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithMultidexlistForProdDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63) at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99) at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625) at […]

如何防止Kotlin.Unit对象被Proguard剥离

Proguard条纹kotlin.Unit独立对象(在Kotlin运行时库中),如果使用此类型,则会导致编译错误。 下面的规则并没有帮助保留这个元素(可能因为Unit不是一个类 ,而是一个对象 ): -keep class kotlin.Unit.** { *; } 我们使用这种单位类型: fun assert(func : Assert.() -> Unit) = Assert().apply(func) 有没有解决这个问题,或者我错过了什么?

如何使用Kotlin与Proguard

我正在尝试将Kotlin添加到我的项目中,并且需要使用proguard。 我应该将哪些规则添加到proguard来支持Kotlin? 谢谢

什么是.kotlin_builtins文件,我可以从我的uberjars中忽略它们?

我正在将proguard集成到我的Gradle构建中,用于在Kotlin中编写的应用程序。 我发现proguard正在剥离Kotlin标准库(就像它应该在我简单的Hello World程序中那样),但是在我的jar文件中留下了一堆扩展名为.kotlin_builtins的文件。 当我配置我的gradle任务来排除这些文件时,该程序仍然显示正常工作。 这些文件是什么,他们必须随我的可执行uberjar? 这里是我的build.gradle文件的内容供参考: buildscript { ext.kotlin_version = '1.0.5' ext.shadow_version = '1.2.4' repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } flatDir dirs: "gradle/proguard" } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version" classpath ":proguard:" } } apply plugin: 'kotlin' apply plugin: 'application' apply plugin: 'com.github.johnrengelman.shadow' mainClassName = 'namespace.MainKt' defaultTasks 'run' repositories { mavenCentral() } dependencies […]

我怎样才能混淆我的编码与kotlin的sdk(并摆脱元数据)

我正在开发一个SDK(Android库),我必须混淆我的代码的很大一部分,所以客户可能不会尝试玩内部代码。 我的lib是用kotlin编码的,我用proguard来混淆代码。 问题是在编译和混淆之后,代码中仍然存在@ kotlin.Metadata(运行时)注释。 通过这些注释,检索产生这个“(非那么混淆)”字节码的java代码是很容易的。 我首先想到这是我的错,而且我的项目有太多的熵源可能导致了这种行为,所以我做了一个样本项目来证明这个问题不是来自我的sdk实现。 我用AS创建了一个新项目,然后是一个带有2个文件的lib模块: facade.kt是我的门面类,我不想混淆,所以客户可以使用它: package com.example.mylibrary class MyFacade(val internalClass:InternalClass) { fun doSomething() { internalClass.doSomething( firstArgument=1, secondArgument=2 ) } } 在这个例子中,internal.kt拥有我想混淆的类: package com.example.mylibrary class InternalClass { fun doSomething(firstArgument: Int, secondArgument: Int) { System.out.println("Arguments are : $firstArgument, $secondArgument") } } proguard规则被注入到gradle项目中,并释放这个闭包: buildTypes { release { minifyEnabled true proguardFiles 'proguard-rules.pro' } } 这里是proguard-rules.pro (只有一行,没有更多): […]

RxJava和FasterXML有一个有效的proguard规则吗?

现在阻止我在生产中使用kotlin的唯一问题是我找不到一个正确的proguard文件。 我用什么: 1.Kotlin 2.Anko 3.Jackson-科特林模块 以下是警告消息: :app:proguardRelease Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry Warning: rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef: can't find referenced class sun.misc.Unsafe Warning: rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef: can't find referenced class sun.misc.Unsafe Warning: rx.internal.util.unsafe.ConcurrentCircularArrayQueue: can't find referenced class sun.misc.Unsafe Warning: rx.internal.util.unsafe.ConcurrentSequencedCircularArrayQueue: can't find referenced class sun.misc.Unsafe Warning: rx.internal.util.unsafe.MpmcArrayQueueConsumerField: can't find referenced class sun.misc.Unsafe Warning: rx.internal.util.unsafe.MpmcArrayQueueProducerField: can't find referenced class […]