Android R8 не скрывает имя участника - PullRequest
0 голосов
/ 27 марта 2020

У меня есть этот код:

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 {
    ...
}

Анализ сгенерированного apk с помощью Android Studio, в 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.txt, mapping.txt и usage.txt в app/build/outputs/mapping/debug, но это не произошло.

Большое спасибо!

1 Ответ

2 голосов
/ 27 марта 2020

Ожидается, что имена локальных переменных будут удалены в выпусках версий приложения, они не нужны для выполнения (и не доступны через отражение). Таким образом, R8 не нужно и не переименовывает их. Попробуйте найти ту же информацию в сборке релиза, она не должна присутствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...