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

Bam*_*amx 5 android annotations androidx

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

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

示例代码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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ley 2

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

对于限制为单个库或库组(要求组内的所有库固定到同一版本)的符号尤其如此,因为无需维护与其他 AndroidX 库的不同版本的兼容性。

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

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