Как получить имя метода в Android (java)

#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// .

Подробнее о деобфускации