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

2017년 1월 4일 수요일

[안드로이드] 무선 ADB 연결

선 없이 ADB 연결하기

안드로이드 개발을 하다보면, 여러 디바이스를 동시에 테스트 해야할 일이 많은데... USB포트의 개수는 한정되어 있어서 컴퓨터에 연결되는 디바이스의 개수가 제한되기 마련이다. ADB는 TCP 기반의 무선연결을 제공하므로, 이 기능을 통해서 USB포트보다 많은 디바이스를 연결할 수 있다.

준비

연결할 디바이스와 ADB가 있는 컴퓨터는 같은 네트워크에 속해있어야 한다. (즉, 3G/LTE일 때는 무선연결을 이용할 수 없다.)

ADB 연결

  1. 연결할 스마트폰을 컴퓨터에 USB로 연결한다.
  2. Terminal / cmd 를 열고, 다음과 같이 입력한다.
    • 이 때, 입력할 명령어는 adb가 설치되어 있는 디렉터리에서 수행되거나, 그 디렉터리가 환경변수로 등록되어 있어야 한다.
    • 아래 예제에서 5555는 포트번호이다. 포트번호는 임의로 설정해준다.
    • 성공시 restarting in TCP mode port: 5555 라는 메시지가 나타난다.
    • 이미 여러개의 장치가 컴퓨터에 연결되어 있을 경우, -s 옵션을 이용하여 device id를 추가로 입력해준다. device id는 adb devices 명령을 이용해 확인할 수 있다.
// Windows
adb tcpip 5555
adb -s <device id> tcpip 5555       // 여러개의 장치가 연결되어 위의 명령어가 안될 경우
// Mac or Linux
./adb tcpip 5555
./adb -s <device id> tcpip 5555      // 여러개의 장치가 연결되어 위의 명령어가 안될 경우
  1. USB를 연결해제한 후, 스마트폰의 ip를 확인한다.
  2. 확인한 ip를 이용해 다음과 같이 adb 명령을 수행한다.
    • 아래 예제에서 192.168.0.100은 스마트폰의 ip, 5555는 위에서 설정한 포트번호이다. 각자의 상황에 맞게 바꿔적어야 한다.
    • 성공시 connect to 192.168.0.100:5555라는 메시지가 나타난다.
// Windows
adb connect 192.168.0.100:5555
// Mac or Linux
./adb connect 192.168.0.100:5555
  1. 안드로이드 스튜디오에서 로그가 제대로 보이는지 확인한다. 혹은 다음의 명령어를 이용한다.
// Windows
adb devices
// Mac or Linux
./adb devices

2016년 12월 16일 금요일

[안드로이드] Process와 Task 차이

안드로이드의 Process

타 운영체제와 마찬가지로, 실행가능한 프로그램 데이터가 메모리로 로드되어 실행된 것을 프로세스라고 한다. 안드로이드는 리눅스 기반의 OS이므로, 리눅스의 프로세스처럼 각각 ID가 부여되며, 다른 프로세스와 철저히 격리되어 실행된다.

Process의 구등

안드로이드는 앱의 컴포넌트(엑티비티, 서비스, 리시버, 프로바이더)를 실행하는 시점에서, 그 컴포넌트가 메모리로 로드되고, 컴포넌트가 속한 앱의 프로세스가 구동된다.
Note : 앱의 프로세스가 새로 구동될 때마다, 시작점은 Application의 onCreate()메서드이다.

Process 변경

컴포넌트는 기본적으로 앱의 프로세스에 속하지만, 소속 프로세스를 변경할 수도 있다.
메니페스트 파일에서 컴포넌트를 선언할 때, android:process 필드를 지정하면, 이 컴포넌트는 앱의 프로세스와는 별개로, 다른 독립된 프로세스에서 실행된다.
Note : 별도의 프로세스에서 동작하더라도, Application의 onCreate()메서드는 호출된다.(왜그럴까......??)

안드로이드의 Task

앱을 실행하게 되면, 그 앱은 필요한 컴포넌트들을 호출하게 된다. 각 앱마다 현재 사용하고 있는 컴포넌트들을 그룹화하여 관리하는 것이 Task이다. 여기서의 컴포넌트는 해당 앱에 속한 컴포넌트 일수도 있고, 다른 앱에 속한 컴포넌트 일수도 있다.

컴포넌트 교차 생성

안드로이드의 독특한 특징으로, 다른 앱에 속한 컴포넌트를 호출하여 사용할 수 있다. 이렇게 호출된 컴포넌트는 현재 실행되고 있는 앱의 Task에 속하게 된다. 하지만, 호출된 컴포넌트가 메모리에 로드되면, 그 컴포넌트의 원래 프로세스가 구동되며, 컴포넌트가 실행되면서 필요한 권한설정은 원래 앱이 획득한 권한설정을 따르게 된다.
  • ex) 메모앱에서 기본 카메라의 엑티비티를 호출하는 경우
    • 기본 카메라의 엑티비티는 메모앱의 Task로 묶이게 된다.
    • 메모앱이 기본 카메라 엑티비티를 호출하는 시점에, 기본 카메라 앱의 프로세스가 구동된다. 즉, 메모앱의 프로세스와 기본 카메라 앱의 프로세스가 동시에 실행중인 상황이 된다.
    • 기본 카메라 엑티비티가 사용하고자 하는 권한(카메라 접근, 외부저장소 저장 등)은 메모앱의 권한설정이 아닌, 기본 카메라 앱의 권한설정을 따르게 된다. 따라서, 메모앱은 사진관련 권한이 없어도, 기본 카메라 앱에 권한이 있으면 문제없이 이용할 수 있고 반대로, 메모앱이 사진관련 권한이 있어도, 기본 카메라 앱에 권한이 없으면 기능을 이용할 수 없다.

엑티비티 스택

Task는 엑티비티의 순서를 관리하기 위해 별도로 스택을 유지하여 엑티비티를 저장한다. 즉, Task가 지워지면, 엑티비티의 순서도 지워지게 된다.

Task 변경

다른 컴포넌트들에 비해, 엑티비티는 메니페스트에서 <activity>태그의 android:launchMode 필드를 주거나, 엑티비티를 실행할 인텐트에 플래그 값을 추가하여 Task를 변경할 수 있다.(변경이라고는 해도 Task간 이동은 불가능하다.)

2016년 12월 12일 월요일

[안드로이드] 안드로이드의 특징과 역사

안드로이드

  • 구글의 주도하에 여러 회사들이 Open Handset Aliance 컨소시엄으로 진행하고 있는 모바일 OS
  • 2008년 모바일 첫 장비가 출시된 이후, 현재 모바일, TV, wearable, Auto 등으로 범위가 확장되고 있다.

특징

  • 운영체제 커널은 리눅스 커널을 기반으로 한다. 오픈소스이기 때문에 여러 제조사에서 커널을 변경하여 배포하기도 한다.
  • 공식 개발언어는 자바를 이용하며, 추가적으로 C를 이용해 개발할 수 있는 NDK를 지원한다.
  • OpenGL, SQLite 등 검증된 주요 라이브러리를 모두 포함하고 있다.
  • 플랫폼에 내장된 빌트인 애플리케이션과 일반 사용자가 만든 프로그램이 동일한 레벨로 취급된다.
  • 다양한 제조사, 다양한 기기에 이용되다 보니 파편화 이슈가 심하다.

아키텍쳐

안드로이드_아키텍쳐.PNG
  1. 리눅스 커널을 이용하여 하드웨어 등 저수준 관리 기능을 담당한다.
  2. 라이브러리들과 런타임 머신이 커널위의 계층에 존재한다.
    • 라이브러리 : OpenGL, SQLite, WEBKit 등
    • 런타임 : Dalvic, JAVA 코어 라이브러리, ART(5.0 이후)
  3. 안드로이드에서 자바 라이브러리 형태로 제공하는 API를 프레임워크 계층에 구현했다.
  4. 빌트인 프로그램 및 사용자가 만든 프로그램이 응용프로그램 계층에 존재한다.

안드로이드 History

  • 네이밍규칙 : 알파벳 순서의 디저트 이름

2.1~2.3

  • 버전명
    • 2.1 : 이클레어 (API 7)
    • 2.2 : 프로요 (API 8)
    • 2.3 : 진저브레드 (API 9~10)
  • 주요 특징
    • WallPapersd카드에 앱 설치, 플래시 지원, NFC 지원xhdpi 해상도 지원
    • 태블릿을 지원하기 직전 OS
    • 지금은 사용하는 사람이 없다.(간혹 중소업체의 IoT 디바이스에서 사용)

3.0~3.2

  • 버전명 : 허니컴 (API 11~13)
  • 주요 특징
    • FragmentActionBar등 태블릿 전용 UI 지원, 시스템 Clipboard 지원
    • 드래그 & 드롭 기능 지원
    • Animator 지원(더 유연한 애니메이션 가능)
    • 유일하게 휴대폰과 태블릿으로 쪼개진 버전. (버림받았다.)
    • 지금은 사용하는 사람이 없다.

4.0~4.04

  • 버전명 : 아이스크림 샌드위치 (API 14~15)
  • 주요 특징
    • 휴대폰 & 태블릿 통합 API 제공 - 휴대폰에서도 ActionBar, Fragment 등 3.0에서 추가된 기능 이용가능
    • 안드로이드 OS중 하위 버전과 가장 많은 차이를 보인 OS
    • WifiDirect 지원, 온도계, 습도계 센서 추가, GridLayout 추가
    • 하드웨어 가속 지원(화면 렌더링에 그래픽카드를 이용)

4.1~4.3

  • 버전명 : 젤리빈 (API 16~18)
  • 주요 특징
    • 현재 (${today}) 기준으로 시즌 off된 휴대폰의 최소 버전이다.
    • 4.1(API 16)
      • 메모리 관리방식
      • Camera, Audio 라이브러리 개선
      • Android Beam 지원
      • Notification 스타일 변경
    • 4.2(API 17)
      • DayDream 추가
      • Second Display 지원
      • 잠금화면 위젯
      • 멀티 유저(다중 계정)
      • RTL layout,
    • 4.3(API 18)
      • Bluetooth Low Energy(BLE) 지원
      • Wi-Fi Scan only Mode 추가(WiFi로 유저의 위치정보를 받기 위해)
      • Multimedia 라이브러리 개선
      • OpenGL 3.0 지원, Mipmap 지원, optical bound layout 추가
      • 주소록 API 추가(Contacts Provider)

4.4

  • 버전명 : 킷캣 (API 19, 20)
  • 주요 특징
    • Print Framework추가(클라우드 프린팅 가능)
    • 오디오 터널링 지원
    • Storage Access Framework 추가(저장소 접근 방법 변경)
    • reusable bitmap, Animator pause 추가
    • Immersive Full Screen(전체화면 상태인데 사용자의 터치동작에 따라 상태바가 보여짐)

5.0~5.1

  • 버전명 : 롤리팝 (API 21, 22)
  • 주요 특징
    • 달빅 가상머신을 ART 런타임 으로 대체
    • 64비트 지원
    • 머티리얼 디자인
    • Heads-Up 알림(기존의 작업을 방해하지 않고 다이얼로그 처럼 사용자의 액션을 받는 노티피케이션)
    • 알림 기능 개선(잠금상태에서 알림 받을 수 있음)
    • 카메라 성능 개선
    • Chromium 엔진을 이용하도록 WebView변경
    • 다중 SIM카드 지원
    • 아파치 HTTP 클래스 지원 중단

6.0

  • 버전명 : 마시멜로 (API 23)
  • 주요 특징
    • Runtime 퍼미션(앱을 실행할 때 필요한 퍼미션을 요청)
    • 배터리 절약 모드(Doze, App Standby 모드) - Doze모드에서 알람, 비동기 네트워크 처리 등이 제한되므로 신경써야함
    • 텍스트 선택 UI변경
    • 지문인식 지원
    • 앱링크
    • 구글 드라이브에 자동으로 백업 - 하위 버전에서는 수동으로 구현해야 함
    • 블루투스 스타일러스 펜 지원
    • 4K 디스플레이 모드 추가

7.0

  • 버전명 : 누가 (API 24)
  • 주요 특징
    • 향상된 Doze모드 - Doze 동작이 2단계로 변경
    • 백그라운드 최적화
      • CONNECTIVITY_CHANGE 액션을 메니페스트에 등록하여 사용불가(앱 내에서 등록 및 사용은 가능)
      • ACTION_NEW_PICTUREACTION_NEW_VIDEO 사용불가
    • 설정에서 스크린 크기 변경 가능 - 모든 크기의 스크린 사이즈에서 제대로 UI가 구성되는지 확인할 필요 있음
    • 멀티윈도우 지원
    • JIT/AOT 동시 지원 컴파일러 사용
    • Vulkan API 사용가능
    • Quick Setting 영역의 타일 API 사용가능

2016년 10월 6일 목요일

[안드로이드] Gradle로 여러가지 버전 생성하기

Gradle로 여러가지 버전 생성하기

  • Gradle은 하나의 프로젝트에서 여러가지 버전의 APK를 생성할 수 있도록 지원한다.
  • Build Variants = BuildType + Product Flavor
  • Gradle을 이용하면 Build Variants 별로 각각 다른 APK를 한번에 생성할 수 있다.

BuildType

  • 일반적으로 애플리케이션의 개발 과정에 따라 나뉠 수 있다.(debugalphabetarelease 등)
  • 안드로이드 프로젝트를 처음 생성하면 Gradle은 기본적으로 debugrelease의 빌드타입을 생성한다.
  • 빌드타입에 따라 키스토어 적용 여부, 디버그모드 허용 여부, 프로가드 적용 여부 등을 다르게 설정할 수 있다.
  • 빌드타입 별로 소스코드, 리소스를 다르게 적용할 수 있다.(이 후의 SourceSet 부분 참조)
  • 모듈별 build.gradle 스크립트에 buildTypes 속성을 추가하고 원하는 빌드타입을 추가한다.
  • 다음 예시는 alphabetarelease 빌드타입을 추가한 것이다.
android {
    ...
    buildTypes {
        alpha {
            applicationIdSuffix '.alpha'
            debuggable true
            minifyEnabled false
        }
        beta {
            applicationIdSuffix '.beta'
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            applicationIdSuffix '.release'
            debuggable false
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    ...
}

Product Flavor

  • 동일한 앱의 서로 다른 버전을 의미(ex : free버전, paid버전 등)
  • 안드로이드 프로젝트를 처음 생성하면 Product Flavor는 존재하지 않는다.
  • 이 속성에 따라 applicationId, 버전코드, 버전명 등, 앱의 속성을 다르게 설정할 수 있다.
  • 빌드타입과 마찬가지로 소스코드, 리소스를 다르게 적용할 수 있다.
  • 모듈별 build.gradle 스크립트에 productFlavors 속성을 추가하고 원하는 flavor들을 추가한다.
  • 다음 예시에서는 freepaid 를 추가한 것이다.
android {
    ...
    productFlavors {
        free {
            applicationId 'com.test.app.free'
            versionCode 2
            versionName '1.0.1'
        }
        paid {
            applicationId 'com.test.app.paid'
            versionCode 1
            versionName '1.0.0'
        }
    }
    ...
}

Source Set

  • Gradle은 Build Variants의 소스코드, 리소스를 각각 다르게 설정할 수 있다.
  • 지정하고자 하는 디렉터리들을 미리 생성해두어야 한다.
  • BuildType과 ProductFlavor의 조합을 각각 지정할 수도 있고, 필요한 경우만 지정할 수도 있다.
    • BuildType과 ProductFlavor를 조합하여 지정할 경우 ProductFlavor+BuildType의 순서로 작성한다.
    • ex) debug & free => freeDebug
  • 다음의 예시는 위의 Build Variants를 각각 지정하여 변경한 것이다.
android {
    ...
    sourceSets {
        // main은 디폴트 위치
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
        }
        // Product Flavor만 따로 지정하는 경우
        free {
            manifest.srcFile 'src/free/AndroidManifest.xml'
            java.srcDirs = ['src/free/java']
            res.srcDirs = ['src/free/res']
        }
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
            java.srcDirs = ['src/paid/java']
            res.srcDirs = ['src/paid/res']
        }
        // Build Type만 따로 지정하는 경우
        debug {
            res.srcDirs = ['src/main/resDebug']
        }
        alpha {
            res.srcDirs = ['src/main/resAlpha']
        }
        beta {
            res.srcDirs = ['src/main/resBeta']
        }
        release {
            res.srcDirs = ['src/main/resReal']
        }
        // 둘을 조합하여 지정하는 경우
        freeDebug {
            res.srcDirs = ['src/free/resDebug']
        }
        freeAlpha {
            res.srcDirs = ['src/free/resAlpha']
        }
        freeBeta {
            res.srcDirs = ['src/free/resBeta']
        }
        freeRelease {
            res.srcDirs = ['src/free/resReal']
        }
        paidDebug {
            res.srcDirs = ['src/paid/resDebug']
        }
        paidAlpha {
            res.srcDirs = ['src/paid/resAlpha']
        }
        paidBeta {
            res.srcDirs = ['src/paid/resBeta']
        }
        paidRelease {
            res.srcDirs = ['src/paid/resReal']
        }
    }
    ...
}

변경 내용 확인하기

  • 안드로이드 스튜디오의 Project 인스펙터를 연다. (맥 단축키 cmd + 1)
  • 왼쪽 하단의 Build Variants를 선택하면 Project 인스펙터 하단에 Build Variants 인스펙터가 열린다.
  • 모듈별로 Variants를 선택할 수 있는데, variants를 선택하면 Project 인스펙터에서 선택된 폴더를 확인할 수 있다.
BuildType

2016년 9월 27일 화요일

[안드로이드] 안드로이드 스튜디오를 이용한 코드정리

1.정적 코드분석

  • Android Studio는 기본으로 내장된 Lint가 있어서, 이 Lint를 이용해 정적 코드분석을 수행할 수 있다.
  • 이 Lint를 이용하면 Android 관련 코드, 자바, JSON,. XML, Gradle, C/C++ 등... 안드로이드의 모든 소스에 대한 정적 분석을 수행할 수 있다!!

코드분석기 설정

  • Preference 창을 연다.(맥의 경우 단축키 cmd + ',')
  • 왼쪽의 메뉴에서 Editor -> Inspections를 찾아 들어간다.
  • 필요한 분석기를 체크하고 OK / Apply 버튼을 눌러 저장한다.
CodeAnalize

정적 코드분석 수행

  • 상단 메뉴에서 Analyze -> Inspect Code를 선택한다.
  • 코드분석을 수행할 범위를 선택한 후 분석을 시작한다.
  • 분석이 끝나면 하단에 분석결과가 나온다.
  • 이 분석결과는 위에서 체크한 코드분석기의 결과만 반영한다.
Code Analize

2. Pre-Commit 코드분석

  • Android Studio는 내장된 Pre-Commit hook이 있다.
  • 이 hook은 Commit 대상 파일에만 동작한다.
Code Analize

  • Commit 화면에서 체크 후에 Commit을 수행하면 해당 hook이 동작하게 되고, 작업이 실패하게 되면, 작업 결과와 함꼐 그냥 commit을 할껀지, 작업 결과를 볼껀지 선택할 수 있다.Code Analize
  • 결과 보기를 선택하면 하단에 결과가 노출된다.
Code Analize