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的插件。如何更新插件?也许这可能会有帮助。
该行添加到您的proguard-rules.pro
文件:
-keep interface com.birbit.android.jobqueue.** { *; }
使用ProGuard版本6.0.1或6.0.3时的问题对我来说仍然存在。这就是为什么我试图弄清楚,是什么原因导致的问题。
在我的情况,导致ProGuard的优化过程中错误的函数是这样的(科特林或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)
}
究其原因可能是,现在的功能参数不是完全无用的(至少不是编译器),即使在(或期间)优化。
作为一个选项,你可以改变从的build.gradle
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'
至
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
关闭优化。