'android'에 해당되는 글 36건

  1. 2022.01.03 MacBook M1 에 안드로이드 개발환경 설정하기
  2. 2019.12.06 vivo 계정 만들기 ( with e-mail ) 1
  3. 2019.08.20 veridex 툴을 사용하여 non-SDK API 사용 확인법
  4. 2019.06.20 추가하지도 않은 libRSSupport.so 파일이 apk에?
  5. 2019.06.19 [Kotlin] kotlin-stdlib, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8 차이점
  6. 2017.11.17 android studio 저장시 자동 codeStyle 적용 설정
  7. 2017.11.06 [삽질경험] crash at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)
  8. 2017.05.12 android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법
  9. 2017.04.03 구글 firebase 프로젝트 생성및 적용하기
  10. 2017.04.01 구글 firebase는 무엇인가? 제공하는 기능은? 1

MacBook M1 에 안드로이드 개발환경 설정하기

android 2022. 1. 3. 16:37

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

M1 맥북의 성능이 너무 좋다고 해서 하나 장만하였는데.. 

오랜만의 초기 환경설정을 정리해본다. 

 

1. Android Stduio 설치하기 

다운받기 : https://developer.android.com/studio

다운받을때, arm용을 받으면 된다. 

android studio M1용

그리고 그냥 설치하면 된다. 

 

2. Java 설치하기 

Android Studio를 설치하면 java는 따로 설치를 안해도 gradle을 위한 embeded 버전이 같이 설치되어 있다. 

Android Studio 상단의 File -> Project Structure 메뉴를 선택하고 

좌측의 SDK Location을 누르고 'Gradle Settings'를 누르면 Embeded JDK가 선택되어 있다. 

여기에 있는 경로를 터미널에서 사용하려면, path 설정에 경로를 추가해도 되는데.. 

최신의 JAVA를 설치하고 싶으면, "Download JDK" 메뉴를 통해서 쉽게 설치할 수 있다. 

여기서 설치하니 바로 터미널에서도 사용가능하다. 

예전에는 jdk 받을려고 오라클 회원가입하고, 까먹고 또 비번찾고 했었는데.. 편리하게 설치할 수 있어서 좋다. 

설치된 경로는 아래와 같다.  

~/Library/Java/JavaVirtualMachines/openjdk-17.0.1

 

3. ADB 경로 설정하기 

관례상 ANDROID_HOME을 설정해준다. Android Studio설치를 기본적으로 했으면 대략 다음 경로일것이다. 

~/Library/Android/sdk

사용하는 쉘이 bash이면 ~/.bash_profile 이나 ~/.bashrc를 수정하면 되고
zsh이면 ~/.zshrc 파일을 수정하면 된다.

export ANDROID_HOME="/Users/user/Library/Android/sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools/"

상대경로인 "~/Library/Android/sdk" 을 썻더니 안되서 풀경로 "/Users/user/Library/Android/sdk" 를 적었다. 

터미널에 바로 적용하려면 

source ~/.zshrc

그리고 터미널에 adb를 입력해서 실행되면 OK~ 

 



:

vivo 계정 만들기 ( with e-mail )

android 2019. 12. 6. 14:00

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 개발을 하면서, 중국 시장은 참 매력적인 시장이다. 

거대한 인수구는 인도와 비슷하지만, 인도보다는 조금더 사양이 좋은 기계들이 보급되어 있어서~ ㅋㅋ 

그러나 중국 안드로이드 폰은 ASOP 를 가져다가 폰 제조사들이 커스터마이징을 하다보니 이것 저것 문제점들이 많이 생긴다. 

중국에서 만이 사용되는 폰제조사 중에서 vivo폰의 경우에는 계발자 옵션을 통해서 usb로 apk를 넣으려고 하면 vivo 계정이 있어야 한다. 

중국 vivo폰을 중고로 사고, 개발폰으로 사용하는데 개통은 하지 않고 싶을때는 간단하게 이메일(e-mail)을 통해서 vivo 계정을 만들수 있다. 


vivo 계정 만드는곳 : https://passport.vivo.com/in/#/register



나라는 한국을 선택하고 e-mail을 입력하면 되는데.. 

여기에 네이버메일이나 다른 국내 메일주소를 입력하니 모르는 주소라고 입력이 안된다. 그래서 gmail 계정을 입력하니 넘어가네요. 


그러면 등록한 이메일로 확인 메일과 verification code가 도착하는데, 다음 화면에서 입력해주면 된다.


주의 

vivo폰에 계정을 사용해서 로그인을 하고, 다른 계정으로 변경하려면, 기존에 로그인한 계정의 비번을 알아야 한다. 이걸 모르면 계정을 만들어도 내 계정으로 로그인이 안된다. ( 좀 그지 같은데, 엄청난 보안을 강조하고 있는듯 ) 





:

veridex 툴을 사용하여 non-SDK API 사용 확인법

android 2019. 8. 20. 22:31

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 9.0 ( APL Level 28 ) 부터 public API가 아닌 API 사용에 대해서 제한이 생긴다.  그럼 pubic API가 아닌건 어떤 것일까? 

Android의 View.java 파일을 보면 아래처럼 @hide로 주석이 달려 있는 코드들이 있다. 

/**
* Set an observer to collect stats for each frame rendered for this view.
*
* @hide
*/
public void addFrameMetricsListener(Window window,
Window.OnFrameMetricsAvailableListener listener,
Handler handler) {
if (mAttachInfo != null) {
if (mAttachInfo.mThreadedRenderer != null) {
if (mFrameMetricsObservers == null) {
mFrameMetricsObservers = new ArrayList<>();
}

FrameMetricsObserver fmo = new FrameMetricsObserver(window,
handler.getLooper(), listener);
mFrameMetricsObservers.add(fmo);
mAttachInfo.mThreadedRenderer.addFrameMetricsObserver(fmo);
} else {
Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats");
}
} else {
if (mFrameMetricsObservers == null) {
mFrameMetricsObservers = new ArrayList<>();
}

FrameMetricsObserver fmo = new FrameMetricsObserver(window,
handler.getLooper(), listener);
mFrameMetricsObservers.add(fmo);
}
}

이런 함수(또는 필드)들은 public 접근자로 되어 있는데도 사용할 수 가 없다. 바로 이런것들이 non-public function 가 되는 것이고, 이러한 함수와 필드(변수)를 통틀어서 non-SDK Interface 라고 부른다. 


이렇게 숨겨진 함수들을 java의 reflection을 통해서 사용하는 방법이 있다. 그런데, 어떤 특정 기능을 구현할때 이런 함수들을 사용하면 상당히 편리한 경우가 있는데, 구글에서는 이런 편법적인 사용을 금지한 것이다. 이유는 public 으로 오픈한 함수가 아니라서 구글에서는 해당 함수이름을 변경하거나 삭제하거나 맘대로 하게 되는데, 특정 App에서 non-SDK Interface를 사용하였다면 문제가 발생하기 때문이다. 

그리고 구글에서는  non-SDK Interface에 대해서 아래처럼 3가지로 구분하고 있다. 


블랙리스트 : 앱의 target API와 상관없이 사용하면 안되는 리스트 

다크그레이 리스트 : target API를 28로 설정하는 경우에 사용에 제한이 되는 리스트 

라이트그레이 리스트 : target API를 28로 설정하는 경우에 사용은 가능하지만 잠제적으로 문제가 될 수 있는 리스트 


그리고 android 9.0부터는 이러한 non-SDK를 사용했을때 발생하는 문제는 아래와 같다. 

액세스 수단결과
필드를 참조하는 Dalvik 명령어NoSuchFieldError 발생
메소드를 참조하는 Dalvik 명령어NoSuchMethodError 발생
Class.getDeclaredField() 또는 Class.getField()를 통한 리플렉션NoSuchFieldException 발생
Class.getDeclaredMethod()Class.getMethod()를 통한 리플렉션NoSuchMethodException 발생
Class.getDeclaredFields()Class.getFields()를 통한 리플렉션결과에 비 SDK 구성원 없음
Class.getDeclaredMethods()Class.getMethods()를 통한 리플렉션결과에 비 SDK 구성원 없음
env->GetFieldID()를 통한 JNINULL이 반환되고 NoSuchFieldError발생
env->GetMethodID()를 통한 JNINULL이 반환되고 NoSuchMethodError 발생


target API를 28로 설정하것이 아니면 일단은 블랙리스트의 사용 여부만 검점하면 되는데, 이건 검사해 주는 도구가 veridex 도구 이다. 

또는 StrictMode의  detectNonSdkApiUsage 을 사용해도 되는데, 이방법은 실행시간에 오류를 알려 주게 되므로 모든 기능을 다 사용해 봐야 어느 정도 검증을 할 수 있게 된다. 그래서 target API를 28로 올리는 시점에는 veridex로 한번 체크하는것을 권한다. 



위의 경로에서 다운받고 압축을 푼 뒤에, 아래의 명령으로 실행하면 된다. 

./appcompat.sh --dex-file=test.apk


apk를 압축해제한후 직접 dex파일을 지정해도 되지만, 편리하게 그냥 apk 이름을 넣으면 알아서 검사를 해준다. 검사결과는 대략 아래처럼 표시된다. 


--- 중략 ---

다행이도 아직 target API가 28이 아니라서 큰 문제는 없다. 

그리고 veridex사용지 주의점이 있는데 완벽하게 체크해주는게 아니라는.. 

2019.8.20 기준으로 veridex의 한계점은 아래와 같다. 

  • JNI를 통한 호출은 감지할 수 없습니다.
  • 리플렉션을 통한 호출의 경우 일부만 감지할 수 있습니다.
  • 비활성 코드 경로 분석이 API 수준 검사로 제한됩니다.

즉, 완벽한게 아니라서, veridex로 검사하고, StrictMode로 같이 체크하는 수 밖에.. ㅠㅠ 






:

추가하지도 않은 libRSSupport.so 파일이 apk에?

android 2019. 6. 20. 20:54

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

app 용량이 커지고 있어서.. 빌드된 apk를 풀어서 분석하던 도중에.. native lib 에 새로운 파일이 보였다. 

lib/armeabi-v7a/librsjni_androidx.so

lib/armeabi-v7a/libsjni.so

lib/armeabi-v7a/libRSSupport.so


lib/arm64-v8a/librsjni_androidx.so

lib/arm64-v8a/libsjni.so

lib/arm64-v8a/libRSSupport.so


이중에서 libRSSupport.so 파일의 용량이 제일 크고, 다 합치면 4MB를 넘는 것이었다.. 

소스코드에서는 찾을수 없는 파일이었고, 이름으로 유추해보면 RenderScript 관련된 파일 같은데, 

검색을 조금 해보니 다음과 같은 결과를 찾았다. 

렌더스크립트를 사용하기 위해서 gradle에 아래처럼 설정을 해주면 자동으로 들어가는 파일이었다. 

android {
    compileSdkVersion 
28

    defaultConfig 
{
        minSdkVersion 
9
        targetSdkVersion 
19

        renderscriptTargetApi 
18
        renderscriptSupportModeEnabled 
true

    
}
}

renderscriptSupportModeEnabled 항목을 true로 하면, buildtool 버전에 따라서 알맞는 버전의 so 파일이 같이 바인딩되어서 apk에 포함되는데, buildtool 버전을 28.0.3 사용하고 있다면 대략 64bit 기준으로 2.2MB 정도되는 so 파일이 포함된다. 

설명 : renderscriptSupportModeEnabled - Specifies that the generated bytecode should fall back to a compatible version if the device it is running on does not support the target version.

추가되는 파일 : https://android.googlesource.com/platform/prebuilts/fullsdk-linux/build-tools/28.0.3/+/androidx-paging-release/renderscript/lib/packaged/arm64-v8a/libRSSupport.so 

그런데 신기한점은 내가 renderscript를 사용안하고 있는데, 해당 so 파일이 포함되었다. ㅠㅠ 

조금더 찾아 보니, 원인은 glide-transformations 이었다. 

해당 현상이 issue로도 등록되어 있는데 ( https://github.com/wasabeef/glide-transformations/issues/133 ) 아직 문제해결은 안되어 있는 상태다.  glide-transformations에서 제공하는 BlurTransformation 에서 rs를 사용하는듯 하다.  사용안하는 기능때문에 32bit, 64bit 합쳐서 4MB가 추가된다니 좀 아까워서..  gradle 설정에서 아래를 추가해보고 확인해 봤다. 

renderscriptSupportModeEnabled false


그래도 추가된다.  그지같다. 

결론 : 사용하고 있는 transform 코드만 가져다 붙이고 glide-transforamtions 의존성을 제거하는 방법 밖에 없다.. ㅠㅠ




:

[Kotlin] kotlin-stdlib, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8 차이점

android 2019. 6. 19. 11:44

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

코틀린을 사용해보려고 프로젝트에 라이브러리를 추가하려고 검색해보니 아래의 3가지 버전이 있네요. 

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

 

안드로이드 스튜드오에서 기본으로 코틀린 사용 체크하고 만들어지는 기본 세팅에서는 "kotlin-stdlib-jdk7" 으로 설정되던데.. 궁금해서 검색해봐도 잘 안나와서 각각 변경해보면서 추가된 라이브러리를 비교해 봤습니다. 

kotlin-stdlib

당연히 가장 기본이 되는 표준 라이브러리 이고, dependency에 따라서 kotllin-stdlib-common 추가 됩니다. 

kotlin-stdlib

 

kotlin-stdlib-jdk7

kotlin-stdlib-jdk7

jdk7 관련된 라이브러리가 추가로 보이는데, 달랑 2개의 클래스가 있을 뿐이네요.  짐작해보면 jdk7에서 지원하는 AutoCloseable 관련된 확장함수 추가가 전부인것 같네요. 

kotlin-stdlib-jdk8

kotlin-stdlib-jdk8

jdk7이 자동으로 추가되면서, jdk8 언어에서 지원하는 몇가지 기능들에 대한 지원이 추가된것 같네요. 프로젝트에서 아래와 같이 java8을 타겟으로 설정해서 사용하고 있으면 이걸 추가해서 사용하면 될것 같네요. 

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

 

추가로 kotlin-stdlib-jre7 같은것도 있었는데, 이름이 kotlin-stdlib-jdk7 으로 변경된것 같으니 jre 버전 사용중이었다면 jdk 버전으로 변경하면 됩니다. 



:

android studio 저장시 자동 codeStyle 적용 설정

android 2017. 11. 17. 10:55

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 스튜디오로 개발을 할때 (또는 IntelliJ) 팀간에 같은 코드스타일을 적용해야합니다. 

팀이 아니라면 필요 없을수도 있지만, 팀이라면 거의 필수 입니다. 


팀이면 git 같은 SVC 을 사용할것이고, 그러면 commit한 내용에 대해서 변경사항을 볼 수 있습니다. 

그런데, coding convention 과 code fomatter가 다르다면, 파일 전체가 변경되었다고 표시되는 경우가 있습니다. 


Android Studio 에서는 아래의 단축키를 누르면 code style이 적용됩니다. 

예를들어서 아래와 같은 코드가 있을때.. 

public class JPerson {



private String name;

public JPerson() {
if(name==null){
name = "Hong Gil Dong";
}
}
}

다음과 같이 띠어쓰기와 줄간격, 탭간격들이 조절됩니다. 

public class JPerson {


private String name;

public JPerson() {
if (name == null) {
name = "Hong Gil Dong";
}
}
}

차이점이 보이시나요? ㅋㅋ 

그리고 추가로 import 문의 순서도 정렬을 해주고, 안쓰는 import 문도 제거가 되게 하려면 Reformat File Dailog 에서 Optimize import에 체크해주면 됩니다. (단축키 : shift + option + command + L ) 


그러면,파일을 저장할때마다 reformat을 수행하는것이 번거롭기 때문에 매크로를 이용해서 reforamt 과 save를 같이 되도록 만든다음에 해당 매크로의 단축키를 지정하면 편리하게 이용할수 있습니다. 


1. Reformat File 다이얼로그( 단축키 shift+option+command+L) 에서 Optimize import에 체크 

2. menu edit → macro → start macro recording

3. 아래 단축키 차레로 누른다. 

   - reformat file ( 단축키 option+command+L)

   - save ( 단축키 ( command + S) 

4. menu edit → macro → stop macro recording

5. macro의 이름을 적당이 붙인다. (예, reformat and save ) 

5. 설정 → keymap 에서 save의 단축키를 위에서만든 macro로 변경한다. 


저는 위의 사진처럼, 기존의 저장 단축키 commad + S 에  새로만든 매크로를 연결하였습니다.  그럼 저장되기 전에 자동으로 reformat이 되고 저장이 됩니다. 





:

[삽질경험] crash at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)

android 2017. 11. 6. 14:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android Studio 3.0으로 업데이트를 하였는데.. 

구현단말기에서 아래와 같은 실행시 오류가 발생할때의 조치법. 


[crash callstack] 

D/dalvikvm: Trying to load lib /mnt/asec/[[packagename]]-1/lib/libsupportjni.so 0x41b13f30

E/dalvikvm: dlopen("/mnt/asec/[[packagename]]-1/lib/libsupportjni.so") failed: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...

W/dalvikvm: Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/android/tools/profiler/support/ProfilerService;

D/AndroidRuntime: Shutting down VM

W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41659ce0)

E/AndroidRuntime: FATAL EXCEPTION: main

              Process: [[packagename]], PID: 7500

              java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...

                  at java.lang.Runtime.loadLibrary(Runtime.java:364)

                  at java.lang.System.loadLibrary(System.java:526)

                  at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)

                  at [[packagename]].App.<init>(App.kt:25)

                  at java.lang.Class.newInstanceImpl(Native Method)

                  at java.lang.Class.newInstance(Class.java:1208)

                  at android.app.Instrumentation.newApplication(Instrumentation.java:990)

                  at android.app.Instrumentation.newApplication(Instrumentation.java:975)

                  at android.app.LoadedApk.makeApplication(LoadedApk.java:509)

                  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4446)

                  at android.app.ActivityThread.access$1500(ActivityThread.java:144)

                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)

                  at android.os.Handler.dispatchMessage(Handler.java:102)

                  at android.os.Looper.loop(Looper.java:136)

                  at android.app.ActivityThread.main(ActivityThread.java:5146)

                  at java.lang.reflect.Method.invokeNative(Native Method)

                  at java.lang.reflect.Method.invoke(Method.java:515)

                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)

                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)


위에 빨간색으로 표시한 부분이 힌트이다. 


재현된 경우는 다음과 같은 순서로 하면 재현이 된다. 

Android API Level 20 이상인 경우에는 profile을 지원해서 profile이 켜진상태로 실행을 하고, 

다음에 Android API Level 20 이하인 ( 본인은  Android 4.4 기기 ) 단말기를 연결해서 실행하니 위와 같은 오류가 발생하면서 죽는다. 


해결방법은 간단하다. 

메뉴에서 Run -> edit run configurations 를 연다음에 아래화면과 같이 체크박스를 해제해주면 된다. 






:

android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법

android 2017. 5. 12. 21:18

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 개발에도 점점 RxJava 를 많이 사용하고 있는데요, 

RxJava를 사용하고 있다면, mashmallow (android 6.0) 이상에서 구현해야 하는 권한 관리를 편하게 추가할 수 있습니다. 

 권한 설정 구현은 targetSdkVersion 23 이상으로 해서 빌드하면 반드시 구현해야 되는 항목입니다. 

targetSdkVersion 23


RxPermisstion을 적용하는 단계는 다음과 같습니다. 


[ 설정 ] 

build.gradle에 다음과 같이 추가해 줍니다. dependencies 부분에.. 

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar' // 이부분
testCompile 'junit:junit:4.12'
}

만약에 RxJava2를 사용하고 있다면..  아래 빨간 글씨처럼 2를 붙여주면 됩니다. 

dependencies {
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
}


[ 적용 ] 

1단계 

Activity의 onCreate() 에서 객체를 생성해 줍니다. 

public class CameraActivity extends BaseActivity {

RxPermissions rxPermissions;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);

}


그런 다음에 필요한 권한을 요청하고 구독하면 됩니다. 

아래는 camera 권한을 요청하고  

사용자가 허가하면 ( granted ), 카메라를 열고

거절하면 alert을 띄워주는 흐름입니다.  

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);


rxPermissions
.request(
Manifest.permission.CAMERA )
.subscribe(permission -> {
if (granted) {

openCamera();
}
else {
PermissionUtils.
alertPermission(this, Manifest.permission.CAMERA );

}
})
;
}


코드도 간략하고, 흐름도 너무 자연스러운게 좋습니다. 

그냥 구현하려면, 사용자 응답을 받는  onRequestPermissionsResult 함수에서 뭘하고, 해야 하다 보면 흐름이 이상해지는 경우나, 꼬이거나 해서 코드가 지져분해지기 쉬운데요, RxPermissions를 사용하면 너무나 쉽게 적용할 수 있습니다. 


request에 여러 permission을 동시해 요청할 수도 있습니다. 

여러 권한을 요청하면 granted 값은 모든 요청을 사용자가 동의한 경우이고, 하나라도 거절하면 false로 들어옵니다. 

rxPermissions
.request(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)


만약 여러권한에 대해서 개별적으로 응답을 받고 싶으면 request 대신에 requestEach를 사용하면 됩니다. 

rxPermissions
.requestEach(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)
.subscribe(permission -> {
// 요청한 permission 수만큼 호출된다.
if (permission.granted) {

}
else {

}
})
;


그리고 어떤 권한이 있는지 확인 하기 위해서는 아래처럼 간단하게 호출해 볼수 있습니다. 

if (rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 위치정보 관련 작업
}


[ 사용시 주의사항 ]

권한요청중에 앱이 다시 시잘될 수가 있으므로, onCreate같은 초기화 함수에서 request를 처리해야 합니다. 절대로 onResume에서 사용하면 안됩니다. 


[Tip]

* RxPermissions 사용시 추가해야할 proguard 설정은? 없습니다. 



더 자세한 정보를 위해서는 개발자의 page에 직접 방문해 보세요. 

https://github.com/tbruyelle/RxPermissions





:

구글 firebase 프로젝트 생성및 적용하기

android 2017. 4. 3. 21:43

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이번에는 firebase를 적용하는 방법에 대해서 알아 보겠습니다. 

firebase에서 제공하는 간략한 기능에 대해서 알아 보려면 다음 글을 읽어 보세요. 


2017/04/01 - [android] - 구글 firebase는 무엇인가? 제공하는 기능은?




firebase의 기능을 사용할때, 단순하게 SDK만 추가하면 되는것이 아니라, firebase console에서 설정을 추가하는 작업이 필요합니다. 


먼저 firebase console에 접속을 해서 프로젝트를 생성합니다. 

https://console.firebase.google.com/


저는 이름을 간단하게 firebaseChat 이라고 만들었습니다. 





project를 만들고 나면, 위그림과 같이 "Android 앱에 Firebase추가" 를 선택합니다. 

그러면 아래그림처럼 나오는데 packageName과 닉네임은 입력하면 되구요. 





중요한게 '디버그 서명 인증서 SHA-1(선택사항)' 인데요 


cmd 창에서 아래 명령으로 debug.keystore의 SHA-1 값을 구할수 있습니다. 



C:\Users\hanburn\.android>keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v -storepass android



설명에도 있지만, firebase의 로그인기능, 동적링크, 초대등에 필요합니다. 

그 외의 기능만 사용한다면 입력하지 않아도 됩니다. 


팁: cmd 창에서 마우스 오른쪽클릭후 표시를 선택하면 마우스로 text를 선택할수 있습니다. 선택한뒤 마우스 오른쪽을 클릭하면 선택된 내용이 복사됩니다. notepad 등을 띄어서 붙어넣기 하면 SHA-1 값을 쉽게 복사할수 있습니다. 





그런후 오른쪽 하단의 파란버튼을 누르면 위 사진처럼 config 파일(google-service.json)을 다운받을수 있는 화면이 나옵니다.  다운받은 json 파일을 그림처럼 app/ 하위에 복사합니다. 



이제 마지막으로 build.gradle에 2줄을 추가하면 되는데요, 




먼저 제일 상위에 있는 build.gradle 파일에 

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
// 아래줄 추가
classpath 'com.google.gms:google-services:3.0.0'

}
}



다음으로 app/build.gradle 파일의 상단에 다음을 추가합니다.  

apply plugin: 'com.android.application'
// 아래줄 추가
apply plugin: 'com.google.gms.google-services'


이것으로 firebase 적용을 완료 하였습니다. 



이렇게 firebase console에서 프로젝트를 생성하고, App에 적용하기만 하면 firebase에서 기본적으로 제공하는 것들은 firebase console에서 확인 할 수 있습니다. 


* 가장 강력한 것은 analytics 인데요, 상단히 많은 정보를 제공하고 있습니다. 

* 추가로 crash-report 도 같이 제공하고 있습니다. 


다음에는 firebase에서 제공하는 다른 기능들을 하나씩 살펴보겠습니다. 





:

구글 firebase는 무엇인가? 제공하는 기능은?

android 2017. 4. 1. 01:38

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2016년에 출시된 구글의 firebase에 대해서 알아 보자. 

firebase는 앱개발을 할때 필요한 도구와 인프라를 제공하기 위해서 구글에서 만들었다. 



초창기 안드로이드앱은 서버와 연동 없어 혼자 동작하는 기능의 앱이 많았다면, 요즘에는 앱혼자 동작하기 보다는 서버에서 데이터를 받아서 연동는 기능이 거의 필수처럼 구현되고 있는 상태이다. 그래서 구글에서는 앱개발자가 앱개발에만 전념할수 있도록 앱개발 이외의 모든것을 제공하기 위해서 firebase라는 이름으로 제공하고 있다. 

그럼 firebase에서 제공하는 것들은 어떤 것이 있는지 대략적으로 알아보자. 



이미지출처 : https://firebase.google.com/




위의 그림에서 보듯이, 크게 3가지의 카테고리로 제공하고 있다. 

구글에서 firebase를 사용하면 고품질의 앱을 빠르게 개발하고, 사용자층을 확대하고, 더많은 수익을 창출할 수 있는 모바일 플랫폼으로 설명하고 있다. 

이중에서 개발에 관련된것 위주로 간략하게 살펴보자. 



* Realtime Database 

 - On-line으로 제공되는 NoSQL DB 이다. 오프라인 모드를 지원하는 특징이 있다. 

 - 앱에서 하나의 DB를 보게되므로 여러 사용자에게 동기화된 데이터를 제공 가능하다. 

 - 리얼타임 데이터베이스를 사용하면 계시판등을 쉽게 만들수 있을것 같다. 



* Authentication

 - 로그인등의 인증을 제공하는데, Firebase에서제공하는 UI인증을 사용할수도 있고, 

 - Firebase SDK를 사용해서 로직 처리만 사용할 수도 있다. 

 - googke, facebook, twitter, github 와 제휴되어서 각각의 계정으로 로그인 인증을 제공한다. 

 


* Cloud Messaging 

 - 기존의 GCM(Google Cloud Messaging)이 FCM(Firebase Cloud Messaging)으로 이름이 변경된 것이다. 

 - 기존 push와 같은 알림메시지 뿐만이 아니라 데이터 메시지가 추가되었다. 

 - 메시지 전송시에도 기기별, 그룹별, 주제별로 타게팅 해서 보낼수 있다. 



* Storage 

 - 사용자의 사진, 동영상등의 컨텐츠를 저장할 수 있는 공간을 제공한다. 

 - 구글 클라우드 스토리지(Google Cloud Storage) 이다. 



* Hosting 

 - 웹 컨텐츠 호스팅 서비스로, global CDN을 제공한다.  

 - SSL을 기본적으로 제공한다. 

 - 앱개발보다는 웹개발에 적합한 도구로 보인다. 



* Remote Config 

 - 앱 업데이트 없이 어떤 변경을 동적으로 하고 싶을때 사용한다. 

 - GTM(Google Tag Manager)와 같은 방식으로 동작한다. 

 - 예를 들면, theme="white" 로 하면 앱의 전체적인 테마가 white계열로 보이다가, theme="black"으로 설정을 변경하면 앱이 black 계열로 변경되게 하는 것이다. 



* TestLab 

 - 일종의 AB테스트를 지원하는 기능이다. 

 - 예를 들으서 새로운 기능을 출시 할때, 전체 사용자가 아니라 일부 사용자에게만 시범적으로 먼저 사용해보고 피드백등을 받을수 있게 해준다. 

 - 피드백은 스크린샷, 로그, 동영상등으로 받을수 있다. 



* Crash Reporting 

 - 앱이 실행중 crash가 발생할때 어디서 죽었는지 callstack등을 제공한다. 

 - 또한 기기특성, 성능데이터 및 사용자 상황을 같이 제공해서 문제 해결을 도와준다. 



위에서 제공하는 기능들은 앱을 개발할때 필요한데, 서버개발이 필요한 부분이라서 firebase를 이용하면 상당한 도움이 될 것 같다. 제공하는 기능들이 앱개발시 필요한 것이고, 하나하나가 모두 유익한 것들이다. 


위에서 제공하는 기능들이 서로 연동되고 통합하는 중심에는 firebase의 꽃이라고 할 수 있는 Analytics가 존재한다. 


[Analytics] 

 - 기존의 GA(Google Analytics)가 웹페이지를 위한 목적으로 개발되었다면, FA(Firebase Analytics)는 앱을 목적으로 개발된 것이다. 

 - 사용자가 App을 사용하는 방식을 파악할 수 있다. 

 - 다양한 각도에서 여러가지 보고서를 제공한다. 

 - 중요한 것은 제한이 없는 무료라는 것이다.  ( GA는 light한 사용은 무료이고, 일정이상 사용하려면 유료 )

 - firebase 에서 제공하는 다른 기능들과 통합하여 여러가지 관리를 할 수 있다. 



중요한것 한가지를 빼먹었는데, firebase에서 제공하는 기능들 중에서 모두 무료로 제공하는건 아니다. 

Database, Storage, Hosting, TestLab , GoogleCloud Platform 등은 어느정도 까지만 무료로 제공한다. 

아래에서 무료로 지원하는 범위를 정리하였다. 


 Realtime Database

 동시접속

 100명

 저장용량

 1 GB

 다운로드

 10 GB / month

 Storage 

 저장용량

 5 GB

 다운로드

 1 GB / day

 업로드 횟수

 20,000 번 / day 

 다운로드 횟수

 50,000 번 / day

 Hosting

 저장용량 

  1 GB

 전송용량 

  10 GB / month


각각 기능들을 따로 제공하는 서비스들이 있는데, 각각 다른것을 이용하는 것보다 통합된 firebase를 사용하면 어떨까? 

실제 사용에 대한 판단은 사용하는 사람이~~  ( 저는 사용해보는 것에 한표~ ) 


이상으로 간단하게 firebase는 무엇이고, 어떤 기능들을 제공하는지 알아 봤습니다. 

다음으로는 간단하게 firebase를 적용하는 방법에 대해서 알아 보겠습니다. 


2017/04/03 - [android] - 구글 firebase 프로젝트 생성및 적용하기





: