我从http://proguard.sourceforge.net/manual/usage.html了解了assumenosideeffects
的使用情况。我的问题涉及以下段落:
-assumenosideeffects class_specification 指定没有任何副作用的方法(除了可能返回值)。在优化步骤中, ProGuard会 然后删除对这些方法的调用,如果它可以确定返回 不使用值。 ProGuard将分析您的程序代码以进行查找 这样的方法自动。它不会分析库代码 因此,此选项可能很有用。例如,你可以 指定方法System.currentTimeMillis(),以便任何空闲调用 它将被删除。小心一点,您也可以使用选项 删除日志代码。请注意,ProGuard将选项应用于 指定方法的整个层次结构。仅适用于 优化。一般来说,做出假设可能是危险的;您可以 轻松破坏已处理的代码。如果您知道什么,请仅使用此选项 你在干嘛!
我需要了解ProGuard如何确定“不使用返回值”。特别是,如果方法调用没有返回任何值,它们是否总是被删除?
答案 0 :(得分:3)
如果方法调用没有返回任何值,它们是否总是被删除?
答案是肯定的。一个例子是Chromium sources:
private ChromeBrowserInitializer(Context context) {
mApplication = (ChromeApplication) context.getApplicationContext();
mHandler = new Handler(Looper.getMainLooper());
initLeakCanary();
}
@RemovableInRelease
private void initLeakCanary() {
// Watch that Activity objects are not retained after their onDestroy() has been called.
// This is a no-op in release builds.
LeakCanary.install(mApplication);
}
将从发布版本中删除使用@RemovableInRelease
注释的方法。 chromium_code.flags:
# Remove methods annotated with this if their return value is unused.
-assumenosideeffects class ** {
@org.chromium.base.annotations.RemovableInRelease <methods>;
}