【问题标题】:Stack size becomes negative after instruction指令后堆栈大小变为负数
【发布时间】:2015-11-08 15:33:00
【问题描述】:

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]

感谢任何提示。

更正

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

【问题讨论】:

  • 我也遇到了这个问题——在 5.2.1 版本上...

标签: android proguard android-proguard job-queue


【解决方案1】:

作为一个选项,您可以更改 build.gradle 来自

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

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

关闭优化。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      当我使用 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)
      }
      

      原因可能是现在函数参数不是完全无用的(至少对编译器来说不是),即使在优化之后(或期间)也是如此。

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 1970-01-01
        • 2011-03-22
        • 2019-08-05
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 2021-03-15
        • 2020-04-20
        相关资源
        最近更新 更多