Android R8 不混淆成员名称

Android R8 does not obfuscate a member name

我有这个代码:

import static com.example.test.Utils.getPackageManagerReflection;
...

public class MainActivity extends AppCompatActivity {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        PackageManager packageManagerReflection;
        try {
            packageManagerReflection = getPackageManagerReflection(...);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        if(packageManagerReflection == null) {
            finish();
            return;
        }
    }

    ...
}

com.example.test.Utils.getPackageManagerReflection:

public static <A, B> B getPackageManagerReflection(A param1, Class<B> param2, byte[] param2, Object param4) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    ...
}

使用 Android Studio 分析生成的 apk,在 classes.dex 中有 packageManagerReflection 清晰可读,但 getPackageManagerReflection 没有:

.line 225
    .end local v2    # "packageManagerReflection":Landroid/content/pm/PackageManager;
    .end local v3    # "deviceId":Ljava/lang/String;
    .end local v5    # "exception":Ljava/lang/IllegalArgumentException;
    :catch_301
    move-exception v2

.line 231
    .local v2, "packageManagerReflection":Landroid/content/pm/PackageManager;
    nop

我使用的是最新版本的 Android Studio 及其所有组件。

为什么生成的代码中保留了成员 packageManagerReflection 的名称?

我已经尝试将其重命名为不带 reflection 的其他名称(例如 packageManagerRef 但它仍然与 classes.dex.

进行比较

我也已经在 seeds.txtmapping.txtusage.txt 中看到 app/build/outputs/mapping/debug,但是没有出现。

非常感谢!

局部变量名称预计会在应用程序的发布版本中被删除,它们不是执行所必需的(并且无法通过反射获得)。因此,R8 不需要也不会重命名它们。尝试在发布版本中查找相同的信息,它不应该存在。