'Programming/Java/Android'에 4개의 글이 있습니다.

안드로이드 어플리케이션 서명에서 마켓 배포까지, 한눈에 보기

posted-at2012.12.17 18:37 :: posted-inProgramming/Java/Android :: posted-byNarrL

오늘은 안드로이드 마켓에 어플리케이션을 올리기 위해 어플리케이션을 *.apk 파일로 만들기부터 서명 및 마켓 업로드까지 모든 과정에 대해서 알아보도록 하겠습니다.

뜬금없이 어플리케이션 배포에 대한 내용이 나왔냐구요? 넵. 예상하신 분들도 있으실지 모르겠지만, 오늘 처음으로 마켓에 어플리케이션을 업로드했답니다. -_- 그래서 겸사겸사 강좌도 같이 올리게 되었네요.

자, 우선 마켓에 어플리케이션을 올리려면 어플리케이션에 서명을 해야 합니다.
예전에 ADT에서 이 과정을 지원해주지 않았을 때는 다소 복잡한 절차를 거쳐서 어플리케이션을 서명한 후 마켓에 업로드했어야 했는데, 최근의 ADT부터는 (아마 0.9.4 이상부터일겁니다) ADT 내에서 apk파일 생성부터 어플리케이션 서명까지 한번에 해결해주어서 한결 편해졌습니다.

그럼, 시작해볼까요?

keystore 생성 / apk파일 생성 및 서명하기


마켓에 업로드 할 어플리케이션의 메니페스트 파일을 연 후, Manifest 탭의 하단을 보면 아래와 같이 Export 메뉴가 보입니다.


두 가지 방법이 있는데, 하나는 APK파일 생성과 서명을 동시에 하는 것, 하나는 APK파일로만 생성하는 것입니다.

특별한 경우가 아니라면 동시에 해주는거 편하겠죠? Use the Export Wizard를 클릭합니다.



Export  Android Application 창이 뜹니다. 여기에서는 apk파일로 내보내기를 수행할 프로젝트를 선택해주면 됩니다.
Next를 눌러 다음 과정으로 넘어갑니다.


어플리케이션 배포를 처음으로 하는 것이라면, 아직 keystore가 없을 겁니다. keystore가 있어야만 어플리케이션 서명도 할 수 있고, 구글맵 API Key도 받을 수 있습니다. (에뮬레이터에서 테스트할 때는 debug keystore로 API키를 받아서 구글맵을 사용할 수 있었지만, 실제 기기에 올릴 때는 debug keystore로 받은 API Key를 사용하면 로드가 제데로 되지 않습니다.)

Location 옆의 Browse...를 눌러 새로 만들 keystore가 저장될 위치를 선택합니다.


keystore의 경로 및 이름을 지정합니다.


keystore의 위치 및 이름을 지정했으면, keystore의 비밀번호를 입력한 후, Next 버튼을 눌러줍니다.


Alias(이름) 및 비밀번호와 기본적인 정보들을 적어주면 되고, Validity(서명이 유효한 기간)은 50년으로 해줍니다. (안드로이드 마켓에 어플리케이션을 올리려면 적어도 안드로이드 마켓이 생긴 일자로부터 50년까지는 유효한 인증서로 서명이 되어야 합니다) 입력이 완료되었으면 Next버튼을 눌러 다음 과정으로 넘어갑니다.


이제 거의 다 끝났습니다 :) keystore 생성은 끝났고, 서명할(생성할) apk파일을 선택해주면 됩니다.


어디에 apk파일을 생성할 지 모두 선택이 완료되었으면, Finish버튼을 눌러 apk파일을 생성합니다.

기존의 keystore를 이용하여 서명하는 경우

기존에 생성한 keystore를 이용하여 서명하는 과정도 그리 어렵지 않습니다.


어플리케이션 서명에 사용할 ketstore를 지정한 후, 비밀번호를 입력하고 Next 버튼을 누릅니다.


alias를 확인한 후, 비밀번호를 한번 더 입력하고 Next 버튼을 눌러줍니다.


생성할 APK파일의 정보와 서명이 유효한 날짜까 표시됩니다. 잘못된 것이 없는지 확인한 후에 Finish 버튼을 누르시면 어플리케이션 서명이 완료됩니다. :)

Android Market 에 어플리케이션 올리기

이제 마켓에 어플리케이션을 올릴 차례입니다.  우선 안드로이드 마켓에 개발자로 등록이 되어있어야겠지요? 마켓에 개발자로 등록하는 절차는 그리 어렵지 않으니 생략하도록 하겠습니다. 

우선, Android Market의 개발자 콘솔 으로 접속합니다.


마켓이 업로드한 어플리케이션의 목록들이 보입니다. 아직 업로드한 어플리케이션이 없다면 당연히 아무것도 보이지 않겠죠?

오른쪽 하단의 Upload Application을 클릭하여 어플리케이션을 업로드해보도록 합시다.


Upload an Application 화면이 나옵니다.
마켓에 업로드하는 항목은 크게 3가지 항목입니다.

  • Application .apk file : 어플리케이션 파일입니다.
  • Screenshots : 스크린샷입니다. 최대 2장까지 등록 가능하며, Portrait 형태의 사진으로 등록해야 잘리지 않습니다.
  • Promotional Graphic : 아마도 마켓 첫화면에 소개될 때(?) 표시할 그림 같습니다. 선택사항입니다.


어플리케이션 파일과 스크린샷을 등록한 후, 아래로 내려보면...


위와 같이 설명을 작성하는 화면이 나옵니다. 로케일에 맞춰서 설명을 따로 작성하는 것도 가능합니다.
저는 영어와 미래를 대비하여(?) 한국어로도 작성하였습니다. 언어 추가는 add language를 클릭하면 가능합니다 :)


마지막으로 몇몇 옵션들을 선택할 수 있습니다.  Copy protection (기기에서 어플리케이션 apk 파일을 추출하는것을 방지)를 설정할지 여부도 결정할 수 있습니다. 요걸 설정하면 아마 DevPhone이나 루팅된 단말에서는 아예 검색이 되지 않을겁니다 ^^;

옵션을 선택한 후, 개발자 정보도 입력하고! 마지막으로 Publish 버튼을 눌러주면 마켓에 등록이 완료됩니다.


어플리케이션이 마켓이 등록된 화면입니다! 
정말 업로드하는데 몇초밖에 걸리지 않고, 바로 마켓에서 검색이 가능합니다.

또, 정말 신기한 건 올린지 몇분도 안되어서 어플을 다운받고 코멘트까지 달리더군요. 정말 짜릿한(?) 느낌이네요 :)

오늘도 코멘트 보고 어플리케이션에 해당 기능 넣어 다시 업데이트까지 했습니다. 회색님께서 말씀하신대로 일단 올려놓고 피드백을 받아 하나의 어플리케이션을 완성해나가는 과정이 이런 것이구나 하는 것을 새삼 느꼈습니다.

자, 이제 여러분들도 한번 마켓에 질러보세요! 

작성자 : 커니

[Java] 자바 정규식

posted-at2012.12.17 18:18 :: posted-inProgramming/Java/Android :: posted-byNarrL

정규 표현 구문의 요약

구문매치 대상
 
캐릭터
x캐릭터 x
\\backslash 캐릭터
\0n8 진치 0n 를 가지는 캐릭터 (0 <= n <= 7)
\0nn8 진치 0nn 를 가지는 캐릭터 (0 <= n <= 7)
\0mnn8 진치 0mnn 를 가지는 캐릭터 (0 <= m <= 3, 0 <= n <= 7)
\xhh16 진치 0xhh 를 가지는 캐릭터
\uhhhh16 진치 0xhhhh 를 가지는 캐릭터
\t탭 캐릭터 ('\u0009')
\n개행 캐릭터 ('\u000A')
\r왕복대 리턴 캐릭터 ('\u000D')
\f용지 보내 캐릭터 ('\u000C')
\a경고 (벨) 캐릭터 ('\u0007')
\e이스케이프 캐릭터 ('\u001B')
\cxx 에 대응하는 제어 캐릭터
 
캐릭터 클래스
[abc]a,b, 또는 c (단순 클래스)
[^abc]a,b,c 이외의 캐릭터 (부정)
[a-zA-Z]a ~ z 또는 A ~ Z (범위)
[a-d[m-p]]a ~ d, 또는 m ~ p[a-dm-p] (결합)
[a-z&&[def]]d,e,f (교차)
[a-z&&[^bc]]b 와 c 를 제외하는 a ~ z[ad-z] (감산)
[a-z&&[^m-p]]m ~ p 를 제외하는 a ~ z[a-lq-z] (감산)
 
정의 끝난 캐릭터 클래스
.임의의 캐릭터 (줄 끝 기호와 성냥 하는 경우도 있다)
\d숫자: [0-9]
\D숫자 이외: [^0-9]
\s공백 캐릭터: [ \t\n\x0B\f\r]
\S비공백 캐릭터: [^\s]
\w단어 구성 캐릭터: [a-zA-Z_0-9]
\W비단어 캐릭터: [^\w]
 
POSIX 캐릭터 클래스 (US-ASCII 마셔)
\p{Lower}소문자의 영문자: [a-z]
\p{Upper}대문자의 영문자: [A-Z]
\p{ASCII}모든 ASCII 캐릭터: [\x00-\x7F]
\p{Alpha}영문자: [\p{Lower}\p{Upper}]
\p{Digit}10 진수자: [0-9]
\p{Alnum}영숫자: [\p{Alpha}\p{Digit}]
\p{Punct}구두점 캐릭터: ! "#$%&'()*+,-. /:;<=>? @[\]^_`{|}~ 의 언젠가
\p{Graph}표시할 수 있는 캐릭터: [\p{Alnum}\p{Punct}]
\p{Print}프린트 가능 캐릭터: [\p{Graph}]
\p{Blank}공백 또는 탭: [ \t]
\p{Cntrl}제어 캐릭터: [\x00-\x1F\x7F]
\p{XDigit}16 진수자: [0-9a-fA-F]
\p{Space}공백 캐릭터: [ \t\n\x0B\f\r]
 
Unicode 블록과 카테고리의 클래스
\p{InGreek}희랍어 블록의 캐릭터 (단순블록)
\p{Lu}대문자 (단순카테고리)
\p{Sc}통화 기호
\P{InGreek}희랍어 블록 이외의 캐릭터 (부정)
[\p{L}&&[^\p{Lu}]]대문자 이외의 캐릭터 (감산)
 
경계 정규 표현 엔진
^행의 선두
$행의 말미
\b단어 경계
\B비단어 경계
\A입력의 선두
\G전회의 성냥의 말미
\Z마지막줄 끝 기호가 있는 경우는 그것을 제외한 입력의 말미
\z입력의 말미
 
최장 일치 수량자
X?X, 1 회 또는 0 회
X*X, 0 회 이상
X+X, 1 회 이상
X{n}X,n 회
X(n,}X,n 회이상
X{n,m}X,n 회이상,m 회이하
 
최단 일치 수량자
X??X, 1 회 또는 0 회
X*?X, 0 회 이상
X+?X, 1 회 이상
X{n}?X,n 회
X(n,}?X,n 회이상
X{n,m}?X,n 회이상,m 회이하
 
탐욕인 수량자
X? +X, 1 또는 0 회
X*+X, 0 회 이상
X++X, 1 회 이상
X{n}+X,n 회
X(n,}+X,n 회이상
X{n,m}+X,n 회이상,m 회이하
 
논리 연산자
XYX 의 직후에 Y
X|YX 또는 Y
(X)X,전방 참조를 실시하는 정규 표현 그룹
 
전방 참조
\n성냥 한 n 번째의전방 참조를 실시하는 정규 표현 그룹
 
인용
\정규 표현은 아니지만, 다음의 캐릭터를 이스케이프 한다
\Q정규 표현은 아니지만,\E 까지의 모든 캐릭터를 이스케이프 한다
\E정규 표현은 아니지만,\Q 로 개시된 인용을 이스케이프 한다
 
특수한 구문 (전방 참조를 실시하지 않는다)
(? :X)X,전방 참조를 실시하지 않는 정규 표현 그룹
(? idmsux-idmsux)  정규 표현은 아니지만, 매치 플래그의 온/오프를 바꾼다
(? idmsux-idmsux:X) X, 지정된 플래그를 온/오프로 한전방 참조를 실시하지 않는 정규 표현 그룹
(? =X)X, 폭제로의 긍정 예측
(?!X)X, 폭제로의 부정 예측
(? <=X)X, 폭제로의 긍정 후 읽기
(? <! X)X, 폭제로의 부정 후 읽기
(? >X)X, 독립한전방 참조를 실시하지 않는 정규 표현 그룹

 


[Java] 자바 split()에서 Tab(탭 문자) 혹은 마침표 기준으로 분리

posted-at2012.12.17 18:14 :: posted-inProgramming/Java/Android :: posted-byNarrL

탭 문자 (Tab키를 누르면 찍히는 긴 공백 문자)로 구분된 문자열을 배열로 나누려면, split 메소드(함수)로


split("\t")


이렇게 하면 됩니다. \t 가 탭문자를 의미합니다. 물론 탭 문자 자체를 그냥 적어 주어도 됩니다.


그런데 마침표로 구분된 문자열을 나눌 때


split("\.") 이렇게 하면


illegal escape character (잘못된 이스케이프 문자가 사용되었음) 라는 에러가 납니다.


따라서 split("\\.") 이렇게 백슬래쉬를 이중으로 해주어야 합니다.


split()은 "구분자 문자열"을 정규식으로서 입력받는데, 정규식에서 점(.)은 "불특정 문자 1개"라는 의미를


가지기에, 점을 점 그대로 사용하기 위해서는 자바에서는 백슬래쉬(\) 2개를 붙여야 합니다.

[Java] 자바 split() 함수를 이용하여 "|" (Vertical Bar) 를 기준으로 분리할 때

posted-at2012.12.17 18:13 :: posted-inProgramming/Java/Android :: posted-byNarrL

String[] arr = "2|02".split("|"); 
arr[0];//"2"가리턴되지 않는다. ""공백이 리턴된다
arr[1];//"02"가 출력되지 않는다. 혹은 오류가 날수있다. 이경우 "2"가 리턴된다


위는 잘못 작성된 코드이다. 오류가 발생되거나 비정상 적인 결과가 출력된다. 

| 파이프기호를 딜리미터로 split하려고 한다.


올바로 처리되기위해 첫번째줄을 바르게 고치시오.


정답: 

String[] arr = "2|02".split("\\|");


해설: split의 표현은 정규식으로 표현되어지므로 정규식 예약어인 파이프기호에는

이스케입문자 \가 있어야 하며 ""안에서 \는 \\로 표현한다.