GCM으로 전환 후 C2DM이 적용된 단말 처리


현재 일하고 있는 곳에서 운영하고 있는 모바일 시스템이 아직도
C2DM을 사용하고 있다.


최근 다른 PUSH 솔루션을 이용할 계획이 수립됨에 따라 GCM을
사용하는 PUSH 솔루션에 맞추어서 우리도 GCM으로 migration을 해야하는데
모바일 기기를 일괄로 GCM으로 업데이트 못할 경우 서버는 GCM으로 모바일 기기는
C2DM으로 서로 안맞는 경우가 발생을 할 것 같으니 혹시 C2DM을 통해 받은 
auth token을 GCM에서 바로 사용할 수는 없는지 확인해 달라고 한다.


진작에 구글 개발자 사이트로 갔어야 하는데 괜히 여기저기 기웃거리느라 
시간만 뺐겼다…-.-


결론은 다음과 같다.


GCM의 API key와 C2DM의 token을 파라미터로 
https://android.apis.google.com/c2dm/migrate API를 호출하면
응답이 오는데 이 응답에 새로은 auth token이 포함되어있으니 이 auth token을
이용하여 push를 전송하면 된다.

출처 : https://developers.google.com/cloud-messaging/c2dm#supporting-legacy-client-apps


이게 뭔 뻘짓거리인가…-.-
어차피 GCM 등록은 해야 하고…새로운 토큰을 별도로 받아서 처리를 해야 한다니…-.-
그냥 GCM이 설치된 버전의 앱을 일괄 배포하고 강제 업데이트 하도록 진행하는 것이
백번 낫겠다…


암튼 별로 권장할만한 방법이 아닌 것은 분명하다…

저작자 표시
신고

일단 이 내용은 공식적인 기술 문서에 의한 것이 아니라

전적으로 개발상의 경험으로 정리한 내용이니 착오 없으시길 바랍니다.


문제의 발단은

현재 회사에서 운영 중인 앱의 안드로이드 버전에서

이전 버전은 홈버튼을 놀러 앱을 종료한 후 재실행 할 경우 바로 직전 화면으로 들어가는데

가장 최근 배포한 버전은 위와 같은 경우 다시 처음 로그인 화면부터 뜬다는 것이다.


로그를 확인해보니 이전 버전에서는 홈 버튼을 누른 후 재실행시 onCreate(), onResume() 어느 함수도

실행되지 않았는데 최근 배포버전은 onCreate()와 onResume()을 차례로 호출하고 있었다.


계속 검색하고 소스 코드 분석 하고 하던 중 마지막으로 확인하게 된 것이 AndroidManifest.xml 파일의

메인 Activity에 설정되어있는 android:launchMode 속성...


이전 버전 소스와 비교를 해보니 이전 버전은 이 설정 값이 singleTop으로 되어있는데

최신 배포버전에는 이 설정값이 singleTask로 되어있었다.


검색한 내용으로는

singleTop의 경우 이 값이 설정된 Activity는 호출되면 호출된 것 만큼 생성을 하는데 

다만 기존에 생성된 것이 있다면 이 것을 재활용 하게 된다고 한다. 

따라서 이 경우에는 기존에 떠있는 프로세스를 그대로 사용하기에 onCreate()가 호출되지 않는 것이다.


하지만 singleTask의 경우 이 값이 설정된 Activity는 호출되면 기존 Activity를 죽이고 새로 instance를

생성하기 때문에 항상 onCreate()부터 시작하게 되는 것이다.


이렇게 홈 버튼으로 앱 종료 후 재실행 할 때 onCreate()의 호출 여부로도 singleTop과 singleTask의 차이를

확인할 수 있다.

저작자 표시
신고

최초 작성일 : 2013/02/08 18:03 


긴 글 싫어하시는 분들을 위한 3줄 요약

1. ADT Errors running builder 'Android Pre Compiler' on project 문제 발생
2. Android SDK Tool 21.0.1에는 버그가 있으므로 Android SDK Tool 21.1 rc 설치
3. Android SDK Tool 21.1 rc 설치 후 반드시 https://dl-ssl.google.com/android/eclipse-preview/에서
관련 패키지들 업데이트

=============================================

현재 맥북 프로에서 이클립스를 이용하여 안드로이드를 개발(사실은 운영)하고 있다.
이클립스 버전은 JUNO를 사용 중인데...얼마전 뭔가를 잘못 업데이트 했는지
이클립스를 실행시키면 항상 Loading Workbench에서 이클립스가 멈춰버리는
문제가 생겼다.

이 문제에 대해 이것 저것 검색도 하고 검색한 것을 적용도 해보았지만
완전한 해결책은 찾지를 못했고 이클립스를 실행하기 전에 항상 metadata 디렉토리를
삭제한 후 실행을 시켰다. 물론 프로젝트 설정은 다 날아가서 늘 프로젝트를
새로 import해야 하는 문제가 있었지만...ㅠ.ㅠ

오늘 이 문제를 제대로 고쳐보고자 맘먹고 전체 세팅을 바꾸기로 했다.

그런데...빈대 잡다가 초가삼간 태운다고...몇가지 업데이트를 하는 과정에서
더 심각한 문제가 발생을 하였다.

프로젝트를 import한 후 clean이나 build를 수행하니 에러가 발생을 하는 것이었다.
아래의 메시지를 출력하면서 빌드가 되지 않았는데 증상은 aidl 파일들이 java 파일로
변화되지 않는 것이었다.

ADT Errors running builder 'Android Pre Compiler' on project

역시 구글링을 통해 문제를 해결하고자 열심히 검색하고 몇가지 해법을 찾았으나
요지부동...

그 과정에서 얻은 것은 Android SDK를 새로 받았더니...
오호라! 이클립스가 ADT라는 이름의 번들로 추가되어 있는 것이었다.
이제는 번거롭게 이클립스 다운받고 또  ADT 설정하고 할 필요가 없어졌다.
그냥 SDK 하나 다운로드 받으면 만사 땡~

암튼...
이렇게 까지 했는데도 문제가 해결되지 않았다.
가장 확실해보이는 해법은 현재 적용된 Android SDK Tool 21.0.1 버전에 버그가
있기 때문에 아직 Preview 단계인 Android SDK Tool 21.1 rc 버전을 받아야 한다는
것이었다.

다음은 stackoverflow에 달린 답변 전문이다.

I always hate answering my own questsions, but this is a genuine solution.

The 21.0.1 version of the ADT tools has a bug that prevents a project building if you have any files without extensions in them. This is a particular problem for users (like me) using subversion with has extenion-less files.

One recommended solution is to install these 'subversive' Eclipse plugins (Help > Install new Software > Work with your Eclipse version site > Expand 'Collaboration' > Choose 'Subversive SVN JDT Ignore Extensions' and 'Subversive SVN Team Provider') but this didn't work for me (I'm on Indigo, perhaps on Juno it works).

The solution is to install the 21.1 preview version of the ADT tools and SDK manager from Google. Clear instructions can be found here and you can read all the background add your voice to the angry mob of developers here.


그래서 시키는대로 했는데도 불구하고 이번에는 SDK를 못찾는 문제가 생겼다.
분명 설정 화면에서 SDK 위치를 지정을 해 주었는데도 불구하고 SDK를 인식하지
못하는 것이었다.

요기서 얼마간 삽질이 있었다.
결국 생각해보면 Android SDK Tool 21.1 rc이라는 새 버전을 사용하게 된만큼
관련된 다른 패키지들도 업데이트를 해주어야 하는 것이 당연지사인데 그것을
생각지 못한 것이다.

그리고 드디어 새로운 소프트웨어 설치를 통해 아래 링크를 이용하여 다른 패키지를
모두 업데이트한 이후에야 모든 문제가 해결되었다.


정말 힘든 하루였다...ㅠ.ㅠ

저작자 표시
신고

최초 작성일 : 2012/07/20 16:05


현재 송해 아저씨 광고하는 모 은행에서 모바일 관련 운영 업무를 맡고있다.


최근 아이폰은 괜찮은데 안드로이드쪽의 푸시가 잘 안온다는 고객측의 클레임이 있어
조치를 하다가 C2DM 계정이 이전 개발당시의 테스트용 계정인 것 같아 새 계정을
만들어 다시 테스트를 해보기로 결정하고 C2DM 계정을 등록하려는데...

이게 웬일...

2012년 6월 26일자로 기존의 C2DM 서비스는 deprecated 되었단다...ㅠ.ㅠ
다음은 구글의 개발자 페이지에 있는 안내문이다.




위 내용 하단에 링크되어있는 GCM 서비스가 C2DM을 대체한다.
아이폰 개발이 메인이다보니 안드로이드쪽 정보에 너무 둔감했나보다.

그나저나 기존 소스를 GCM에 맞춰 수정해야 하나...
일거리가 늘어버렸다...ㅠ.ㅠ

저작자 표시
신고

최초 작성일 : 2012/02/13 09:32 


그동안 프로가드를 이용하여 난독화를 진행해왔는데 최근 신규 라이브러리를

추가하면서 아래와 같은 에러가 발생하였다.

[2012-02-13 09:27:14 - IBKLauncher_Dev] Proguard returned with error code 1. See console

[2012-02-13 09:27:14 - IBKLauncher_Dev] Note: there were 993 duplicate class definitions.

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find superclass or interface java.awt.Frame

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find superclass or interface java.awt.event.ActionListener

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find superclass or interface java.awt.event.WindowListener

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.SocksDialog: can't find superclass or interface java.awt.Dialog

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.SocksDialog: can't find superclass or interface java.awt.event.WindowListener

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.SocksDialog: can't find superclass or interface java.awt.event.ItemListener

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.SocksDialog: can't find superclass or interface java.awt.event.ActionListener

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.UDPRelayServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.UDPRelayServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.UDPRelayServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.UDPRelayServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find referenced class java.awt.Frame

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find referenced class java.awt.image.ImageProducer

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find referenced method 'java.awt.Image createImage(java.awt.image.ImageProducer)' in class net.sourceforge.jsocks.SocksEcho

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.SocksEcho: can't find referenced method 'void setIconImage(java.awt.Image)' in class net.sourceforge.jsocks.SocksEcho

.

.

.

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.ProxyServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.ProxyServer: can't find referenced class org.apache.commons.lang.RandomStringUtils

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: net.sourceforge.jsocks.socks.ProxyServer: can't find referenced class org.apache.log4j.Logger

[2012-02-13 09:27:14 - IBKLauncher_Dev]       You should check if you need to specify additional program jars.

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: there were 241 unresolved references to classes or interfaces.

[2012-02-13 09:27:14 - IBKLauncher_Dev]          You may need to specify additional library jars (using '-libraryjars'),

[2012-02-13 09:27:14 - IBKLauncher_Dev]          or perhaps the '-dontskipnonpubliclibraryclasses' option.

[2012-02-13 09:27:14 - IBKLauncher_Dev] Warning: there were 14 unresolved references to program class members.

[2012-02-13 09:27:14 - IBKLauncher_Dev]          Your input classes appear to be inconsistent.

[2012-02-13 09:27:14 - IBKLauncher_Dev]          You may need to recompile them and try again.

[2012-02-13 09:27:14 - IBKLauncher_Dev]          Alternatively, you may have to specify the options

[2012-02-13 09:27:14 - IBKLauncher_Dev]          '-dontskipnonpubliclibraryclasses' and/or

[2012-02-13 09:27:14 - IBKLauncher_Dev]          '-dontskipnonpubliclibraryclassmembers'.

[2012-02-13 09:27:14 - IBKLauncher_Dev] java.io.IOException: Please correct the above warnings first.

[2012-02-13 09:27:14 - IBKLauncher_Dev]  at proguard.Initializer.execute(Initializer.java:308)

[2012-02-13 09:27:14 - IBKLauncher_Dev]  at proguard.ProGuard.initialize(ProGuard.java:210)

[2012-02-13 09:27:14 - IBKLauncher_Dev]  at proguard.ProGuard.execute(ProGuard.java:85)

[2012-02-13 09:27:14 - IBKLauncher_Dev]  at proguard.ProGuard.main(ProGuard.java:499)


안드로이드 개발 경험이 일천한지라 무지 당황하였다.
답은 역시 구글링~
그러 문제가 발생한 패키지에 -dontwarn 옵션을 주면 해결되는 문제였다.

-dontwarn net.sourceforge.jsocks.**

어렵지 않게 해결되어 다행이다...ㅠ.ㅠ

저작자 표시
신고

최초 작성일 : 2011/12/28 15:37 


현재 운영중인 하이브리드 형태의 private app store에서

일반 http로 다운로드를 받던 것을 보안 강화를 위해 다운로드 URL도
SSL을 적용하여 https로 다운로드 받도록 수정하였다.

수정 후 일부 단말에서 특정 앱을 받을 때 아래와 같은 에러가 발생하였다.

12-23 09:15:59.425: W/System.err(1818): javax.net.ssl.SSLProtocolException: Read error: ssl=0x337c48: Failure in SSL library, usually a protocol error
12-23 09:15:59.425: W/System.err(1818):  at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method)
12-23 09:15:59.425: W/System.err(1818):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:788)
12-23 09:15:59.425: W/System.err(1818):  at org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStream.read(ChunkedInputStream.java:50)
12-23 09:15:59.425: W/System.err(1818):  at java.io.DataInputStream.read(DataInputStream.java:69)
12-23 09:15:59.425: W/System.err(1818):  at com.sds.mdmain.ui.bizinstaller.BizAppInstaller$DownloadTask.Download(BizAppInstaller.java:242)
12-23 09:15:59.425: W/System.err(1818):  at com.sds.mdmain.ui.bizinstaller.BizAppInstaller$DownloadTask.doInBackground(BizAppInstaller.java:160)
12-23 09:15:59.425: W/System.err(1818):  at com.sds.mdmain.ui.bizinstaller.BizAppInstaller$DownloadTask.doInBackground(BizAppInstaller.java:1)
12-23 09:15:59.429: W/System.err(1818):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-23 09:15:59.429: W/System.err(1818):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12-23 09:15:59.429: W/System.err(1818):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-23 09:15:59.433: W/System.err(1818):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-23 09:15:59.433: W/System.err(1818):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-23 09:15:59.433: W/System.err(1818):  at java.lang.Thread.run(Thread.java:1019)

일단 명확하게 원인을 확인할 수 없는 것이
아래 적은 것과 같이 일관되지 않은 증상 때문이었다.

1. 일부 단말에서만 발생하며 주로 안드로이드(갤럭시 S)에서 발생함
2. 같은 환경에서 정상적으로 다운로드 되는 앱이 있음

아직도 명확한 원인은 발견하지 못한상태이며 다만 구글링을 통한 참고 자료만
검색해 놓은 상태이다.

http://code.google.com/p/android/issues/detail?id=16121&can=1&q=sslexception&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

http://stackoverflow.com/questions/6852492/sslprotocolexception-when-reading-https-responses-on-android-2-3-3-devices/6950339#6950339

저작자 표시
신고

+ Recent posts

티스토리 툴바