레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2016년 8월 19일 금요일

안드로이드 자주 쓰이는 adb 명령어


안드로이드 자주 쓰이는 adb 명령어


adb devices (디바이스 검색) 
adb 서버와 연결된 폰의 디바이스와 에뮬레이터 목록을 보여줍니다. 연결된 devices의 TCP/IP 포트 번호를 알아 낼때도 사용합니다. 
adb shell (타겟 시스템의 쉘 명령) 
해당 시스템의 쉘에 연결하고 # 프롬프트를 띄어 해당 시스템을 탐색하고 수정할 수 있습니다. 
예) 여러 단말기중 하나를 선택해서 접속 adb -s emulator-5554 shell 
adb shell push Phone.apk /system/app (파일 복사) 
Phone.apk 파일을 해당 기기의 /system/apk 폴더에 Phone.apk 넣습니다. 
adb shell chmod 644 system/app/Phone.apk (파일 권한) 
해당 기기의 /system/apk 폴더에 있는 Phone.apk 파일 권한을 설정합니다. 
adb pull /system/app/Phone.apk (파일 추출) 
해당 기기의 /system/apk 폴더에 있는 Phone.apk 파일을 추출합니다. 
adb install [-l][-r] file_spec (app을 설치 또는 재설치 할 때 사용) 
-l : 다른 장치로 복사돼는것을 막습니다. -r : 이미 존재하는 app 데이터를 지우지 않은채 재설치 합니다. file_apec : 설치할 app의 .apk 파일입니다. 
adb uninstall [-k] package (패키지 이름을 가진 app를 제거) 
-k : app 의 데이터를 보존합니다. package : 패키지의 전체 경로, apk 확장자는 빼야합니다.
예) 패키지 삭제 adb unstall com.falinux.android.hello 
adb push local remote (local 파일을 remote 이름으로 복사) 
개발자 컴퓨터에 있는 local 이란 이름을 가진 파일을...
타겟 시스템 remote 란 이름으로 복사합니다. 
예) com.falinux.android.rose.apk 파일을 안드로이드 기기 /data/app 폴더 안으로 집어넣습니다. adb push c:\com.falinux.android.rose.apk /data/app/ 
adb pull remote local (remote 파일을 local 이름으로 복사) 
해당 시스템에 있는 remote 라는 파일을 개발자 컴퓨터에 local 이란 이름으로 복사합니다.
예) 안드로이드 기기 /data/app/com.falinux.android.rose.apk 파일을 C 드라이버로 가져옵니다. adb pull /data/app/com.falinux.android.rose.apk c:\com.falinux.android.rose.apk 
adb reboot (시스템 재부팅) 
안드로이드 시스템을 재부팅합니다. 
adb kill-server (adb 종료) ** -- 로그가 나오지 않을때 한번 실행해 볼 필요 있음
adb에 문제가 있을 경우, adb를 종료 시킵니다. 
adb start-server (adb 실행) 
종료된 adb를 실행 시킵니다.

예제 )
# adb devices
D:\>adb devices
List of devices attached

0123456789ABCDEF        device
f4fbc224        device

# adb install
D:\>adb -s 0123456789ABCDEF install 파일명.apk
(주의 apk 파일이 있는 경로에서 실행 또는 Full 경로 입력)


안드로이드 자주 쓰이는 adb 명령어


안드로이드 자주 쓰이는 adb 명령어


adb devices (디바이스 검색) 
adb 서버와 연결된 폰의 디바이스와 에뮬레이터 목록을 보여줍니다. 연결된 devices의 TCP/IP 포트 번호를 알아 낼때도 사용합니다. 
adb shell (타겟 시스템의 쉘 명령) 
해당 시스템의 쉘에 연결하고 # 프롬프트를 띄어 해당 시스템을 탐색하고 수정할 수 있습니다. 
예) 여러 단말기중 하나를 선택해서 접속 adb -s emulator-5554 shell 
adb shell push Phone.apk /system/app (파일 복사) 
Phone.apk 파일을 해당 기기의 /system/apk 폴더에 Phone.apk 넣습니다. 
adb shell chmod 644 system/app/Phone.apk (파일 권한) 
해당 기기의 /system/apk 폴더에 있는 Phone.apk 파일 권한을 설정합니다. 
adb pull /system/app/Phone.apk (파일 추출) 
해당 기기의 /system/apk 폴더에 있는 Phone.apk 파일을 추출합니다. 
adb install [-l][-r] file_spec (app을 설치 또는 재설치 할 때 사용) 
-l : 다른 장치로 복사돼는것을 막습니다. -r : 이미 존재하는 app 데이터를 지우지 않은채 재설치 합니다. file_apec : 설치할 app의 .apk 파일입니다. 
adb uninstall [-k] package (패키지 이름을 가진 app를 제거) 
-k : app 의 데이터를 보존합니다. package : 패키지의 전체 경로, apk 확장자는 빼야합니다.
예) 패키지 삭제 adb unstall com.falinux.android.hello 
adb push local remote (local 파일을 remote 이름으로 복사) 
개발자 컴퓨터에 있는 local 이란 이름을 가진 파일을...
타겟 시스템 remote 란 이름으로 복사합니다. 
예) com.falinux.android.rose.apk 파일을 안드로이드 기기 /data/app 폴더 안으로 집어넣습니다. adb push c:\com.falinux.android.rose.apk /data/app/ 
adb pull remote local (remote 파일을 local 이름으로 복사) 
해당 시스템에 있는 remote 라는 파일을 개발자 컴퓨터에 local 이란 이름으로 복사합니다.
예) 안드로이드 기기 /data/app/com.falinux.android.rose.apk 파일을 C 드라이버로 가져옵니다. adb pull /data/app/com.falinux.android.rose.apk c:\com.falinux.android.rose.apk 
adb reboot (시스템 재부팅) 
안드로이드 시스템을 재부팅합니다. 
adb kill-server (adb 종료) ** -- 로그가 나오지 않을때 한번 실행해 볼 필요 있음
adb에 문제가 있을 경우, adb를 종료 시킵니다. 
adb start-server (adb 실행) 
종료된 adb를 실행 시킵니다.

예제 )
# adb devices
D:\>adb devices
List of devices attached

0123456789ABCDEF        device
f4fbc224        device

# adb install
D:\>adb -s 0123456789ABCDEF install 파일명.apk
(주의 apk 파일이 있는 경로에서 실행 또는 Full 경로 입력)


2015년 12월 7일 월요일

Picasso 파헤치기


What is Picasso?

안드로이드에서 여러 이미지가 화면에 나열 되는 UI는 자주 쓰이고 있습니다. 많은 개발자가 이것을 편리하게 하려고 라이브러리를 제작하여 공개했습니다. Picasso는 그 중에 하나로써 Square 사의 Jake Wharton이 개발한 라이브러리입니다.

Why Picasso?

직접 수많은 라이브러리를 비교해보지는 못했고 대신 Hello World 블로그의 Android의 이미지 로딩 라이브러리를 참고했습니다. Picasso를 선택한 이유는 다음과 같습니다.
  1. 모듈화가 잘 되어있어서 확장에 용이하다
  2. API가 간결하다
  3. Jake Wharton이 개발했다

Dive into Picasso

Picasso가 작동하는 방식과 중요한 클래스들을 살펴보도록 하겠습니다. (소스는 v2.2.0을 기준으로 합니다.)

1. 이미지 불러오기 요청

이미지를 불러오기 위해 Picasso를 사용합니다. 간단한 용례는 다음과 같습니다.
Picasso.with(context)
       .load(placeImageUrl)
       .error(R.drawable.error)
       .placeholder(R.drawable.placeholder)
       .transform(myTransformer)
       .into(placeImageView);

2. 캐시 검사

Picasso는 Cache 인터페이스를 통해 캐시를 저장하고 가져옵니다. 만약 캐시에 요청한 이미지가 존재하면 캐시를 사용합니다.

3–4. 백그라운드로 스레드에서 이미지 불러오기

Cache에 캐시된 이미지가 없다면 Dispatcher를 통해 백그라운드 스레드에서 BitmapHunter가 이미지를 불러올 수 있도록 합니다.

5. 캐시 검사 및 이미지 불러오기

다시 한 번 캐시를 검사합니다. 이때 캐시된 이미지가 있으면 그걸 사용합니다. 없다면 BitmapHunter인터페이스는 실제 구현에 따라 이미지 불러오게 됩니다. BitmapHunter의 구현체가 NetworkBitmapHunter인 경우 Downloader 인터페이스를 통해 이미지를 내려받습니다.

6. 이미지 후처리

BitmapHunter가 이미지를 불러오면 Transformer 인터페이스를 통해 이미지 후처리를 할 수 있도록 합니다.

7–8. 불러온 이미지 적용

이미지 불러오기를 마친 BitmapHunter는 다시 Dispatcher를 통해 UI 스레드로 비트맵을 전달합니다. Dispatcher는 비트맵을 Action 인터페이스로 구현된 방식으로 이미지를 처리합니다.
이렇게 Picasso는 단계별로 인터페이스를 두고 확장 가능하도록 구현되어 있습니다. 필요에 따라 캐시 방식을 바꾸고 싶다면 Cache 인터페이스를 구현하고 이미지 후처리 방식을 바꾸고 싶다면Transformer 인터페이스를 구현하면 됩니다. 별도로 구현하지 않으면 이미 정의된 구현체들이 각 단계별로 사용됩니다.

Appendix

com.squareup.picasso.Picasso(javadoc)

Picasso로 이미지를 불러올 때 사용하게되는 빌더입니다. RequestCreator와 함께 Method Chaining혹은 Builder Pattern로 불리는 방법으로 API를 간결하게 사용 할 수 있도록 합니다.

com.squareup.picasso.Dispatcher

백그라운드 스레드와 UI 스레드 간에 통신하게되는 통로입니다. Picasso에서 요청 데이터를 전달 받아 Background 에서 BitmapHunter가 비트맵을 불러올 수 있도록 합니다. 비트맵을 UI 스레드에 전달해서 처리할 수 있도록 합니다.

com.squareup.picasso.Cache(javadoc)

이미지 캐싱을 위한 모듈입니다. 기본 구현체로는 LRU 방식으로 캐시하는 LruCache가 사용됩니다.

com.squareup.picasso.BitmapHunter

비트맵을 불러오는 모듈입니다. 자주 사용되는 구현체로는 ResourceBitmapHunter와NetworkBitmapHunter가 있습니다.
Picasso.load()메소드에 리소스 아이디를 넘겨주면 ResourceBitmapHunter가 사용되고 Uri를 넘겨주면 URI Scheme에 따라서 NetworkBitmapHunter, ContentProviderBitmapHunter,AssetBitmapHunber 등이 사용됩니다. (자세한 내용은 BitmapHunter.forRequest메소드에 구현되어 있습니다.)

com.squareup.picasso.Downloader(javadoc)

NetworkBitmapHunter가 이미지를 내려받을 때 사용하는 인터페이스입니다. 기본 구현체는OkHttp를 사용할 수 있는지 여부에 따라 다릅니다.
  1. 만약 OkHttp를 사용할 수 있다면 Http Client 를 OkHttp로 사용하는 OkHttpDownloader가 기본 구현체가 됩니다.
  2. 그렇지 않은 경우에는 Http Client 를 HttpURLConnection로 사용하는UrlConnectionDownloader가 기본 구현체가 됩니다.

com.squareup.picasso.Transformer

BitmapHunter가 비트맵을 만들면 후처리를 하는 모듈입니다. 불러온 이미지를 마스킹 한다던지 블러 효과를 주고싶다면 Transformer인터페이스를 구현하면 됩니다.

com.squareup.picasso.Action

BitmapHunter를 통해 불러오고 Transformer를 통해 후처리가 끝난 비트맵은 Action이 가져가서 처리를 하게됩니다. 불러온 비트맵을 어떻게 할지 결정하는 모듈이라고 볼 수 있습니다. 일반적으로 쓰게되는 Action의 구현체는 ImageViewAction 인데, 생성된 키트맵을 ImageView 에 설정합니다.
출처 : https://spoqa.github.io/2014/03/28/android-picasso.html

2015년 6월 21일 일요일

Android Studio에서 OpenCV for Android 사용하기

Android Studio에서 OpenCV를사용해 보기


1.. OpenCV For Android 다운로드

OpenCV 사이트에서 OpenCV-2.4.9-android-sdk.zip을 다운 받아 압축을 풀어 준다.
 얘 ) 
c:\Users\h.kaneda\AndroidStudioProjects\OpenCV-2.4.9-android-sdk\

2. Android Studio에 openCV SDK Import 하기

Android Studio를 열어 Import Project…를 선택OpenCV-2.4.9-android-sdk 폴더를 선택. OK 클릭한다.
Next  > 

Next  > 
 Next  > 

Next  > 

sdk를 체크 한다음 Next  > 

Next  > 

 Finish >

Import 위저드가 완료 되었다면 메뉴에서 빌드를 한다.Build > Rebuild Project

OpenCV SDK 프로젝트 생성을 완료 했다.
이제 프로젝트를 닫아 준다.
File > Close Project


3.. OpenCV를 프로젝트에 포함 시키기

신규 프로젝트를 만들거나, OpenCV를 추가하고 싶었던 기존의 프로젝트를 연다.
그리고 OpenCV 모듈을 추가한다.
File > Import Module…

이번에는 OpenCV-2.4.9-android-sdk/sdk/java/sdk.iml 를 선택한다.
Next >


전체 선택하고 Finish >

openCVLibrary249라는 이름의 라이브러리가 인포트 된것을 확인 할 수 잇다.

app/build.gradleのdependencies에 라이브러리를 추가 한다.compile project(':openCVLibrary249')
Gradle파일을 변경 하였기에 Tools > Android > Sync Project with Gradle Files를 해 주도록 한다.

소스 상에서 org..opencv.android가 자동완성 되는지 확인해 보자.

OpenCV 라이브러리는 동적링크, 정적링크가 가능하다. 동적링크를 하는 경우는 OpenCV를 별도로 인스톨 하라는 메시지가 표시된다. 
이번에는 정적링크를 하는 방법을 .소개하도록 하겠다.app/src/main를 우클릭하고 New > Directory 해서 jniLibs 폴더를 추가 한다.
 
▼
jniLibs 폴더 생성
추가한 jinLIbs 폴더에 OpenCV-2.4.9-android-sdk/sdk/native/libs 의 내용을 복사한다.
jniLibs 생성 및 libs 추가 후 구조

이상으로 Android Studio에서의 OpenCV로 프로젝트를 개발 하는 것이 가능하다.


2015년 6월 4일 목요일

안드로이드에서 강제로 터치 이벤트 발생시키기

안드로이드에서 강제로 터치 이벤트 발생시키기  

(How to raise touch event forcely in Android)

long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
MotionEvent down_event = MotionEvent.obtain(downTime, eventTime,   MotionEvent.ACTION_DOWN, 0,0, 0);
MotionEvent up_event = MotionEvent.obtain(downTime, eventTime,   MotionEvent.ACTION_UP, 0, 0, 0);
yourWidget.dispatchTouchEvent(down_event);
yourWidget.dispatchTouchEvent(up_event);



2014년 3월 14일 금요일

[cocos2d-x 3.0] 사운드(Sound) 관련

cocos2d-x에서는 CocosDenshion이라는 사운드라이브러리를 사용한다.

그래서 네임스페이스를 매번 입력하지 않으려면 상단에 using namespace CocosDenshion;이라고 선언해야 합니다.

사운드는 크게 배경음악과 효과음악으로 구분한다.

1. 재생 관련(Play)
void playBackgroundMusic(const char *pszFilePath, bool bLoop)
파일명과 반복여부를 입력하면 된다. 배경음악의 경우, 한번에 1개의 배경음악만 플레이된다. 즉, 동시의 2개 이상의 배경음악을 플레이 할 수는 없다.
SimpleAudioEngine::getInstance()->playBackgroundMusic("music.wav", false);

unsigned int playEffect(const char *pszFilePath, bool bLoop)
위와 동일하다. 다만, 효과음의 경우는 동시에 여러개의 플레이가 가능하다. 플레이하면 지정된 효과음의 고유번호가 리턴된다.
SimpleAudioEngine::getInstance()->playEffect("effect.wav", false);



2. 정지 관련(Stop)
stopBackgroundMusic()
stopBackgroundMusic(bool bReleaseData)
배경음악을 정지한다. 또한 종료할때 로딩된 배경음악을 완전히 해제할지를 지정할수 있다.
SimpleAudioEngine::getInstance()->stopBackgroundMusic();

stopEffect(unsigned int nSoundId)
효과음의 번호를 지정해서 해당 효과음만 정지한다.
SimpleAudioEngine::getInstance()->stopEffect(soundID);

stopAllEffects()
현재 플레이되고 있는 모든 효과음을 정지한다.
SimpleAudioEngine::getInstance()->stopAllEffects();



3. 일시 정지, 재시작(Pause, Resume)
pauseBackgroundMusic()
현재 플레이되고 있는 배경음악을 일시정지한다.
SimpleAudioEngine::getInstance()->pauseBackgroundMusic()

resumeBackgroundMusic()
일시정지한 배경음악을 정지된 위치부터 다시 플레이한다.
SimpleAudioEngine:: getInstance()->resumeBackgroundMusic()

pauseEffect(unsigned int nSoundId)
해당되는 효과음의 플레이를 일시정지한다.
SimpleAudioEngine:: getInstance()->pauseEffect(unsigned int nSoundId)

resumeEffect(unsigned int nSoundId)
일시정지된 해당음을 정지된 위치부터 다시 플레이한다.
SimpleAudioEngine:: getInstance()->resumeEffect(unsigned int nSoundId)

pauseAllEffects()
현재 플레이되고 있는 모든 효과음의 플레이를 일시정지한다.
SimpleAudioEngine:: getInstance()->pauseAllEffects()

resumeAllEffects()
일시정지한 모든 효과음을 정지된 위치부터 다시 플레이한다.
SimpleAudioEngine::sharedEngine()->resumeAllEffects()




4. 볼륨(Volume)
setBackgroundMusicVolume(float volume)
배경음악의 볼률을 지정한다. 범위는 0.0 ~ 1.0이다.
SimpleAudioEngine:: getInstance()->setBackgroundMusicVolume(float volume)

setEffectsVolume(float volume)
효과음의 볼륨을 지정한다.
SimpleAudioEngine:: getInstance()->setEffectsVolume(float volume)

getBackgroundMusicVolume()
배경음악의 볼륨 값을 가져온다.
float SimpleAudioEngine:: getInstance()->getBackgroundMusicVolume()

getEffectsVolume()
효과음의 볼륨의 값을 가져온다.
float SimpleAudioEngine:: getInstance()->getEffectsVolume()




5. 로딩(preLoad)
preloadBackgroundMusic(const char *pszFilePath)
배경음악을 미리 로딩해둔다.
SimpleAudioEngine:: getInstance()->preloadBackgroundMusic(const char *pszFilePath)

preloadEffect(const char *pszFilePath)
효과음을 미리 로딩해둔다.
SimpleAudioEngine:: getInstance()->preloadEffect(const char *pszFilePath)




6. 재생여부확인
isBackgroundMusicPlaying()
배경음악의 플레이 여부를 리턴한다.
bool SimpleAudioEngine:: getInstance()->isBackgroundMusicPlaying()










2014년 3월 7일 금요일

Cocos2d-x 기본 개념 잡기


Cocos2d를 사용하기 위해 익숙해져야 하는 용어들과 그 역할을 알아 봐야 할거 같다.
아래 내용은 Cocos2d을 구글 아저씨 한테 물어 여기저기에서 인용한 것들이다.

※ 참고 사이트
Cocos2d : http://www.cocos2d-x.org/wiki/Director_Scene_Layer_and_Sprite
평범한 후라이의 블로그 : http://blog.daum.net/synsy/7664323
마루티님의 블로그 : http://blog.naver.com/yhjeong89
Descode.net : http://descode.net/index.php/archives/105
:
:

CCDirector - 싱글톤 객체. 프로그램이 실행되는 동안 단 하나의 객체만 생성된다. 이 CCDirector가 어떤 Scene을 화면에 띄우기로 결정하는지에 따라서 화면에 보이는 그림이 달라진다. 단순히 화면을 띄우는 것 외에도 앱을 일시정지(Pause) 시키거나 다시 재개(Resume)하는 등 다양한 역할을 하지만 일단 화면을 띄우는데 주 역할을 한다고만 알아놓아도 될거 같다.(Scene 을 관리하며, 전환처리 등을 담당)
포함관계로는 가장 최상위 클래스라고 할 수 있고 오로지 CCScene클래스만 포함될 수 있다.

CCScene - 그림을 그릴 때 사용하는 종이라고 생각하면 된다.(장면을 만들때 사용하는 클래스). 종이가 있어야 그 위에 그림을 그릴 수 있듯이 CCScene 객체가 있어야 화면에 그림을 표시할 수 있다. 하나의 CCScene은 여러개의 CCLayer를 참조할 수 있다. (아래 그림에서는 하나의 CCLayer만 참조하고 있지만 실제로는 다수의 CCLayer를 참조할 수 있다.)
게임상 한 동작을 완결시키는 전체적인 화면을 이야기 한다. Android로 치자면 Activity 같은거라고 보면 됨.
게임에는 MenuScene, GameScene, OptionScene, RankScene 등을 만들어서 관리하는 것이 대부분인데, 이를 쉽게 구현할 수 있도록 클래스 지원한다. CCLayer, CCNode, CCSprite, CCMenu 등의 객체를 포함할 수 있고, 장면을 그릴 때에 여러 클래스셋에 대한 컨테이너 역할을 한다.

예를 들어, 다음과 같은 장면 게임을 가질 수있다
소개, 메뉴, 레벨 1, Cutscene 1, 레벨 2, 승리 Cutscene, Losing Cutscene, Highscore 화면
[ game follows ]


CCLayer - 코딩을 하면서 대부분의 작업 시간을 할애하게 될 부분이다. 이 CCLayer 객체에 그림도 넣고 각종 메서드도 집어넣으면서 기능을 구현하게 된다. CCLayer는 CCNode 객체를 참조할 수 있다.
Android로 치면  Layout 같은 거. Activity가 Layout을 불러서 화면을 보여주고
Layout을 교체해서 다른 화면을 보여주기도 하고 그런거!!
기본적으로 CCScene와 비슷하게 컨테이너 역할을 수행하지만, 가장 다른 점은 사용자의 입력을 처리할 수 있는 인터페이스를 제공한다. 터치나 센서 반응 등에 대한 처리를 할 수 있으며, 하나의 Scene에는 하나 이상의 CCLayer로 구성됨.
[ CCLayer 예 ]



CCNode - 일반적으로 화면에 보이는 그림과 같은 객체들을 대부분 CCNode하고 한다.  통상적으로 Node라고 칭한다. CCScene, CCLayer, CCSprite등은 모두 CCNode를 상속받고 있으므로 이들을 Node라고 할 수 있다. 위에서 '참조한다' 라는 표현을 사용했지만 '붙는다' 라고 이해하시는게 빠르겠다. CCLayer에 계속해서 Node를 붙여나감으로서 Layer를 완성해 나가는 것.

CCSprite - CCNode를 상속하는 대표적인 객체. '그림'이라고 생각하시면 될거 같다.(화면 구성요소) Cocos2D에서 사용하는 모든 그림들은 CCSprite의 객체를 통해서 화면에 출력할 수 있다.(Image의 표현, Animation이나 Action등을 처리)
Android로 치자면 Button 이니 TextView니 하는것들에 해당!! 게임에서 등장하는 이미지들이 대부분 CCSprite 이다.

CCLayer에 CCSprite들을 넣어서 화면을 만들고, 이 CCLayout을 CCScene에 담아서 보여주는거라고 이해하면 대충 OK.