본문 바로가기

Technical Docs/Android

Smali 수정으로 logcat 남기기

며칠 전 안드로이드에서 특정 함수가 몇 번 실행되는지 테스트를 해야할일이 있었다.

그냥 프리다로 찍어보면 편하겠지만 왠지 오랜만에 Smali 를 수정해서 로그를 찍어보고 싶어보고 싶어서 해봤다.

 

로그켓을 한번이라도 찍어본 사람은 알겠지만, 대충 사용자가 지정할건 Tag랑 Text라고 볼 수 있다. 뭐 다른것도 지정 가능하겠지만...

Tag, Text

 

그래서 Smali 를 사용할 때 String을 두 개를 만들어준다. 실제 코드는 아래와 같다.

const-string v2, "patrick_test1"
const-string v3, "patrick_test2"
invoke-static {v2,v3}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I

 

근데 혹시.. 라도 수정할 때  V2, v3을 그대로 따라하시는 분이 있을까봐 첨언하자면

Smali 에서 v2, v3 같은 값을 사용할 때는 그 위에 정해진 숫자만큼 사용이 가능하다.

 

뭐 대충의 함수안에다 이제 내가 원하는 구문을 집어넣는다고 보면 .locals 4 라는 문구가 보인다.

저것은 메소드 내부에서 사용할 레지스터의 개수를 나타낸다. 그니까 대충 4면 v,v1,v2,v3 이렇게 4개를 쓸 수 있다고 생각하면 된다.

 

근데 우리는 logcat을 만들면서 2개의 레지스터를 추가로 사용할 예정이기 때문에 .locals 기존값+2로 수정을 해줘야한다. 물론 기존에 만들어진 레지스터를 사용해도 되지만 혹시 어디서 엉킬수도 있기 때문에 그냥 새로 만들어서 쓰는게 편하다;;

 

무튼 저렇게 Smali를 수정해주고 다시 컴파일하고 사이닝까지 해주면 끗이다. 그리고 앱을 실행시키고 내가 수정한 부분이 실행되면

아래와 같이 정상적으로 logcat이 찍히는 것을 확인할 수 있다.

 

명령어는 그냥 adb logcat > logcat.txt 를 통해 파일로 떨궈서 확인을 했다.