【问题标题】:Is it safe to use @SuppressLint("RestrictedApi") with AndroidX libraries?将 @SuppressLint("RestrictedApi") 与 AndroidX 库一起使用是否安全?
【发布时间】:2020-11-13 08:26:52
【问题描述】:

我现在想知道使用 @SuppressLint("RestrictedApi") 注释是否安全。我很确定答案是否定的,所以我也想问一下为什么。

我猜开发团队想对 API 用户隐藏这样的restricted code。可能是由于未来的变化或因为代码旨在用作内部功能

带有androidx.preference:preference:1.1.1的示例代码:

public abstract class CustomAdapterPreferenceFragment extends PreferenceFragmentCompat {

    @Override
    protected PreferenceGroupAdapter onCreateAdapter(PreferenceScreen preferenceScreen) {
        // this annotation removes warning that says PreferenceGroupAdapter can only be called from package names that start with androidx.preference        
        @SuppressLint("RestrictedApi")
        final PreferenceGroupAdapter adapter = new PreferenceGroupAdapter(preferenceScreen) {
            @Override
            public void onBindViewHolder(PreferenceViewHolder holder, int position) {
                super.onBindViewHolder(holder, position);
            }
        };
        return adapter;
    }

此示例中限制代码使用的注释链接:AOSP AndroidX

【问题讨论】:

标签: android annotations androidx


【解决方案1】:

你是对的:这不安全。标有@RestrictTo 的符号不被视为公共 API,并且可能会在版本之间任意更改行为或签名。唯一的保证是它们不会破坏其他 AndroidX 库在内部依赖的行为,并且没有定义该行为。

对于限制为单个库或库组的符号尤其如此,因为不需要保持与其他 AndroidX 库的不同版本的兼容性,该组中的所有库都需要固定到同一版本。

我猜开发团队想对 API 用户隐藏这些受限代码。可能是由于未来的变化或因为代码旨在用作内部功能

这完全正确。有时需要在内部公开作为公共 API 没有意义的功能,尽管我们通常会尽量避免这样做,因为它会使复制一部分代码并自定义您自己的版本变得更加困难。对于 Java 代码尤其如此,它没有 Kotlin 的 internal 修饰符来向整个库公开类(package-private 并没有真正削减它)。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 2012-07-26
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2021-11-07
    • 2011-12-04
    相关资源
    最近更新 更多