API server를 이용하는 app 중에는 Unity로 만든 것도 2개가 있었는데, 며칠 전에 그 중 하나의 GUI를 업데이트 하는 작업을 하였다. Unity의 테스트는 Windows에서 하기 때문에 개발 시의 테스트는 아무런 문제가 없이 잘 진행되었다. 그리고 최종 타겟 디바이스는 Android이기 때문에 마지막으로 디바이스에서 테스트만 하면 업데이트 테스트는 끝나는 상황이었다.
그런데, 그 중에 일부 기능이 타겟 동작을 하지 않았다.
<상황>
1. Windows에서는 잘 되던 app이 Android 디바이스에서는 제대로 동작하지 않았다.
2. 문제의 부분은 API server를 이용하는 부분이었다.
3. Server 쪽의 로그를 보면 app으로부터 아예 요청이 가지 않았다.
4. Unity 쪽에서 원인을 좁혀가니 www.error 가 "Unknown Error"가 발생하는 문제였다.
5. 네트워크와 관련된 부분은 이번에 code를 손댄 적이 없다.
6. 같은 API 서비스를 이용하는 또 다른 app은 문제없이 구동되고 있다.
흔한 오류 패턴은 아니었기 때문에 제일 먼저는 나의 실수인지를 체크했다.
잘 동작하고 있는 또 다른 app의 네트워크 부분과 diff 툴로 확인을 했지만 문제는 찾을 수가 없었다.
따로 방법이 없다보니 adb의 로그를 봐야 했다.
adb logcat -s Unity ActivityManager PackageManager dalvikvm DEBUG
그리고 유의미해 보이는 로그를 찾았다.
05-12 10:19:12.331 19641 19670 E Unity : java.io.IOException: Cleartext HTTP traffic to api.******.net not permitted
05-12 10:19:12.344 19641 19657 I Unity : ERROR: Unknown Error
https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html
즉, HTTP를 HTTPS로 바꾸어야 한다는 것인데, 그렇다고 당장에 server를 HTTPS로 바꾸는 것은 무리이다. 그리고 애시당초 내 쪽에서는 code를 손 댄 적이 없는데 발생하는 것이라서 더 원인을 알아 내야만 했다.
일단 1차적인 원인을 제거하기 위해서 Unity - Project Setting - Player 쪽으로 가서 Android의 빌드 버전을 바꾸기로 했는데 거기서 문제의 원인을 찾았다.
Android의 SDK가 다른 PC와의 작업을 위해서 Target API Level을 Automatic(highest installed) 로 했는데 그것이 문제였다.
최근에, Unity의 개발과는 별도로 또 다른 Android project를 위해 Android Studio를 업그레이드 하고 SDK도 가장 최신인 Pie를 추가로 설치했는데 이것이 문제의 발단이다.
원래는 제일 높은 버전이 27이었지만, 이 작업으로 인해 제일 높은 버전이 28로 바뀌게 되었고, Unity의 app을 Android용으로 재빌드를 하는 순간 API level 28이 적용되어 버린 것이었다.
Posted by 안영기