반응형

테스트 스마트폰: 팬택 베가아이언 (LG-U+)

문제의 앱: OK Cashbag (version 5.3.0)


이 글은 2015년 6월 30일, OK Cashbag 버전 5.3.0을 기준으로 작성되었으며, 최신 버전에서는 문제가 없을 수도 있습니다.



오랜만에 아내의 폰을 살펴보면서 쓸데없이 실행 중인 앱들이 없는지 살펴보고 있었는데, 설정에서 강제 종료해도 바로 되살아나서 24시간 내내 실행 중인 상태를 유지하는 앱이 있었으니...


(OK Cashbag 앱은 항상 위와 같이 서비스들을 메모리에 상주시킨다.)


바로 OK Cashbag(OK 캐시백) 앱이 되겠다.

물론 백그라운드에서 서비스로 실행되고 있는 그 자체가 나쁘다는 것이 아니다.

지메일, 카카오톡, 페이스북 등 수많은 앱들이 백그라운드 서비스를 사용하고 있다.



하지만, 백그라운드에서 실행 중인 것만으로도 지나치게 많은 배터리를 소모한다면?



아무래도 배터리 소모가 이상한 것 같아서 재부팅 후 약 2시간 동안 대기 상태로 놓아 뒀다가 배터리 사용량을 확인해 보니, OK 캐시백이 어이없게도 무려 사용량 2위에 올라가 있다. 그동안 배터리는 약 6%를 소비했다. (95%에서 시작)


특정 앱이 배터리 사용량 2위를 차지하는 것이 별 것 아닌 것처럼 생각하는 분들도 계실 수 있겠지만, 저것은 절대로 일반적인 앱의 행태가 아니다. 앞서 말했듯이, 백그라운드 서비스를 실행하는 다른 각종 유명한 앱들(카카오톡, 페이스북, 지메일 등)은 백그라운드에서 실행 중인 상태에서는 절대로 저렇게 높은 순위에 올라가지 않는다. 내 스마트폰의 경우, 지메일과 카카오톡을 자주 켜서 사용하고 푸시 알림을 많이 받는데도 불구하고 배터리 소모량의 비중이 고작 3~4%밖에 되지 않는다.


그런데 저 황당한 OK 캐시백 앱은 단 한번도 켜지 않았는데도 배터리 사용량이 무려 2위이고, 사용량 비중도 14%나 되니까 얼마나 백그라운드에서 쓸데없는 짓을 많이 하길래 그러는지 궁금할 지경이다.



OK 캐시백 앱을 확인해 보니 각종 푸시 알림을 받는 기능을 비롯해서 블루투스 등 백그라운드에서 실행되는 기능 여러가지가 사용하도록 설정되어 있었다. 아내는 OK 캐시백 앱을 실제로 켜서 쓰는 경우가 일주일에 한 번이 채 안되기 때문에, 이것은 지나친 배터리 낭비라고 생각되어 푸시 알림과 위치기반 설정을 모두 해제시켰다.



하지만...

이렇게 각종 푸시 알림을 해제하고 나서 또 한 시간 가량을 대기 상태로 둔 다음 다시 확인했는데도 OK 캐시백은 여전히 배터리 사용량 2위를 차지하고 있었다. 그리고 실행 중인 앱 목록에서도 버젓이 실행되고 있었을 뿐만 아니라, 분명히 블루투스 기능을 해제시켰는데도 블루투스 Low Energy 기능과 연관된 BLEService가 버젓이 실행되고 있었다. 백그라운드 서비스 관리 능력이 완전 빵점이다.


이쯤 되면 개발자가 앱/서비스 최적화 따위는 안중에도 없다는 소리다. 앱에서 블루투스 기능 자체를 쓰지 않기로 설정을 했으면 블루투스 관련 모듈은 종료시키거나 아예 로드를 하지 말아야 하는데, 이 게으른 개발자는 그런 개념없이 무조건 다 실행되도록 해 놓았나 보다.


명색이 블루투스 Low Energy (BLE)인데, OK 캐시백 앱에서는 위와 같이 지나치게 블루투스 기능을 활성화시킴으로써 저전력이라는 말이 무색해지는 꼴이 되었다. 앱이 내부적으로 BLE를 어떻게 쓰길래 배터리를 이렇게나 들이켜 대는지도 궁금하다. 고해상도 이미지를 떡칠해서 겉만 번지르르하게 만들지 말고, 내부 프로세스를 코딩할 때 신경 좀 썼으면 좋겠다.



반응형
블로그 이미지

Bryan_

,
반응형

테스트한 기기: 삼성 갤럭시노트3 네오(SM-N750L)

안드로이드 버전: 4.4.2


안드로이드 폰을 쓰다가 유난히 배터리 소모가 빨라진 것 같은 느낌이 들어서 설정에 있는 배터리 사용량을 확인해 보니, 이상하게 "안드로이드 운영체제" 항목이 전체의 70%가 넘는 배터리를 소모하고 있었다. 그 다음 카카오톡, 화면 등이 2등, 3등으로 뒤를 이었지만 배터리 사용량이 각각 10%가 되지 않는 황당한 상황이 발생...


성능에 따라 약간의 차이는 있지만 일반적인 안드로이드 폰에서는 화면이 가장 많은 배터리 사용량을 차지하고 그 비중도 약 50% 정도를 차지하는 것과 비교해 보면 뭔가 비정상적인 상태임을 예상할 수 있다.



결론적으로는 이전 포스팅(안드로이드 폰에서 저절로 블루투스가 자꾸 켜지는 경우)과 연관된 문제로써, CJ ONE 앱에서 끊임없이 블루투스에 접근하려고 하면서 뭔가 문제를 일으켰던 것 같다. CJ ONE 앱에서 블루투스 자동 접근을 해제하고 스마트폰을 완전충전시킨 상태에서 재부팅 후에 약 9시간을 평소와 다를 바 없이 두었더니, 배터리 사용량이 예전처럼 정상으로 돌아왔다. (시간당 약 1%의 배터리 소모)


그렇다면 CJ ONE 앱이 유난히 배터리를 많이 쓴 것이 되어야 하는데 왜 "안드로이드 운영체제"가 가장 많이 사용한 것으로 표시가 되었을까? 인터넷상에서 비슷한 문제를 겪는 사람들의 글과 답변들을 종합해 보면, 안드로이드 기기 자체에 뭔가 요청하는 코드에서 문제가 발생해 에너지를 소모할 경우, 안드로이드 운영체제에서 시스템 요청(system call)을 받고 처리하기 때문에 아마 "안드로이드 운영체제" 쪽으로 계산되는 것 같다.


블루투스의 경우에도 운영체제에서 제어권을 주도하면서 앱들의 요청에 응답해 주는 방식이므로, CJ ONE 앱에서 비정상적인 요청을 하거나 과도하게 많은 시스템 요청을 할 경우에는 운영체제 자체에 부하가 걸릴 수 있다.


그러므로 평소에 비해 체감할 정도로 유난히 배터리 소모가 많고 "안드로이드 운영체제"의 사용량이 매우 높을 경우, 그렇게 느낄 때쯤에 설치/업데이트한 앱을 추적해서 하나씩 테스트(종료하거나 설정을 변경하거나 삭제)해 보는 것이 좋은 방법이 될 수 있다.



---

참고로 이러한 비정상적인 활동이 아닌데 배터리 소모가 빨라지는 느낌이 든다면, 앱이나 안드로이드 자체가 위치정보(특히 GPS 관련)를 많이 쓰는지 확인할 필요가 있다. 그 이유는:

  • GPS 센서가 네트워킹/센싱 장비 중에서 배터리 소모가 비교적 많기도 하고, 
  • "안드로이드 기기 관리자"에서 휴대폰 분실 시 실시간 위치 확인과 원격 제어(원격에서 폰을 잠그거나 데이터 삭제)를 하기 위해서 지속적으로 현재 위치를 트래킹하기 때문이다.



반응형
블로그 이미지

Bryan_

,
반응형

사용중인 폰: 삼성 갤럭시 노트3 네오 (SM-N750L)

안드로이드 버전: 4.4.2

원인 제공 앱: CJ ONE


나는 평소에 스마트폰에서 블루투스를 거의 안쓰기 때문에 항상 블루투스는 꺼 두는데, 어느 순간 스마트폰을 켜서 상태표시줄을 보면 내가 켜지도 않은 블루투스가 자동으로 켜지는 경우가 있다.


앱이나 서비스 중에서 자동으로 블루투스를 주기적으로 켜는 것이라고 예상되어 앱을 하나씩 살펴보다가, 유력한 원인을 제공하는 앱을 찾았다.


(CJ ONE 안드로이드 앱의 환경설정 창)


언제부턴가 (올해 봄 정도로 추정) CJ ONE 앱이 업데이트되면서 환경설정에 위의 화면과 같이 "블루투스 허용/주변혜택알림 설정" 옵션이 생긴 것 같고, 기본적으로 체크된 상태로 되어 있었기에 지속적으로 블루투스에 접근했던 것으로 예상된다.

--> 구글 Play 스토어에서 확인해본 결과, 2.9 버전부터 블루투스 허용 옵션이 추가되었다고 한다. 다른 사용자들 중에서도 자꾸 자동으로 블루투스가 켜진다거나, 블루투스가 자꾸 오류를 일으킨다는 평가가 보인다.


실제로 안드로이드 폰을 재부팅해 보면, CJ ONE을 직접 켜지 않았는데도 항상 실행중인 앱으로 표시가 되었는데, 그것도 아마 저 블루투스 허용 옵션 때문일 것으로 추정된다. 하지만 나는 CJ ONE 앱을 필요할 때만 직접 켜서 쓰기 때문에(매장에 방문했을 때만), 저 옵션은 오늘부로 비활성화 되었다.


CJ ONE 앱 자체는 플라스틱 카드 대용으로 포인트를 적립하거나 실시간으로 포인트 적립 현황을 확인하는 데 유용하게 쓰고 있지만, 한 가지 아쉬운 점은 위와 같은 옵션은 원래 자동으로 체크되어 있지 않아야 하는데 사용자에게 아무런 알림창이나 동의 절차 없이 자의적으로 설정된는 점이다.


위치기반 서비스들 중에서는 GPS 위치를 써야 할 때 앱에서 마음대로 켜지 않고 반드시 사용자의 동의를 얻은 다음 켜도록 되어 있는데 블루투스는 그렇게 강한 보호 정책을 쓰지 않는 것일지도 모르겠다. 하지만 그럼에도 불구하고 다른 앱들 중에서 블루투스를 켜야 할 때에도 사용자에게 대화창으로 물어봐서 승인을 받는 경우도 본 적이 있으므로, 이것은 결국 앱 개발자의 사용자 배려 의지에 달려 있기도 하다.



반응형
블로그 이미지

Bryan_

,
반응형

콘솔창(Windows의 cmd 또는 리눅스의 terminal)에서 아래와 같이 입력한다.

전제조건: 안드로이드 폰에 대한 USB 드라이버 및 adb가 설치되어 있어야 함.


> adb shell

$ pm list packages -f




반응형
블로그 이미지

Bryan_

,
반응형
Nexus S (넥서스S)에서 카메라 모듈을 쓰려고 할 때 startPreview 에러가 발생할 때가 있는데, 이 때는 카메라의 preview size를 명시적으로 지정하되, 사이즈를 주의해서 지정해 주어야 하는 것 같다.

참고(reference): http://soledadpenades.com/2011/04/05/native-startpreview-failed-on-nexus-s-check-your-preview-size/

위의 사이트에서는 preview size를 8x16으로 해서 됐다고 하는데, 시스템에서 지원하는 size를 얻어 오는 것으로도 에러 없이 실행이 되는 것 같다.
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();

// get the first preview size supported by the device
Camera.Size s = parameters.getSupportedPreviewSizes().get(0);

parameters.setPreviewSize(s.width, s.height);
camera.setParameters(parameters);

삼성 안드로이드 기기의 문제인지 넥서스S만의 문제인지는 모르지만, 다른 기기들에서 정상적으로 돌아가는 코드가 가끔 실행이 안될 때가 있어서 간단히 기록해 두었다.

반응형
블로그 이미지

Bryan_

,