앱 개발 환경 설정
넥사크로플랫폼 안드로이드 앱은 이클립스, 안드로이드 SDK를 이용해 개발하며 기본적인 절차는 일반적인 안드로이드 앱을 만드는 방법과 같습니다.
이클립스와 안드로이드 SDK 설치파일과 관련된 자료는 구글 안드로이드 웹페이지를 참고하세요.
이클립스 및 안드로이드 SDK는 최신 버전 갱신 주기가 빠르므로 위 웹페이지의 링크를 이용해서 최신 개발환경으로 설치해야 합니다. 설치와 관련된 세부적인 내용은 이클립스, ADT 플러그인, 안드로이드 SDK 버전이 업데이트 될 때마다 조금씩 변경될 수 있습니다.
안드로이드 기본 개발 환경 구성은 다음과 같은 절차로 진행합니다.
JDK(Java SE Development Kit) 설치
이클립스 설치
안드로이드 SDK 설치
ADT 플러그인 설치
2014년 12월 구글에서 새로운 개발도구인 안드로이드 스튜디오를 공개했습니다.
https://en.wikipedia.org/wiki/Android_Studio
안드로이드 스튜디오를 사용하는 방법과 기존 이클립스 프로젝트를 안드로이드 스튜디오로 가져오는 방법을 이번 장에 추가했습니다.
2015년 6월부터 구글은 이클립스 ADT 플러그인 지원을 중단했습니다.
http://developer.android.com/tools/help/adt.html
개발 환경에 따라 안드로이드 스튜디오만 지원할 수도 있습니다.
이미 앱 개발 환경이 설정되어 있다면 앱 개발 환경 설정은 건너뛰어도 됩니다.
JDK(Java SE Development Kit) 설치
안드로이드 스튜디오와 이클립스는 자바 기반으로 만들어졌기 때문에 실행하기 위해서는 JDK(Java SE Development Kit) 환경이 설정되어 있어야 합니다. JDK는 무료로 제공되고 있으며 간단하게 설치할 수 있습니다.
내려 받기
아래 사이트에서 시스템 환경에 맞는 JDK를 내려받을 수 있습니다.
이번 장에서는 jdk-7u17-windows-i586.exe (version 1.7.0_17) 파일을 내려 받아 사용했습니다. 사이트 업데이트에 따라 일부 내용이 변경될 수 있습니다.
설치 확인
내려받은 설치파일을 실행하면 자동으로 필요한 환경설정과 설치과정을 진행합니다. 설치가 완료되면 커멘드창에서 정상적으로 설치되었는지 확인합니다.
java -version
JDK 1.5 이상 버전을 설치하는 경우에는 실행에 필요한 환경 변수(JAVA_HOME)를 따로 설정해주지 않아도 시스템 경로에 자동으로 실행 파일을 복사해 접근할 수 있습니다.
개발 도구 설치
안드로이드 스튜디오
안드로이드 스튜디오 설치파일은 기본적으로 SDK 도구를 포함하고 있습니다. 아래 사이트에서 환경에 맞는 설치파일을 내려받을 수 있습니다.
http://developer.android.com/sdk/index.html
안드로이드 스튜디오를 기본 옵션으로 설치한 경우에는 바로 개발 단계로 넘어갑니다.
이번 장에서는 안드로이드 스튜디오 1.5.1 버전 설치를 기준으로 작성했습니다.
이클립스
넥사크로플랫폼 14.0.1.3000 이후 버전부터는 FCM 서비스 기능을 추가하면서 이클립스 지원을 하지 않습니다. 안드로이드 스튜디오에서만 앱 프로젝트를 빌드할 수 있습니다.
이클립스 ADT 플러그인은 2015년부터 지원 중단이 되었으며 이후 추가된 서비스 기능을 사용하는데 제약이 있었습니다.
https://developer.android.com/studio/tools/sdk/eclipse-adt
이클립스는 별도의 설치 과정 없이 파일을 내려받아 압축을 풀어주면 바로 사용할 수 있습니다.
아래 사이트에서 환경에 맞는 파일을 내려받을 수 있습니다. Eclipse Standard 버전을 받거나 개발 환경에 맞는 파일을 선택해 내려받습니다.
안드로이드 SDK 설치
안드로이드 프로젝트를 진행하기 위해서는 관련된 API를 제공하는 안드로이드 SDK를 설치해야 합니다. 해당 파일은 안드로이드 개발자 사이트에서 제공하고 있습니다.
ADT 플러그인이 설치된 이클립스를 포함한 ADT Bundle 패키지를 내려받거나 SDK 설치 파일을 따로 받을 수 있습니다. SDK 설치파일만 따로 받으려면 아래 사이트 하단 메뉴에서 'USE AN EXISTING IDE' 링크를 선택하고 'SDK Tools for Windows' 설치 파일을 내려받습니다.
설치 파일을 실행해 설치가 완료되면 SDK Manager가 실행됩니다. SDK Manager는 개발에 필요한 안드로이드 API와 관련 도구를 내려 받을 수 있는 기능을 제공합니다. 항목 중 'Tools', 'Extras' 항목을 선택하고 필요한 안드로이드 API를 선택하고 설치합니다.
SDK Manager는 필요할 때 다시 실행해 추가로 API를 설치할 수 있습니다.
안드로이드 API 설치는 네트워크 환경에 따라 시간이 오래 걸릴 수 있습니다.
ADT 플러그인 설치
이클립스를 실행하면 설치된 JDK 버전에 해당하는 JRE(Java Runtime Environment)가 설정되어 있는지 확인합니다. JRE 설정은 아래 메뉴에서 확인할 수 있습니다.
Window > Preference > Java > Installed JREs
안드로이드 프로젝트를 수행하기 위해 ADT 플러그인을 설치합니다. 아래 메뉴로 이동해서 Developer Tools을 추가합니다.
Help > Install New Software
사용하는 이클립스 버전에 따라 추가 기능을 설치하기 위한 메뉴가 달라질 수 있습니다. 이클립스 3.4 이하 버전일 경우에는 [Help > Software Updates] 메뉴에서 확인할 수 있습니다.
이번 장에서는 이클립스 4.3(Kepler) 버전을 사용하고 있습니다.
Work with 항목 옆에 있는 'Add' 버튼을 클릭하고 다음과 같이 Repository 정보를 입력합니다.
ADT Plugin https://dl-ssl.google.com/android/eclipse/
선택할 수 있는 항목 중 Developer Tools 항목을 선택하고 설치를 진행합니다. 설치가 완료되면 이클립스가 재시작됩니다.
이클립스 프로젝트 마이그레이션
마이그레이션과 관련된 좀 더 자세한 내용은 구글에서 제공하는 가이드 문서를 참고하세요.
마이그레이션 절차
이클립스 ADT 플러그인으로 개발하던 프로젝트를 안드로이드 스튜디오로 마이그레이션할 수 있습니다. 마이그레이션은 아래 순서로 진행합니다.
[Import project] 기능을 실행합니다.
기존에 열어놓은 프로젝트가 없다면 빠른 시작(Quick Start) 창에서 새로운 프로젝트를 생성합니다. 아래 그림에서 [Import Project (Eclipse ADT, Gradle, etc.)]를 선택합니다. 다른 프로젝트 작업 중에 새로운 프로젝트를 생성하고자 한다면 [File > New > Import Project] 항목을 선택해 기능을 실행할 수 있습니다.
가져올 프로젝트를 선택합니다.
이클립스 workspace 폴더 아래에서 기존에 작성한 프로젝트 폴더를 선택합니다.
경로와 옵션 선택 후 [Finish] 버튼을 클릭합니다.
같은 Application 이름으로 경로를 지정합니다. 같은 이름을 가진 프로젝트가 있는 경우에는 다른 이름으로 수정할 수 있습니다.
build.gradle
마이그레이션 작업 이후 빌드가 정상적으로 처리되지 않는 경우가 있습니다. 이런 경우에는 build.gradle 설정을 일부 수정해야 합니다. 자주 오류가 나는 부분은 SDK 버전이 적절하지 않게 설정되는 때도 있고 dependencies 항목의 버전이 적절하지 않은 경우가 있습니다.
아래 코드는 예시로 제공한 것이며 실제 옵션은 개발 환경에 따라 달라질 수 있습니다.
apply plugin: 'com.android.application' android {buildToolsVersion "23.0.3" defaultConfig { applicationId "com.tobesoft.sampleproject" minSdkVersion 15 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile files('libs/nexacro14.jar') }
전체 옵션과 관련된 설명은 구글에서 제공하는 문서를 참고해주세요.
http://developer.android.com/tools/building/configuring-gradle.html
AndroidManifest.xml
구글 플레이 서비스 관련 라이브러리 설정이 기존 이클립스 ADT 플러그인 개발 환경과 달라진 부분이 있습니다. AndroidManifest.xml 파일은 그대로 사용할 수 있지만, 오류가 있는 경우 해당 파일 내 아래 옵션을 수정해줍니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tobesoft.sampleproject"
android:versionCode="1"
android:versionName="1.0" android:installLocation="auto">
...
<meta-data android:name="com.google.android.gms.version"
android:value="
" />
</application>
</manifest>구글 플레이 서비스 관련 라이브러리는 5버전부터 사용할 수 있지만, 안드로이드 스튜디오에서는 7.5.0부터 gradle에서 dependencies 처리가 됩니다. 그래서 AndroidManifest.xml 설정에서는 SDK에 있는 play_service 버전을 가지고 오도록 설정합니다.
주의
넥사크로플랫폼에서 제공하는 API 중 Map 오브젝트가 마이그레이션 이후 정상적으로 동작하지 않을 수 있습니다. 해당 이슈는 검토 중입니다. Map 오브젝트를 사용하는 서비스가 있다면 마이그레이션을 보류하는 것을 권장합니다.
앱 프로젝트 개발
앱 개발 환경이 설정되었다면 안드로이드 스튜디오 또는 이클립스를 실행해서 안드로이드 운영체제에서 동작하는 앱을 만들 수 있습니다. 앱 프로젝트를 진행하기 전에 넥사크로 스튜디오에서 개발된 애플리케이션에서 만들어진 아카이브 파일은 지정된 경로에 위치해야 합니다.
프로젝트 생성
안드로이드 스튜디오
기존에 열어놓은 프로젝트가 없다면 빠른 시작(Quick Start) 창에서 새로운 프로젝트를 생성합니다. 아래 그림에서 [Start a new Android Studio project]를 선택합니다.
다른 프로젝트 작업 중에 새로운 프로젝트를 생성하고자 한다면 아래 메뉴에서 생성할 수 있습니다.
File > New > New Project
항목 | 설명 | |
---|---|---|
1 | Application Name | 생성할 앱 이름을 입력합니다. |
2 | Company Domain | 회사 도메인명을 입력하면 패키지 이름을 자동으로 생성합니다. |
3 | Package Name | 입력한 회사 도메인명을 기준으로 패키지 이름을 생성합니다. |
4 | Project location | 프로젝트가 저장될 위치를 지정합니다. |
Minumum SDK를 설정합니다. SDK를 변경할 때마다 항목 하단에 얼마나 많은 디바이스에 대한 호환성을 제공하는지에 대한 정보를 제공합니다.
Blank Activity를 선택한 다음 추가 정보를 입력하고 [Finish] 버튼을 클릭하면 새로운 프로젝트가 생성됩니다.
이클립스
넥사크로플랫폼으로 개발된 애플리케이션을 담을 안드로이드 프로젝트를 생성하고 기본 환경을 설정해야 합니다. 새로운 프로젝트는 아래 메뉴에서 생성할 수 있습니다.
File > New > Android Application Project
'Android Application Project' 항목이 보이지 않는다면 ADT 플러그인이 정상적으로 설치되지 않은 것입니다. 해당 항목을 다시 한번 확인해주세요.
프로젝트 설정은 이클립스 또는 안드로이드 SDK 버전에 따라 조금씩 다를 수 있습니다.
항목 | 설명 | |
---|---|---|
1 | Application Name | 생성할 앱 이름을 입력합니다. |
2 | Project Name | 생성할 프로젝트 이름을 입력합니다. 프로젝트 이름은 사용하고 있는 워크스페이스 내에서 유일한 이름이어야 합니다. |
3 | Package Name | 도메인 형태로 패키지 이름을 입력합니다. |
4 | Minimum Required SDK | 넥사크로플랫폼은 안드로이드 2.3(Gingerbread)부터 지원합니다. |
안드로이드 4.4(Kitkat) 이상 SDK 사용 시 Minumum Required SDK를 3.2(Honeycomb) 이하로 설정하면 하위 호환성 유지를 위해 appcompat_v7 프로젝트를 자동 생성합니다.
http://developer.android.com/tools/support-library/features.html
하지만 넥사크로플랫폼 애플리케이션 생성 시에는 영향을 미치지 않기 때문에 해당 프로젝트를 생성하지 않는 것이 좋습니다. 이런 현상을 피하려면 Minumum Required SDK를 4.0(IceCreamSandwich)로 설정하고 프로젝트를 만든 후 AndroidManifest.xml 설정 시 원하는 하위 버전을 다시 지정할 수 있습니다.
넥사크로플랫폼 라이브러리 설정
안드로이드 프로젝트에서 넥사크로플랫폼에 최적화된 환경을 만들기 위해 추가로 제공되는 넥사크로플랫폼 라이브러리 파일을 설정해주어야 합니다.
libnexacro14.so 파일은 C/C++ 언어로 개발된 라이브러리를 의미합니다.
안드로이드 스튜디오
먼저 프로젝트 윈도우 상단에서 뷰 옵션을 [Project]로 변경합니다. 기본값은 [Android]입니다.
먼저 제공된 라이브러리 파일을 프로젝트 폴더에 포함된 libs 폴더에 복사합니다. nexacro14.jar 파일은 [프로젝트 > app > libs] 폴더 바로 아래에 복사하고 libnexacro14.so 파일은 [프로젝트 > app > src > main] 폴더에 아래 표를 참조해 복사합니다. 생성된 폴더 구조는 아래 그림과 같습니다.
파일 | 경로 |
---|---|
자바 아카이브(nexacro14.jar) | [프로젝트 경로]\app\libs\ |
32비트 공유 라이브러리(libnexacro14.so) | [프로젝트 경로]\app\src\main\jniLibs\armeabi-v7a\ |
64비트 공유 라이브러리(libnexacro14.so) | [프로젝트 경로]\app\src\main\jniLibs\arm64-v8a\ |
리소스 파일(icudtl.dat) | [프로젝트 경로]\app\src\main\assets\ |
배포 파일에 포함된 x86 폴더 내 파일은 특정 Intel CPU를 사용하는 장비에서 사용하기 위한 앱을 개발할 때 사용하는 공유라이브러리 파일입니다. 해당 제조사에서 x86 지원이 필요한 경우에만 주의해서 사용해주세요.
assets 폴더는 app을 선택하고 컨텍스트 메뉴에서 [New > Folder > Assets Folder] 항목을 선택해 추가합니다.
구글의 정책에 따라 2019년 8월 1일부터 Google Play에 게시하는 앱은 64비트 아키텍처를 지원해야 합니다.
https://developer.android.com/distribute/best-practices/develop/64-bit
32비트 아키텍처 CPU를 사용하는 모바일 장치에서는 64비트 공유 라이브러리는 동작하지 않습니다. 32비트와 64비트 공유 라이브러리가 모두 존재할 경우에는 64비트 라이브러리가 우선 사용됩니다.
64비트 앱은 Android 5.0 이상 환경에서 실행할 수 있습니다.
파일을 추가할 때 아래 그림처럼 파일명과 경로를 변경할 수 있는 창이 나타납니다. 기본 설정된 값으로 [OK] 버튼을 클릭합니다.
추가된 넥사크로플랫폼 라이브러리를 프로젝트에서 참조하도록 라이브러리에 추가합니다. nexacro14.jar 파일을 선택하고 컨텍스트 메뉴에서 [Add As Library] 항목을 선택합니다.
라이브러리가 정상적으로 추가되었는지 확인하려면 [프로젝트 > app] 항목을 선택하고 컨텍스트 메뉴에서 [Open Module Settings] 항목을 선택합니다.
[Modules > app] 항목에서 상단 탭을 [Dependencies]로 변경하면 라이브러리가 추가된 것을 확인할 수 있습니다.
이클립스
넥사크로플랫폼 14.0.1.3000 이후 버전부터는 FCM 서비스 기능을 추가하면서 이클립스 지원을 하지 않습니다. 안드로이드 스튜디오에서만 앱 프로젝트를 빌드할 수 있습니다.
64비트 라이브러리도 지원하지 않으며 이전 사용자를 위해 기존 설명은 유지합니다.
먼저 제공된 라이브러리 파일을 프로젝트 폴더에 포함된 libs 폴더에 복사합니다. nexacro14.jar 파일은 libs 폴더 바로 아래에 복사하고 libnexacro14.so 파일은 armeabi-v7a 폴더를 새로 만들어 복사합니다. 생성된 폴더 구조는 아래 그림과 같습니다.
추가된 넥사크로플랫폼 라이브러리를 프로젝트에서 참조하도록 Java Build Path를 설정합니다. 아래 메뉴로 이동해서 'Add Jars' 버튼을 선택하고 libs 폴더 안에 있는 nexacro14.jar 파일을 선택합니다.
File > Properties > Java Build Path > Libraries > Add JARs
리소스 설정
앱에서 사용할 로딩 이미지, 아이콘, 메시지, 레이아웃 등을 설정하는 단계입니다. 진행하는 프로젝트에 따라 변경해 적용할 수 있습니다.
각 리소스를 설정하면 아래와 같은 폴더 구조를 가집니다.
이미지 설정
로딩 이미지, 앱 아이콘을 res 폴더 아래 drawable-mdpi 폴더에 지정합니다. 적용할 이미지 파일은 앱에서 지원하는 해상도에 따라 설정할 수 있습니다. 상세한 내용은 안드로이드 매뉴얼을 참고해주세요.
항목 | 설명 |
---|---|
icon.png | 애플리케이션 바탕화면에 설치되는 아이콘 이미지입니다. AndroidManifest.xml 파일에서 지정된 파일명을 변경할 수 있습니다. |
splashimage_phone_landscape.png | 안드로이드 폰 가로 방향 스플래시 이미지입니다(모두 소문자). |
splashimage_phone_portrait.png | 안드로이드 폰 세로 방향 스플래시 이미지입니다(모두 소문자). |
splashimage_pad_landscape.png | 안드로이드 태블릿 가로 방향 스플래시 이미지입니다(모두 소문자). |
splashimage_pad_portrait.png | 안드로이드 태블릿 세로 방향 스플래시 이미지입니다(모두 소문자). |
파일명이 'text_select_handle~'로 시작하는 파일은 텍스트 선택 시 선택 영역을 처리하기 위해 사용하는 이미지입니다. 현재 버전에서는 해당 이미지를 직접 지정해주어야 합니다.
아이콘 파일은 프로젝트 생성 후 수정할 수 있습니다.
이미지 설정 | 안드로이드 스튜디오
[프로젝트 > app] 항목 선택 후 컨텍스트 메뉴에서 [New > Image Asset] 항목을 선택한 후 나타난 [Asset Studio]에서 아이콘 파일 관련 설정을 변경할 수 있습니다.
http://developer.android.com/intl/ko/tools/help/image-asset-studio.html
이미지 설정 | 이클립스
프로젝트 선택 후 컨텍스트 메뉴에서 [New > Other] 항목을 선택한 후 나타난 위자드 창에서 'android icon set'으로 검색해 [Android Icon Set] 항목을 선택합니다.
[Configure Icon Set] 항목에서 아이콘 파일 관련 설정을 변경할 수 있습니다.
메시지 설정
앱 실행시 사용할 메시지를 설정합니다. 프로젝트 생성 시 만들어지는 res 폴더 아래 values 폴더에 있는 strings.xml 파일을 아래와 같이 수정합니다.
$r_title(strings.xml) <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Nexacro 14</string> <string name="action_settings">Settings</string> <!-- Clipboard --> <string name="copy">Copy</string> <string name="paste">Paste</string> <string name="cut">Cut</string> <string name="close">Close</string> <string name="selectall">Select All</string> <string name="selectword">Select Word</string> <string name="needupdate">It is need to update. \r\nAfter completing, Please restart.</string> <string name="loadingFail">First loading is fail. \r\nPlease restart.</string> <string name="updateFail">Update is fail. \r\nPlease restart.</string> <string name="notexist">Start file is NOT exist. \r\nPlease restart.</string> <string name="BeingUpdated">Being updated.</string> <string name="wantreplace">There is a file of the save name. Do you want to replace? </string> <string name="ok">OK</string> <string name="cancel">Cancel</string> <string name="move">Move</string> <string name="upper">Upper</string> <string name="filter">Filter</string> <string name="home">Home</string> <string name="nofilename">No File Name.</string> <string name="checkforupdates">Check for updates.</string> <string name="installforupdates">Install for updates.</string> <string name="downloadingforupdates">Downloading for updates.</string> <string name="force_close">Update is Completed.</string> <string name="LoadingPleaseWait">Loading… \r\nPlease Wait…</string> <!-- Accessibility widget role --> <string name="alert">alert</string> <string name="pushbutton">pushbutton</string> <string name="combobox">combobox</string> <string name="checkbutton">checkbutton</string> <string name="radiobutton">radiobutton</string> <string name="text">text</string> <string name="list">list</string> <string name="listitem">listitem</string> <string name="statictext"></string> <string name="graphic">image</string> <string name="spacebar">space bar</string> <string name="textdeleted">deleted</string> <!-- Accessibility widget statue --> <string name="checked">checked</string> <string name="unchecked">unchecked</string> <!-- Accessibility reaction --> <string name="click">click</string> <!-- Splash message --> <string name="start_initialize">Start Initialize</string> <string name="check_license">Check License</string> <string name="load_frameworkmodule">Load Framework Module</string> <string name="load_extendmodule">Load Extend Module</string> <string name="execute_frameworkscript">Execute Framework Script</string> <string name="load_application">Load Application</string> <string name="load_failapplication">Load Fail Application Initialize. Click And Close</string> </resources>
영문 메시지 외 한국어나 일본어 등의 메시지를 추가하려면 res 폴더 아래 values-ko, values-ja 와 같은 식으로 폴더를 추가하고 strings.xml 파일을 추가합니다.
app_name 항목은 실제 디바이스에 설치되는 아이콘 이름을 정의하고 있습니다. 해당 항목을 수정하면 화면에 표시되는 아이콘 이름을 변경할 수 있습니다.
bool.xml 파일을 추가합니다.
$r_title(bool.xml) <?xml version="1.0" encoding="UTF-8"?> <resources> <bool name="is_jellybean_or_higher">false</bool> </resources>
레이아웃 설정
앱이 단말기에서 보여지는 레이아웃을 지정합니다. 넥사크로플랫폼 애플리케이션을 감싸기 위한 용도이기 때문에 기본적인 상태로 설정합니다.
res 폴더 아래에 있는 layout 폴더에 nexacro_app.xml 파일을 새로 만들어 추가합니다.
$r_title(nexacro_app.xml) <?xml version="1.0" encoding="utf-8"?> <!-- nexacro_app.xml --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nexacro_activity" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" tools:context=".deviceAPI.FileDialogActivity" > <com.nexacro.view.NexacroLayout android:id="@+id/nexacro_layout" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="match_parent" > </com.nexacro.view.NexacroLayout> </FrameLayout>
빌드 환경 설정
안드로이드 프로젝트를 생성하면서 기본으로 만들어진 MainActivity.java 파일과 AndroidManifest.xml 파일을 넥사크로플랫폼 환경에 맞게 수정합니다.
MainActivity.java
프로젝트 생성 시 액티비티 이름을 지정해주는데 별도로 수정하지 않는다면 MainActivity.java 라는 이름으로 생성됩니다. src 폴더 아래 지정된 패키지 이름 아래에 있는 MainActivity.java 파일을 선택하고 아래와 같이 수정해줍니다.
아래 내용 중 굵게 표시된 setBootstrapURL 메소드에 포함된 파라미터는 넥사크로 스튜디오에서 만든 start_android.json 파일이 배치된 서버 URL을 지정하고 setProjectURL 메소드에 포함된 파라미터는 해당 경로를 '/'까지 지정해줍니다.
$r_title(MainActivity.java) package com.tobesoft.sampleproject; import com.nexacro.NexacroUpdatorActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends NexacroUpdatorActivity { public MainActivity() { super(); setBootstrapURL("http://172.10.10.10:8080/nexacro/start_android.json"); setProjectURL("http://172.10.10.10:8080/nexacro/"); } @Override protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); if(intent != null) { String bootstrapURL = intent.getStringExtra("bootstrapURL"); String projectUrl = intent.getStringExtra("projectUrl"); if(bootstrapURL != null) { setBootstrapURL(bootstrapURL); setProjectURL(projectUrl); } } super.onCreate(savedInstanceState); } @Override public void setContentView(View view) { super.setContentView(view); } }
프로젝트 아카이브 파일을 생성하지 않고 직접 웹서버에 접근하려는 경우에는 아래와 같이 xadl.js 파일을 지정한 setStartupURL 메소드를 추가합니다. 이때 start_android.json 파일에는 engine 항목만 설정합니다.
super(); setBootstrapURL("http://172.10.10.10:8080/nexacro/start_android.json"); setStartupURL("http://172.10.10.10:8080/nexacro/HBDeviceTest/HBDeviceTest.xadl.js");
AndroidManifest.xml
AndroidManifest.xml 파일은 프로젝트 루트에 위치하며 애플리케이션에 대한 기본적인 정보와 특정 기능 실행 시 필요한 정보를 담고 있습니다. 기본적으로 필요한 정보를 아래 코드를 참고해 작성합니다. 아래 내용 중 굵게 표시된 package, MainActivity 에 대한 정보는 프로젝트 설정에 따라 지정해주어야 합니다.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tobesoft.sampleproject" android:installLocation="auto" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <!-- asset/archive 기능을 사용한다면 삭제할 수 있습니다. 그렇지 않은 경우에는 삭제할 수 없습니다. --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <application android:allowBackup="true" android:hasCode="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.tobesoft.sampleproject.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.nexacro.NexacroActivity" android:alwaysRetainTaskState="true" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="adjustResize" > </activity> <meta-data android:name="com.google.android.gms.version" android:value="google_play_services_version" /> </application> </manifest>
targetsdk 버전을 28 이상으로 지정한 경우에 HTTP 통신을 유지하기 위해서는 usesCleartextTraffic 값을 true로 지정해주어야 합니다.
해당 설정이 없을 경우 default 값이 false로 적용되어 HTTP 통신이 허용되지 않습니다.
https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic
<application
android:allowBackup="true"
android:usesCleartextTraffic="true"
배포할 앱의 기능에 따라 필요한 권한 및 기타 정보를 추가로 지정합니다. 예를 들어 카메라 기능을 사용한다면 아래와 같은 항목이 추가되어야 합니다.
... <uses-permission android:name="android.permission.CAMERA" /> <activity android:name="com.nexacro.deviceAPI.CameraListener" android:screenOrientation="landscape"> <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> ...
기능에 따른 정보 설정 시 추가할 수 있는 항목은 아래와 같습니다. 필요한 항목만 복사해 AndroidManifest.xml 파일에 추가합니다.
DeviceAPI
<!-- AudioPlayer, AudioRecorder --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Camera --> <uses-permission android:name="android.permission.CAMERA" /> <activity android:name="com.nexacro.deviceAPI.CameraListener" android:screenOrientation="landscape"> <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <!-- Contact --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- ExternalAPI --> <uses-permission android:name="android.permission.GET_TASKS" /> <!-- Geolocation, Map --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- Map --> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-library android:name="com.google.android.maps" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="user value" /> <!-- SMS --> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <receiver android:name="com.nexacro.deviceAPI.SmsRecv"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> <intent-filter> <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> <data android:mimeType="application/vnd.wap.mms-message" /> </intent-filter> </receiver>" <!-- Vibrator --> <uses-permission android:name="android.permission.VIBRATE" /> <!-- FileDialog --> <activity android:name="com.nexacro.deviceAPI.FileDialogActivity" android:screenOrientation="sensor"> <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
구글맵을 사용하기 위해서는 API KEY 값을 받아서 입력해주어야 합니다.
자세한 내용은 아래 링크를 참고하세요.
https://developers.google.com/maps/documentation/android/start#obtain_a_google_maps_api_key
GlobalAPI
<!-- 계정 --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- 전화번호 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 전화 걸기 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 디바이스 이름 --> <uses-permission android:name="android.permission.BLUETOOTH"/>
asset/archive 기능
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
cache 기능
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
Notification 기능 (14.0.1.3000 이후 버전)
14.0.1.3000 이후 버전에서는 Firebase Cloud Messaging(FCM) 서비스를 사용합니다.
About FCM messages
https://firebase.google.com/docs/cloud-messaging/concept-options
FCM 서비스는 Android 4.0 (API 14) 이상에서 사용할 수 있습니다. 해당 버전보다 낮은 운영체제에서는 정상적인 FCM 서비스가 동작하지 않을 수 있습니다.
<!-- Adding NexacroNotificationService --> <service android:name="com.nexacro.notification.NexacroNotificationService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- Adding NexacroActivity intent-filter --> <activity android:name="com.nexacro.NexacroActivity" android:launchMode="singleTask" android:noHistory="false" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:configChanges="orientation|keyboard|keyboardHidden|screenSize|navigation|uiMode"> <intent-filter> <action android:name="OPEN_NEXACRO_ACTIVITY_EXAMPLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
FCM 서비스를 이용하는 경우에는 build.gradle 설정에 아래 항목을 추가해주어야 합니다. 안드로이드 스튜디오에서 자동으로 설정되지 않는다면 확인 후 추가해주고 Firebase 콘솔에서 생성한 "google-services.json" 파일을 모듈 경로에 복사합니다.
Android 프로젝트에 Firebase 추가
https://firebase.google.com/docs/android/setup
buildscript { // Adding repositories repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files // Adding google service classpath 'com.google.gms:google-services:4.0.1' } } allprojects { // Adding repositories repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:support-v4:27.1.1' implementation 'com.google.android.gms:play-services-maps:16.0.0' implementation 'com.google.android.gms:play-services-location:16.0.0' implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-messaging:17.3.4' implementation files('libs/nexacro14.jar') } apply plugin: 'com.google.gms.google-services'
Notification 기능 (14.0.1.2802 이전 버전)
14.0.1.2802 이전 버전에서는 아래와 같이 사용합니다.
<!-- Notification --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <receiver android:name="com.nexacro.notification.NexacroNotificationReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.nexacro" /> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.nexacro" /> </intent-filter> </receiver> <service android:name="com.nexacro.notification.NexacroNotificationService" />
빌드
앱 테스트
안드로이드 단말기를 PC에 USB로 연결해 바로 테스트할 수 있습니다. 단말기를 직접 연결하는 경우에는 단말기에 애플리케이션 개발 옵션인 [애플리케이션 > 개발 > USB 디버깅] 항목을 설정하고 단말기에 맞는 드라이버를 설치해주어야 합니다.
안드로이드 스튜디오 또는 이클립스에서 Run 메뉴를 수행합니다. Run 메뉴는 APK를 생성 및 단말기에 설치하고 실행까지 할 수 있는 기능입니다. 실행하기 전에 어느 단말기에서 실행할지 선택합니다.
Run > Run
넥서스 원(Nexus One) 또는 옵티머스 원(Optimus One) 같은 경우 내장 메모리에 사용자가 쓸 수 있는 공간이 없어 외장 메모리 카드를 추가하지 않았다면 애플리케이션이 정상적으로 설치되지 않습니다.
안드로이드 가상 디바이스를 이용한 테스트는 지원하지 않습니다.
안드로이드 스튜디오
이클립스
설치 파일 생성
완성된 앱을 배포하기 위해서는 앱을 인식할 수 있는 keystore를 생성하고 서명된 APK 파일을 생성해야 합니다. keystore 파일은 최초 1회 생성하며 이후 앱이 업데이트되었을때는 최초 생성된 keystore 파일을 사용합니다.
keystore 생성 및 Signed APK 를 생성하는 방법은 구글의 웹페이지를 참조하십시오.
안드로이드 스튜디오
상단 메뉴에서 [Build > Generate Singed APK] 항목을 선택합니다.
이클립스
프로젝트를 선택하고 컨텍스트 메뉴에서 [Android Tools > Export Signed Application Package] 항목을 선택합니다.