将 @SuppressLint("RestrictedApi") 与 AndroidX 库一起使用是否安全?

Is it safe to use @SuppressLint("RestrictedApi") with AndroidX libraries?

我现在想知道使用@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;
    }

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

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

对于限制为单个库或库组的符号尤其如此,因为不需要保持与其他 AndroidX 的不同版本的兼容性图书馆。

I guess that the development team wanted to hide such restricted code from the API users. Probably due to changes in the future or because the code is intended to work as internal functionality

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