Mbtigram / 07 /

Dead in one second

듀얼 메신저에서 1초 만에 꺼지는 앱

같은 폰, 같은 앱인데 듀얼 메신저로 복제한 쪽만 켜자마자 꺼졌음. 앱 로그에는 아무것도 없었음. 원인은 광고 SDK가 읽으려던 기기 ID 하나.

복제한 앱만 꺼짐

삼성 폰에는 메신저 앱을 하나 더 복제해서 두 계정을 따로 쓰게 해 주는 "듀얼 메신저"가 있음. Mbtigram을 그렇게 복제해서 켜면 1초 만에 꺼졌음. 원래 앱은 멀쩡했음.

앱 로그에는 아무것도 없었음. 오류 한 줄 남기기 전에 프로세스가 통째로 사라졌기 때문임.

시스템 기록 확인

앱이 기록을 못 남기고 죽어도 안드로이드 시스템 쪽에는 흔적이 남음. 두 곳을 봤음.

adb shell dumpsys activity exit-info com.h57studio.mbtigram
adb shell dumpsys dropbox --print

여기에 원인이 있었음.

IllegalStateException: Ssaid settings not accessible

SSAID는 앱마다 주어지는 기기 ID(Settings.Secure.ANDROID_ID)임. 광고 SDK(애드몹)가 광고를 불러오면서 이 값을 읽음. 그런데 듀얼 메신저와 보안 폴더는 안드로이드 입장에서 다른 사용자 공간이고, 그 안에서는 이 값을 읽을 수 없음. 사용자 목록에서 확인할 수 있음.

adb shell pm list users
  ... 95:DUAL_APP
  ... 150:Secure Folder

실패 콜백으로는 안 잡힘

광고 SDK에는 광고를 못 불러왔을 때 오는 콜백(onAdFailedToLoad)이 있음. 광고가 안 나오는 상황은 거기서 처리하면 된다고 생각했는데, 이번 건 거기로 오지 않았음. 예외가 메인 스레드로 그대로 올라와서 앱 전체가 죽었음.

광고는 부가 기능이라, 광고가 안 나오는 건 괜찮아도 광고 때문에 앱이 안 켜지면 안 됨.

고친 것

  • 광고 SDK를 부르는 곳을 하나도 빼지 않고 try/catch로 감쌌음.
  • 예외가 나면 "광고 끔" 표시를 세우고, 그 뒤로는 광고를 아예 부르지 않음.
  • 그 공간에서는 어차피 광고가 나올 수 없으니, 광고만 빠지고 나머지는 정상 동작함.

광고 ID는 두 벌

광고를 다루는 김에 하나 더 정리했음. 개발용 빌드는 구글이 공개한 테스트 광고 ID를, 출시용 빌드는 실제 계정 ID를 씀. 개발하면서 실제 광고를 받으면 내 광고를 내가 보는 게 되고, 광고 쪽은 그걸 무효 트래픽으로 보고 계정을 정지할 수 있음.

그리고 앱 ID와 광고 단위 ID의 게시자 번호가 서로 다르면 광고가 아예 안 나옴. 오류도 거의 없이 빈칸만 남음. 그래서 두 값이 같은 계정에서 나온 건지부터 확인함.