在ProGuard

时间:2015-10-13 17:35:31

标签: proguard android-proguard

我从http://proguard.sourceforge.net/manual/usage.html了解了assumenosideeffects的使用情况。我的问题涉及以下段落:

  

-assumenosideeffects class_specification       指定没有任何副作用的方法(除了可能返回值)。在优化步骤中, ProGuard会   然后删除对这些方法的调用,如果它可以确定返回   不使用值。 ProGuard将分析您的程序代码以进行查找   这样的方法自动。它不会分析库代码   因此,此选项可能很有用。例如,你可以   指定方法System.currentTimeMillis(),以便任何空闲调用   它将被删除。小心一点,您也可以使用选项   删除日志代码。请注意,ProGuard将选项应用于   指定方法的整个层次结构。仅适用于   优化。一般来说,做出假设可能是危险的;您可以   轻松破坏已处理的代码。如果您知道什么,请仅使用此选项   你在干嘛!

我需要了解ProGuard如何确定“不使用返回值”。特别是,如果方法调用没有返回任何值,它们是否总是被删除?

1 个答案:

答案 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>;
}