指令后堆栈大小变为负数

时间:2015-11-08 15:33:01

标签: android proguard android-proguard job-queue

It has been pointed out that the reason I am having this problem is because of proguard 4.9,所以我继续更新到proguard-5.2.1。但我仍然遇到同样的问题。有没有人找到解决方案?我通过

确认了新版本
 java -jar /projects/tools/android-sdk-macosx/tools/proguard/lib/proguard.jar

我的proguard-rule.pro只是

#---- Google Cloud Endpoint section
# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection
-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-dontwarn com.google.api.client.**
-dontwarn com.google.common.**

#---- Twitter
-include ../proguard-com.twitter.sdk.android.twitter.txt
-dontwarn okio.**

#---- Remove Logging

    -assumenosideeffects class android.util.Log {
    
  public static int v(...);
  public static int i(...);
  public static int w(...);
  public static int d(...);
    
  public static int e(...);

    }

#---- support design
-dontwarn android.support.design.**

#---- Google ILicencingService
-keep public class com.google.vending.licensing.ILicensingService
    
-keep public class com.android.vending.licensing.ILicensingService
    
    

错误行是

Error:java.lang.IllegalArgumentException: Stack size becomes negative after instruction [72] invokestatic #16 in [com/path/android/jobqueue/BaseJob.safeRun(I)Z]

感谢任何提示。

CORRECTION

由于我使用的是Android Studio,听起来我必须处理Proguard插件。如何更新插件?也许这可能有所帮助。

3 个答案:

答案 0 :(得分:0)

将此行添加到proguard-rules.pro文件中:

-keep interface com.birbit.android.jobqueue.** { *; }

答案 1 :(得分:0)

使用ProGuard 6.0.1或6.0.3版本时,问题仍然存在。这就是为什么我试图找出导致问题的原因。

就我而言,导致ProGuard优化过程中出错的函数是这样的(Kotlin或Java应该无关紧要):

private fun logInfo(action: String) {
    val wifiState = mWifiManager.wifiState

    val stateString = when (wifiState) {
        WifiManager.WIFI_STATE_ENABLED -> "enabled"
        WifiManager.WIFI_STATE_DISABLED -> "disabled"
        WifiManager.WIFI_STATE_DISABLING -> "disabling"
        WifiManager.WIFI_STATE_ENABLING -> "enabling"
        WifiManager.WIFI_STATE_UNKNOWN -> "unknown"
        else -> "default"
    }

    val logString = wifiInfo?.run {
        "$action, $stateString, ssid: $ssid, bssid: $bssid, rssi: $rssi, linkSpeed: $linkSpeed"
    } ?: "$action, $stateString"
    MLog.d(LOG_TAG, MLog.LogCategory.Network, logString)
}

ProGuard规则包含以下声明:

-assumenosideeffects class some.package.MLog {
*** d(...);
*** i(...);
*** w(...);
}

MLog.kt是一个自定义的日志记录类,其内容无关。

问题似乎是ProGuard剥离了MLog.d,因此不再需要函数中的所有其余代码,直到不再需要参数action为止。我的猜测是ProGuard试图完全删除参数甚至功能logInfo。那就是造成崩溃的原因。

如果我将此无用的位添加到函数的末尾,则不会发生崩溃:

if (logString == "test") {
    Thread.sleep(1)
}

原因可能是,即使在优化后(或优化期间),现在函数参数也不是完全没用的(至少对编译器而言不是)。

答案 2 :(得分:0)

作为一种选择,您可以从以下位置更改build.gradle

3

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'

关闭优化。