I'm not familiar with such a conditional rule configuration with regards to assumenosideeffects
.
However, if you're able to change the code of the specific package where you'd want to keep the logs on, then the following workaround might effectively emulate exactly what you want.
In proguard rule configuration list all the available shorthand methods, but omit the println
and getStackTraceString
methods:
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** d(...);
public static *** i(...);
public static *** e(...);
public static *** w(...);
}
Create a Log wrapper class, which re-implements various v/d/i/e/w methods using kept println
and getStackTraceString
methods:
package com.example;
import android.util.Log;
public class Logger {
public static int w(String tag, String message) {
return Log.println(Log.WARN, tag, message);
}
public static int w(String tag, String msg, Throwable tr) {
return Log.println(Log.WARN, tag, msg + '\n' + Log.getStackTraceString(tr));
}
}
Then in your code, keep calling Log.*
methods for logs you'd want to remove but switch to Logger.*
methods for logs you'd like to keep.
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this one will be removed
Log.w("MainActivity", "in onCreate: removed");
// this one will be kept
Logger.w("MainActivity", "in onCreate: kept");
}
}