http://www.slideshare.net/kingori/devx-pt-sewonannandroidant
2014년 12월 17일 수요일
초 간단하게 안드로이드 apk 사인하기 signing CLI 커맨드라인 활용
안드로이드 마켓-구글 플레이에 앱을 등록하려면, singing이 필요합니다.
(앱 스토어도 마찬가지 입니다. 애플 앱은 xcode에서 관리하는 것이 진리~^^)
(앱 스토어도 마찬가지 입니다. 애플 앱은 xcode에서 관리하는 것이 진리~^^)
왜 싸이닝을 할까요?
sign이라는 것은 고유함-인증했음을 증명하는 행위입니다.
sign이라는 것은 고유함-인증했음을 증명하는 행위입니다.
앱을 구별짓는 id 가 있지만, 누구든 id를 지정하여 앱을 만들 수 있습니다. 따라서 그 고유성은 id로만 분별하기에는 무리가 있죠.
따라서, 자신만의 고유한 key값으로 앱을 signing 합니다.
이렇게 되면, 앱을 업데이트할 때에도, 항상 같은 key로 싸인을 함으로써, 고유한 인증임을 확인할 수 있습니다.
따라서~! key를 저장한 keystore 파일을 분실해 버리면~! ㅠㅠ 절대로 같은 앱을 업데이트 할 수 없습니다. (이렇때는, 그냥 새로 올려야죠.. ㅎ)
내가 올린 앱이나 아니냐의 문제가 아니라, 고유한 key로 싸인된 앱 만이 이전앱의 업그레이드 버전임을 증명할 수 있습니다.
두서없이, 서두가 길었네요.. ㅋ
저는, HTML5를 이용한 웹앱을 만들다 보니, 이클립스를 사용하지 않고, 커맨드 라인에서 처리하는 방법이 있었으면 좋겠다 생각했습니다. 으리 구글링~ 갑~!
개발은 sublime/brackets 에서 패킹 및 싸이닝은 커맨드 라인에서~^^
cordova CLI를 사용하면, unsigned apk를 쉽게 만들 수 있는데, signing만 하자고, 소스를 이클립스에서 열어서, signed 를 export하는 것이 꽤나 부담이 됩니다.
apk 사인하는 GUI툴들도 있는데, 시원치 않고 GUI는 반자동화하기에는 무리가 있습니다.
하지만, CLI가 가능하다면, 자동화도 가능하고, text파일로 메모후 적용하는 것도 훨씬 간편하고 좋습니다.
준비물:
release unsigned ape 파일, android SDK(당연히..), JDK(대부분 설치되어 있죠)
명령어:
jarsigner -verbose -keystore jewonagency.keystore release-unsigned.apk jewonagency
zipalign -f -v 4 release-unsigned.apk release-signed.apk
zipalign -f -v 4 release-unsigned.apk release-signed.apk
설명:
jarsigner -verbose -keystore (keystore 파일) (unsigned apk 파일) (alias name)
unsigned 된 apk파일을 keystore 파일을 이용하여 signing 합니다. (alias name)은 keystore안에 저장된 해당하는 앱을 위한 이름입니다.
unsigned 된 apk파일을 keystore 파일을 이용하여 signing 합니다. (alias name)은 keystore안에 저장된 해당하는 앱을 위한 이름입니다.
zipalign -f -v 4 (input file) (output file)
apk파일이 사실은 zip파일인데, apk 형식(?)에 맞게 재 정렬/정리해주는 과정입니다. 여기에서 나온 out file을 마켓에 등록하면 됩니다.
-f는 overwrite 옵션입니다. 4는 4 byte로 정렬한다는 옵션입니다.
apk파일이 사실은 zip파일인데, apk 형식(?)에 맞게 재 정렬/정리해주는 과정입니다. 여기에서 나온 out file을 마켓에 등록하면 됩니다.
-f는 overwrite 옵션입니다. 4는 4 byte로 정렬한다는 옵션입니다.
커맨드 명령어 처음에 찾고 파라미터 최적화하는데 시간이 조금 소요되지만, 한번 맛들리면, 커맨드 라인만 쓰게 됩니다. ㅋ
게다가 osx는 linux 기반이다보니, 할 수 있는 일도 많아 더 자주 쓰게 되네요~
교정이 필요한 부분 있으면 언제든 의견주세요~^^
Linux 서버 cocos2d-x APK build @ubuntu - 정리중
#0 필요 패키지 설치
sudo apt-get install openjdk-7-jdk
sudo apt-get install libgl1-mesa-dev libglfw-dev freeglut3-dev libzip-dev
sudo apt-get install libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev libxi-dev libglfw-dev g++ libzip-dev libcurl4-gnutls-dev libfontconfig1-dev
#1 SDK / NDK 다운
$wget http://dl.google.com/android/android-sdk_r21.0.1-linux.tgz
$tar zxvf android-sdk_r21.0.1-linux.tgz
#1-1 SDK 설치 가능 목록 보기
$./tools/android list sdk
10- SDK Platform Android 2.2, API 8, revision 3
#1-2 특정 버전 (번호) 만 설치하기
$./tools/android update sdk -u -t 10
Installing Archives:
Preparing to install archives
Downloading SDK Platform Android 2.2, API 8, revision 3
Installing SDK Platform Android 2.2, API 8, revision 3
Installed SDK Platform Android 2.2, API 8, revision 399%)
Done. 1 package installed.
#1-3 SDK 설치가 잘 되었나 확인
$./tools/android list targets
Available Android targets:
----------
id: 1 or "android-8"
Name: Android 2.2
Type: Platform
API level: 8
Revision: 3
Skins: HVGA, QVGA, WVGA800 (default), WVGA854, WQVGA432, WQVGA400
ABIs : armeabi
#2 NDK 설치
$wget http://dl.google.com/android/ndk/android-ndk-r8d-linux-x86.tar.bz2
$tar xvf android-ndk-r8d-linux-x86.tar.bz2
아래와 같이 make not found 라는 에러가 뜨면 ia32-libs 을 추가로 설치
android-ndk-r8d/ndk-build: 193: android-ndk-r8d/ndk-build: android-ndk-r8d/prebuilt/linux-x86/bin/make: not found
$sudo apt-get install ia32-libs
#3 ant 설치한다.
$sudo apt-get install ant
AntBuild ant 실행시 인자로 sdk 위치 넘김 (혹은 ANDROID_HOME 환경변수 설정)
$ ant -Dsdk.dir=/home/user/cocos2dx/android-sdk-linux/ debug
ant로 build 하면 bin 폴더내에 apk 생성
#4 서명
ant debug 로 하는 이유는 서명 없는 apk 이기 때문
서명 하는 방법은 아래 링크 참조
Reference
Android Ant 설정및 Build
Android 개발을 하면서 마켓에 배포시 일일이 Eclipse 에서 Build 해서 APK 파일을 업로드 하기가 번거로워서 Ant + Batch File 을 이용하여
자동 빌드를 구축하였다. 아래는 설명 이다.
1. http://ant.apache.org/bindownload.cgi 사이트에서 zip으로 된 파일을 다운 받는다. 빨간색으로 체크된 박스를 사이트에서 클릭하면 다운받수 있다.
2. 적당한 폴더에 압축을 풀다 폴더 구성은 다음 그림과 같다.
경로는 D:\dev\tool\apache-ant-1.8.2 이고 각각 개발환경마다 다르게 세팅해도 상관없다.
3. 환경 변수 에서 Path 를 설정한다. Java Path 설정하는 것처럼 %JAVA_HOME% 이런식으로 추가해도 된다.
일단 나는 귀찮아서 Path에 마지막 부분 즉";" 표시 뒤에 D:\dev\tool\apache-ant-1.8.2\bin 추가하였다.
4. 위에 항목들을 정상적으로 세팅되었다면 cmd 창에서 ant 명령어를 치면 뭐라도 나올것이다.
5. 이부분이 중요한 부분인데 ant를 이용하여 작업할 Project 가 기본 인코딩이 무엇인지를 알아야 한다. 안그러면 ant 를 이용하여 Build시
제대로 동작이 안된다. 예를들어서 Eclipse 에서 작업프로젝트 에서 Properties 를 보면 기본 인코딩 아무것도 설정을 안했으면 아마 MS949로
나올것이다. 이것을 기억을 했다가 android-sdk-windows -> tools -> ant -> build.xml 파일에서 내용을 찾아보면 다음과 같은 열이 있다.
<!-- compilation options -->
<property name="java.encoding" value="UTF-8" />
<property name="java.target" value="1.5" />
<property name="java.source" value="1.5" />
이부분에서 java.encoding을 현재 작업 프로젝트랑 일치 시켜야 한다.
추가로 이작업을 android-sdk 업데이트 시마다 해줘야 한다. 좀 귀찮기 하지만 가끔 하는거니깐..
6. 이제 작업 프로젝트 폴더를 들어가서 귀찮지만 또 세팅해야 되는 부분이 있다. 프로젝트 폴더안에 첨부된 파일중 build.xml 과 local.properties
파일을 프로젝트 폴더안에 복사하고 build.xml 파일 내용중에 project name="프로젝트명" 변경하고 저장한다.
그리고 local.properties 내용중에 sdk.dir 내용을 android-sdk 경로로 잡는다.
ex) sdk.dir=D:\\dev\\sdk\\android-sdk_r10-windows\\android-sdk-windows
6. 마지막으로 cmd ->Build 할 Project 경로에서 -> ant debug 치면 성공적으로 된다. 간혹 안되는 경우는 bin 폴더에 파일을 지우고 하면 잘된다.
좀더 깔끔하게 할려면 하나의 Batch File 로 만들어서 사용하면 편하다.!
7. 추가로 Google PlayStore 배포시 Sign할경우도 ant를 활용해서 편하게 할수 있다.
첨부된 파일 local.properties 에서 아래와 같이 추가 하면 된다.
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked in Version Control Systems,
2014년 11월 26일 수요일
[Android]안드로이드에서 진동 구현
안드로이드에서 알람이나 게임의 재미를 높이기위해서 진동을 활용할 수 있다. 안드로이드에서 진동 구현은 iOS보다 복잡하다. 먼저 메니페스토 파일에서 Vibrate에 관한 권한을 부여한다.
Vibrate 권한을 구현한 다음에는 간단한 코드 몇 줄이 필요하다. 먼저 Vibrate에 관한 시스템 서비스에관한 객체를 부여받는다. 그리고 Vibrator 객체를 이용하여 진동을 구현한다.
Vibrator tVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
long[] vibratePattern = {100, 100, 300};
tVibrator.vibrate(300);
tVibrator.vibrate(vibratePattern, -1);
vibrate는 밀리초 단위로 설정이 가능하다. 그리고 long Array를 사용하여 진동 패턴을 줄 수 있다. 그리고 반복 회수를 지정하여 다양한 진동 패턴을 만들 수 있다. 반복 회수를 '0'으로 하면 무한 반복이다. 반복을 원치 않으면 '-1'로 설정해주면 된다.
[안드로이드] 진동 울리기 ( 지정시간 진동과 패턴 진동)
팁스소프트에서 제공하는 프로그래밍과 관련된 자료나 정보들을 무단으로 복제하거나 게재하는 행위는
상호간의 신뢰를 무너뜨리는 행위이며, 법적인 문제를 야기할 수 있으므로 각별한 주의를 당부드립니다.
상호간의 신뢰를 무너뜨리는 행위이며, 법적인 문제를 야기할 수 있으므로 각별한 주의를 당부드립니다.
* 팁스소프트 저작권 정책 보기 - http://www.tipssoft.com/bulletin/tb.php/FAQ/637
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
휴대가 가능한 대부분의 안드로이드용 기기들은 공공장소나 조용한 곳에서 기기를 사용할 때 불편하지
않도록 매너모드를 제공하고 있습니다. 매너모드 상태의 기기는 사용자에게 무언가를 알릴때 소리를
울리는 대신 진동을 발생시켜서 알려줍니다. 매너모드뿐만 아니라 게임이나 다른 어플리케이션에서도
좀더 강력한 효과를 발생시키기 위해서 진동을 사용하기도 합니다.
이번 강좌에서는 알림, 효과용 등 여러가지 용도로 사용되는 진동에 대하여 알아보도록 하겠습니다.
1. 기능 구현하기
진동을 울리는 기능은 시스템에서 서비스하는 일이기때문에 먼저 AndroidManifest.xml
파일에 아래의 코드를 추가하여 이 어플리케이션이 해당 기능을 사용할 수 있도록 권한을
부여해주어야 합니다.
<manifest>
// ... 생략 ...
<application>
// ... 생략 ... </application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
진동 울리기 기능을 사용하려면 먼저 시스템서비스로부터 Vibrator 객체를 얻어야하며 Vibrator
클래스의 vibrate 메소드를 이용하여 진동을 쉽게 발생시키고, cancel 메소드로 울리고 있는 진동을
멈출 수 있습니다.
진동을 발생시키는 vibrate 메소드는 다음과 같은 두개의 메소드로 오버로딩되어 있습니다.
public void vibrate (long milliseconds) // 지정시간 동안 진동을 울린다. public void vibrate (long[] pattern, int repeat) // 배열에 지정한 패턴대로 진동을 울린다.
인자가 하나인 vibrate 메소드는 지정한 밀리초만큼 진동을 발생시키고, 두번째 vibrate 메소드는
pattern 인자에 입력한 패턴대로 진동을 발생시키는 메소드입니다.
패턴 진동을 지원하는 vibrate 메소드를 사용하려면 배열을 구성할 때 다음과 같은 규칙을 고려하여야
합니다.

위의 그림처럼 구성되는 배열의 짝수 index 에는 대기 시간을 지정하고, 홀수 index 에는 진동 시간을
지정해주어야합니다.
또 두번째 매개 변수인 repeat 에는 반복을 시작할 index 를 명시해줍니다. 이 때 주의해야할 점은
시작되는 index 부터 대기 시간이 적용되기 때문에 울림시간과 대기시간이 생각한것과 반대로 적용될
수 있다는 것입니다. 예를들어 위의 그림과 같은 배열 구성이 있는 경우 repeat 에 1 을 명시하면 아래의
그림처럼 기존의 진동 패턴과 완전히 달라지게 됩니다.

만약 구성한 배열 그대로 반복하여 진동을 울리고 싶다면 repeat 에 0 을 명시하시고, 한번만 진동을
울리려면 -1 을 명시하시면 됩니다.
아래의 코드는 두가지 vibrate 메소드를 사용하여 진동을 울리는 예제입니다.
public class TestVibratorActivity extends Activity implements OnClickListener
{
Vibrator m_vibrator = null;
{
Vibrator m_vibrator = null;
public void onCreate(Bundle savedInstanceState)
{
// ... 생략 ...
// 시스템서비스로부터 진동을 울릴 수 있는 Vibrator 객체를 얻는다. m_vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}
public void onClick(View view)
{
int id = view.getId();
if(id == R.id.once_btn) { // 지정된 시간만큼 진동이 울려야 하는 경우
// 에디트텍스트를 얻어서 입력된 수치값을 구한다. EditText edit = (EditText) findViewById(R.id.num_edit);
String str = edit.getText().toString();
// 지정된 수치값만큼 진동을 발생시킨다. m_vibrator.vibrate(Integer.parseInt(str));
} else if(id == R.id.go_btn) { // 지정된 패턴대로 진동이 울려야 하는 경우
// 진동 패턴을 구성한다. long[] pattern = {50, 100, 100, 200, 100, 300};
// 구성한 패턴대로 진동을 발생시킨다.
// 첫 진동패턴은 50ms 을 대기하면서 시작하고,
// 두번째 진동패턴부터는 100ms 을 대기하면서 진동이 시작된다. m_vibrator.vibrate(pattern, 1);
} else if(id == R.id.cancel_btn) { // 진동이 중지되어야 하는 경우
// 진동을 중지시킨다. m_vibrator.cancel();
}
}
}
} else if(id == R.id.cancel_btn) { // 진동이 중지되어야 하는 경우
// 진동을 중지시킨다. m_vibrator.cancel();
}
}
}
2. 실행 화면

2014년 11월 25일 화요일
GCM 진동 / 화면 켜짐 적용
소스 수정
@Override
protected void onMessage(Context context, Intent intent) {
Log.i(TAG, "Received message");
Log.i(TAG, "Received message context " + intent.getExtras().getString("message"));
//String message = getString(R.string.gcm_message);
Vibrator vibrator = (Vibrator)getSystemService(context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
WakeUpScreen.acquire(getApplicationContext(), 10000);
String message = intent.getExtras().getString("message");
// notifies user
generateNotification(context, message);
}
WakeUpScreen CLASS 추가
import android.content.Context;
import android.os.PowerManager;
/**
* 스크린을 ON한다. 젤리빈 4.2부터는 getWindows() 권장
* @author IKCHOI
*
*/
public class WakeUpScreen {
private static PowerManager.WakeLock wakeLock;
/**
* timeout을 설정하면, 자동으로 릴리즈됨
* @param context
* @param timeout
*/
public static void acquire(Context context, long timeout) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.FULL_WAKE_LOCK |
PowerManager.ON_AFTER_RELEASE
, context.getClass().getName());
if(timeout > 0)
wakeLock.acquire(timeout);
else
wakeLock.acquire();
}
/**
* 이 메소드를 사용하면, 반드시 release를 해줘야 함
* @param context
*/
public static void acquire(Context context) {
acquire(context, 0);
}
public static void release() {
if (wakeLock.isHeld())
wakeLock.release();
}
}
Manifest 추가
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
참고 http://nonstop.pe.kr/android/1612
참고 2 http://www.androidside.com/bbs/board.php?bo_table=b49&wr_id=107992
피드 구독하기:
글 (Atom)
build.xml