#java #android
Вопрос:
Я хочу получить имя метода в приложении для Android для целей ведения журнала, но, похоже, не могу его получить. Я уже пытался делать то, что было предложено в других ответах, таких как:
Thread.currentThread().getStackTrace();
и
new Object(){}.getClass().getEnclosingMethod().getName();
Безрезультатно, первый возвращает мне стек с чем-то вроде:
getThreadStackTrace
getStackTrace
a
b
a
run
mainLoop
run
Второй возвращает «a» в качестве имени метода.
Кто-нибудь знает другой способ его получения или почему это происходит?
Комментарии:
1. Это связано с запутыванием кода . Proguard или R8 будут включены в приложении.
2. Первый — это печать имен методов, которые в данный момент находятся в стеке в момент выполнения вашей программы в этом потоке. И второй — это печать имени метода, из которого вы выполняете этот фрагмент кода.
3. @Abhimanyu вот и все, большое спасибо. Если вы хотите, вы можете написать это как ответ, чтобы я мог его принять.
Ответ №1:
Эти a
имена и b
имена методов отображаются, когда включена обфускация кода.
В Android это делает Proguard или R8.
После того, как R8 запутывает ваш код, понимание трассировки стека затруднено (если не невозможно), поскольку имена классов и методов могли быть изменены. Помимо переименования, R8 также может изменять номера строк, присутствующие в трассировках стека, для достижения дополнительной экономии размера при записи файлов DEX.
Если нам нужно деобфускировать код, мы должны использовать mapping.txt
сгенерированный во время сборки.
К счастью, R8 создает mapping.txt файл при каждом запуске, содержащий запутанные имена классов, методов и полей, сопоставленные с исходными именами. Этот файл сопоставления также содержит информацию для сопоставления номеров строк с номерами строк исходного исходного файла. R8 сохраняет файл в каталоге /build/outputs/mapping// .
Подробнее о деобфускации