안드로이드 네이티브 앱 배포 중 생긴일
웹과 서버를 개발하는 나에게 이번에 주어진 프로젝트는 안드로이드 네이티브 앱 개발이었다.
심지어 java를 사용했다.
앱이라는거에서 거부감이 먼저들었고, 심지어 Kotlin도 아닌 java 로 해야되서 2차 거부감이 들어서, 썩 내키는 작업은 아니었다.
하지만 앱에도 관심이 있고, react에 익숙해지고 나서는 react native도 깊에 해볼생각이기 때문에 네이티브를 다뤄보는 경험도 좋은 밑거름 이라 생각하고 임했다. (RN의 경우 네이티브 폴더를 건드릴 일이 많기때문에, 실제로 RN프로젝트 연습을 하면서 그런일이 많았는데, 이번 작업의 경험을 바탕으로 이해가 안되는 상황은 없었다)
문제의 발생시점
이미 수 많은 피드백과, 에러를 수정하여 apk파일을 전달하고, 작업은 끝났었다.
그런데 앱에 내장해서 배포를 하는데 유독 내가 준 apk파일만 에러가 난다고했다. 그래서 끝없이 찾아보았다... 배포에관해서
그러다보니.. 안드로이드 빌드방식엔 두가지가 있었다.
Debug모드와 release모드 이다.
release로 다시 빌드
그럼 간단히 다시 release로 빌드하면 되겠지? 라는생각으로 다시빌드하고 테스트를 해보았는데, 실행까진 잘되었다.
그런데 내가 작업한 디바이스는 PM500라는 카드 결제 기기이다.
디바이스에서 카드를 인식하는 모듈을 제공하는데 그것을 가져다가 썻다.
그런데 프린터모듈을 사용하는 부분으로 들어가면 앱이 종료되었다.
모듈특성상 가상머신으로돌릴 수 없었고, 충전 단자도 고장난 상태라, 임시 노드서버로 apk를 다운하면서 테스트하고있엇다.
그래서 어쩔수없이 에러나는 부분을 catch해서 toast창을 띄우고 캡쳐해서 읽어봤다.
Null을 참조하는 에러가 떳는데, debug모드에서 빌드했을때는 분명히 잘되고있는데, release모드일때만 발생했다.
debug 모드와 release 모드의 차이점
위 블로그에 자세히 나와있고, 다른블로그와 stack overflow 등 나와같이 빌드모드의 차이로 앱이 종료된다는 에러가 종종있었고 결론적으로 메모리의 부족현상으로 종료되는 것이었다.
디버그모드일 때 와 릴리즈 모드일 때는 초기에 주어지는 메모리의 초기값이 달랐다.
그래서 디버그모드로 빌드했을때는 메모리가 여유로웠지만 릴리즈모드일때는 최대한 압축하기 때문에 메모리가 부족한 것이었습니다.
해결법
해결은 원초적인 방법과 야매적인 방법이있었습니다.
야매방식은 release 빌드 옵션에 debuggable 옵션을 true로 주면 마치 디버깅하는것처럼 빌드됩니다. 그래서 결과가 디버깅했을때와 같고, 하지만 실무에는 적합하지 않습니다. 껍대기만 릴리즈용이고 실제로는 디버깅용으로 되었기 때문에 용량도 크고 속도도 저하됩니다.
원초적인 해결방법은 코드에서 메모리 접근하는부분, 배열이나, 인스턴스같은 부분을 꼼꼼히 보시고 수정해야합니다.
혹은 DEBUG환경일때의 처리하는 코드들이 분리되어있는부분들도있는데, 그쪽을 살펴보기도 하더군요
저는 네이티브에 큰 뜻이없기때문에, 그리고 외부 모듈이 워낙 복잡해서 야매로 해결하였습니다.
느낀점
앱은 설정이 5할인거같습니다. 하지만 그만큼 처음에 삽질열심히하면서 경험을 쌓고나면, 설정이야 매번 같은 맥락이기 때문에 초반에만 잘견디면 이후에는 웹 보다 오히려 제공하는 모듈이 정확하고, 직접 작업해보니 잘짜여진 프레임워크에서 편하게 코딩하는 느낌이었습니다.
앱은 기능이 다 비슷한것들이기 때문에, 또 자주쓰이는 기능들만 있어서 어느정도 익숙해지면 편할 거같다는 개인적인 생각입니다.
ps. 앱은 RN으로 돌아오겠습니다.
'Archive' 카테고리의 다른 글
순수 CSS만으로 카드리스트 만들기 (0) | 2022.02.27 |
---|---|
webpack 공식문서 파해치기 (0) | 2022.02.19 |
Gatsby의 동작원리와 맛보기 (0) | 2022.02.15 |
Gatsby란? (0) | 2022.02.15 |
[React 프로젝트] 썸네일 생성기 (0) | 2022.02.10 |