GDB는 GNU에서 제공하는 Debugger다.
Windows, Linux, Android, iOS 등 다양한 플랫을 지원하는 디버깅 툴이라고 하는데,
사실 Android 안티 디버깅 테스트를 위해 간단히 설치와 실행 (+ 간단한 명령어) 정도만 사용해봤다.

멀고도 험한 보안의 길..


 

GDB 설치 방법

참고 링크 (https://www.hahwul.com/2015/09/03/android-android-gdb-build-arm-gdb-for/)

 

1. GDB 공식 홈페이지에서 최신버전(gdb-10.1.tar.xz) 을 다운로드하고, 압축을 해제한다.

 

Download GDB

Please send FSF & GNU inquiries & questions to gnu@gnu.org. There are also other ways to contact the FSF. This page is maintained by the GDB developers. Copyright Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. Verb

www.gnu.org

2. 터미널을 실행하고, 압축 해제한 GDB 폴더로 이동한다.

$ cd gdb-10.1

​3. 다음 명령어를 차례로 실행한다.

$ ./configure -target=arm-linux --prefix=/usr/local/arm-dev -v
$ make

4. 안드로이드 단말기를 USB 디버깅 모드로 연결 후 gdb를 넣어준다.

adb push gdb /data/local

 

 

GDB 실행 방법

다양한 GDB 실행 방법이 있지만, (내 기준) 가장 간단한 방법인 디버깅할 앱의 PID를 구해서 PID로 GDB를 실행하는 방법이다.



1. 디버깅할 앱의 PID 구하기

$ adb shell
$ su
$ ps -ef | grep keyword // App Package에 포함된 keyword로 검색

2. PID로 GDB 실행하기

$ adb shell
$ cd /data/local
$ ./gdb -p PID

 

그리고 이 두 명령어를 합쳐버린 명령어

$adb shell "su -c '/data/local/gdb -q -p `adb shell pgrep -f keyword`'"

 

더보기

+)

사실 디버깅을 위한 GDB 명령어까지 알면 좋겠지만,
앞서 말했듯이 'GDB가 동작중인가 ?' 정도만 확인하는 안티디버깅 테스트를 위한 수준이었으므로
구동중인 스레드 정보를 확인하고, 종료하는 명령어 정도만 사용했다.

(gdb) info threads // 스레드 정보 확인
(gdb) q // 종료

 

 

다양한 프로그래밍 언어만큼 각 언어를 지원하는 테스트 프레임워크가 존재한다.

Pytest는 이름에서부터 느껴지듯이 Python 스크립트를 지원하는 테스트 프레임워크로,

쉽게 말해 작성한 Python 스크립트의 동작을 Pass / Fail 형식의 결과로 나타내주는 일종의 라이브러리 모듈이다.

APPIUM을 Python Client로 사용하고 있다 보니, 자연스럽게 Pytest를 접하게 되었는데

생각보다 활용범위가 넓어 잊어버리기 전에 조금 정리해보고자 한다.

 


 

Pytest 공식 문서

앞서 소개했듯이, Pytest는 Python 스크립트를 실행하면서 Pass / Fail 결과로 나타내주는 Python 테스트 프레임워크다.
사용 방법은 어렵지 않아 공식 문서를 보면 금방 이해 할 수 있다.

 

 

Full pytest documentation — pytest documentation

 

docs.pytest.org

 

Pytest 설치 방법

사전준비. 당연히 Python이 설치되어 있어야 한다.

※ Pytest를 지원하는 Python 버전은 Python 3.6, 3.7, 3.8, 3.9, PyPy3 이다.

1. Windows 명령 프롬프트 혹은 MacOS 터미널에 다음 명령어를 입력한다.

$ pip install -U pytest

2. 설치 과정이 끝나면, 다음 명령어를 입력하여 Pytest의 버전이 뜨는지(= 제대로 설치 되었는지) 확인한다.

$ pytest --version
pytest 6.1.2 // 제대로 설치 된 경우 출력

 

Pytest 사용 방법

일반 라이브러리를 사용하듯이 Python 스크립트에 pytest 모듈을 import하여 사용한다.

단, Python 스크립트 파일명과 테스트 결과를 확인할 함수명은 test_ 로 시작 혹은 _test로 끝나야 한다.

※ 파일명/함수명을 지키지 않으면, pytest에서 test 대상으로 인지하지 못해 다음과 같이 Collected 0 item 으로 나타난다.

$ pytest test.py
================================== test session starts =======================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\User
collected 0 items

================================= no tests ran in 0.02s ======================================

 

예시)

동일한 Python 스크립트를 일반 Python으로 실행 VS Pytest로 실행

# 파일명 : test.py

import pytest

def test_success():
    test = 'Test Success !!'
    print(test)
    assert 'Success' in test // Test 결과 판별 기준

def test_fail():
    test = 'Test Failed !!'
    print(test)
    assert 'Success' in test // Test 결과 판별 기준

 

test_success() 와 test_fail() 이라는 함수 두개만 선언되어 있고, main 에서 함수를 호출하지 않기 때문에

일반 Python으로 실행시켰을 때는 아무런 동작도 표시되지 않는다.

$ python test.py

 

test.py를 pytest로 실행하면, 다음과 같은 테스트 결과가 나타난다.

$ pytest test.py
===================================== test session starts =================================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\User
collected 2 items

PycharmProjects\test\test.py .F                                                                       [100%]

========================================== FAILURES =======================================================
__________________________________________ test_fail ______________________________________________________

    def test_fail():
        test = 'Test Failed !!'
        print(test)
>       assert 'Success' in test
E       AssertionError: assert 'Success' in 'Test Failed !!'

PycharmProjects\test\test.py:11: AssertionError
------------------------------------ Captured stdout call -------------------------------------------------
Test Failed !!
=================================== short test summary info ===============================================
FAILED PycharmProjects/test/test.py::test_fail - AssertionError: assert 'Success' in 'Test Failed !!'
================================= 1 failed, 1 passed in 0.13s =============================================

test_success() 함수의 결과는 Pass로 따로 출력되지 않았고,

test_fail() 함수의 결과만 어느 부분에서 테스트가 실패했는지 친절하게 테스트 결과가 표시 된다.

+)

테스트 결과뿐만 아니라, 콘솔에 내용을 출력하고 싶다면 -s 옵션을 사용한다.

 

$ pytest test.py -s
====================================== test session starts =================================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\HyeJungSeo
collected 2 items

PycharmProjects\test\test.py Test Success !! // test_success() 출력결과 확인
.Test Failed !! // test_fail() 출력결과 확인
F

========================================== FAILURES =======================================================
___________________________________________ test_fail ______________________________________________________

    def test_fail():
        test = 'Test Failed !!'
        print(test)
>       assert 'Success' in test
E       AssertionError: assert 'Success' in 'Test Failed !!'

PycharmProjects\test\test.py:11: AssertionError
==================================== short test summary info ===============================================
FAILED PycharmProjects/test/test.py::test_fail - AssertionError: assert 'Success' in 'Test Failed !!'
================================== 1 failed, 1 passed in 0.08s =============================================

 

'곰대생 > Python' 카테고리의 다른 글

Python 디렉토리 생성 / 파일 쓰기  (0) 2020.12.08

소프트웨어 테스트를 할 때 작성된 테스트 케이스에 맞춰 기능을 테스트하는 경우도 있지만,
정해진 패턴없이 무작위로 랜덤 데이터 입력으로 진행되는 테스트도 필요하다.

이러한 테스트를 일컫는 용어인 Fuzz Test

 

구글링을 해보면 주로 보안과 관련된 글이 많은 걸로 보아,
주로 보안 취약점을 발견하는 데 사용하는 테스트 기법인 것 같다.

 


 

Fuzz Test : AWS Devicefarm Built-in Fuzz Test

AWS Devicefarm에서 기본적으로 제공하는 Fuzz Test
랜덤 데이터 입력으로 소프트웨어/하드웨어의 취약점을 확인하는 테스트를 의미한다.

실제로 AWS Devicefarm에서 Built in Fuzz-Test 스크린 레코드를 보면 정신없이 화면이 움직이는 모습을 볼 수 있다.

 

 

AWS Devicefarm 이용 방법은 공식 홈페이지에 친절하게 나와있어서 생략한다.

 

Device Farm용 기본 제공 퍼지 테스트를 이용한 작업 - AWS Device Farm

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

이 테스트를 오프라인 단말에서 할 수 있는 방법이 없을까 찾던 중 알게 된

 

Monkey Test

Android adb에서 제공하는 Monkey Test tool

역시 친절한 안드로이드 문서에 설명이 너무 잘 되어 있다.

 

UI/Application Exerciser Monkey  |  Android 개발자  |  Android Developers

Monkey는 에뮬레이터나 기기에서 실행되는 프로그램으로 여러 시스템 레벨 이벤트뿐만 아니라 클릭, 터치, 동작과 같은 사용자 이벤트의 의사 랜덤 스트림을 생성합니다.

developer.android.com

아무것도 모르는 원숭이가 이것저것 막 눌러보듯이 테스트를 한다고 해서 Monkey Test다.

에뮬레이터와 실제 기기 모두 사용 가능하며, adb 기본 사용 설정이 되어 있어야 한다. ※ 아래 글 참고 ※

 

Android adb 환경변수 설정 (Feat. 연결된 기기 확인)

테스트 자동화 프로그램을 구축하면서 많이 쓰는 adb 명령어 ! adb 명령어를 사용하려면 환경변수 설정을 해줘야 한다. 사전준비 1. Android Studio SDK 설치 Download Android Studio and SDK tools  | Android..

summer-west.tistory.com

Monkey 를 사용하는 기본 구문은 다음과 같고, option을 설정해 나름 세세하게 랜덤 동작을 조절할 수 있다.

 

adb shell monkey [options] <event-count>

옵션에 대한 설명도 공식 홈페이지에 아주 잘 나와있지만, 주요 옵션에 대해서 참고사항을 적자면

 

동영상은 옵션이 -v 500 -s 500 이라 굉장히 빠르고 짧은 테스트지만
옵션값을 적절히 조절하면 Devicefarm 의 Fuzz Test와 유사한 테스트를 할 수 있다.

(비행기모드 / Wifi 설정 등도 드래그, 터치 랜덤 동작 중 나타나는 동작)

 

카카오엔터프라이즈 인턴을 하면서 QA 분야로, 정확하게는 자동화 엔지니어로 방향성을 잡았다.

다양한 방식으로 테스트 자동화 프로그래밍을 공부하고 있는데,

특히 AWS Devicefarm 과 APPIUM을 연동하면서 다양한 방식으로 APPIUM을 다뤄보고 있다.

그동안 아장아장 예제를 따라하며 시작했던 테스트 스크립트를 이제는 직접 필요한 부분만 작성 할 수 있게 됐다.

그 중에서 APPIUM 스크립트에서 가장 기본 설정이 되는 Desired Capabilities

스크립트 작성 방식, JSON 파일 방식, CLI 방식 중 상황에 맞춰 활용하면 꽤나 똑똑하게 테스트를 진행할 수 있다.

그래서 정리해보는 Desired Capabilities 설정 방법


 

Desired Capabilities

쉽게 말하면 테스트 환경 설정을 위한 속성값을 정의한다.

APPIUM 서버에서 Client를 연동할 때, 정의된 Desired Capabilities 값을 참조하여 테스트를 진행한다.

Desired Capabilities 작성 방식은 스크립트 작성 / JSON 이용 / CLI 방식 총 세가지 방식이 있다.

 

첫번째. 스크립트 작성 방식

제일 먼저 소개할 방식은 테스트 스크립트 작성 시 Desired Capabilities 속성을 정의하는 방식으로,

스크립트 언어에 따른 예시도 APPIUM 공식 홈페이지에 나와있어 가장 쉽게 접근할 수 있는 방식이다. (내 기준에서)

스크립트 최상단에 Desired Capabilities 속성을 먼저 정의하고, 해당 값으로 Driver를 시작한다.

아래 소개할 두 방식과 달리 유일하게 스크립트 내부에서 정의된 속성값을 호출할 수 있다는 장점이 있다.

출처 : Appium Officail Site (http://appium.io/docs/en/commands/session/create/) ​

위 속성값은 예시로 작성 된 속성일 뿐, 속성 목록을 보고 테스트 환경에 따라 필요한 속성을 추가/제거하여 작성하면 된다.

속성 목록은 APPIUM 공식 홈페이지에 어떤 역할인지, 예시 구문까지 아주 친절하게 나와있다.

 

Desired Capabilities - Appium

From here you can search these documents. Enter your search terms below.

appium.io

경험상 Android 테스트의 경우 기본적으로 platformName / platformVersion / appPackage / appActivity 가 필요하다.

(여러 단말이 연결된 경우 UDID까지)

※ apk 파일에서 패키지와 액티비티 정보를 추출하는 방법은 아래 글 참고

 

Android apk 파일에서 매니패스트 정보 추출 (패키지명, 권한 등)

apk 파일만 덩그러니 놓여있을 때, apk 파일의 매니패스트 정보를 추출할 수 있는 방법 ​ AndroidStudio 에서 제공하는 AAPT2 를 이용하는 방법으로 주로 패키지명, Activity 구조, 권한 정보 등을 추출할

summer-west.tistory.com

 

두번째. JSON 이용 방식

다음은 JSON 파일을 이용하는 방식으로, 스크립트 언어가 익숙치 않은 사람들에게 유용한 방식이라고 생각 된다.

APPIUM 서버를 실행할 때 --default-capabilities flag 옵션으로 Desired Capabilities를 정의할 수 있는데,

Desired Capabilities 속성이 정의된 JSON 파일명 입력만으로 손쉽게 정의할 수 있다.

다만 단점은 이 때 설정한 값은 처음 세션이 시작할 때만 적용되고, 이후 스크립트 내부에서는 해당 속성값을 사용할 수 없다는 것이다.

이 때 사용할 JSON 형식은 Object xpath, id 값을 찾는 Inspector Sesstion 자연스럽게 생성할 수 있다.

 

이렇게 생성된 JSON은 명령어에 직접 이용 혹은 JSON 파일로 저장하여 이용할 수 있다.

# 명령어에 직접 이용
APPIUM --default-capabilities '{"app": "myapp.app", "deviceName": "iPhone Simulator"}'

# Windows CMD 사용 시 \ 필수
APPIUM --default-capabilities "{\"app\": \"myapp.app\"}"

# JSON 파일 저장 후 이용
APPIUM --default-capabilities /path/to/file.json

 

세번째. CLI 방식

마지막은 CLI 속성을 이용하는 방식인데,
--app, --platform-version 등 속성값을 입력하면 자동으로 JSON 형식으로 변환해 Desired Capabilities를 정의하는 방식이다.
즉, JSON 이용 방식과 마찬가지로 스크립트 내부에서는 해당 속성값을 사용할 수 없다는 단점이 있다.

CLI 속성에는 Desired Capabilities 속성값 외 포트번호라든가, log 출력 형식 등 APPIUM 서버 동작을 위한 유용한 속성들도 많아서
참고해서 활용하면 훨씬 편리하게 테스트 자동화를 진행 할 수 있다.

 

CLI Arguments - Appium

From here you can search these documents. Enter your search terms below.

appium.io

 

Apache 웹서버 + PHP 설치 방법을 검색해보면

Apache httpd.conf 파일에 아래 내용을 추가하라고 한다.

 

PHPIniDir "C:/php7.4.12"
LoadModule php7_module "C:/php7.4.12/php7apache2_4.dll"
AddType application/x-httpd-php .html .php
AddHandler application/x-httpd-php .php

 

현실은 아래 오류 메시지만 계속 출력되고, 구글링해도 나만 빼고 다들 잘 해결하더라..

 

Microsoft Windows [Version 10.0.18363.1198]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Windows\system32>httpd
AH00526: Syntax error on line 539 of C:/httpd-2.4.46-win64-VS16/Apache24/conf/httpd.conf:
Invalid command 'PHPIniDir', perhaps misspelled or defined by a module not included in the server configuration

 


해결 방법은 순서를 바꿔준다.

 

AddType application/x-httpd-php .html .php
AddHandler application/x-httpd-php .php
LoadModule php7_module "C:/php7.4.12/php7apache2_4.dll"
PHPIniDir "C:/php7.4.12"

 

LoadModule과 PHPIniDir을 아래로.. 하니깐 되더라..

※ Android App Bundle 형식은 아래 글 참고

 

Android App Bundle(.aab) 빌드 및 앱 설치 방법

AndroidStudio 에서는 빌드 결과물로 APK(Android 애플리케이션 패키지)와 AAB(Android App Bundle) 두 가지 형태를 제공한다. 흔히 앱 설치 파일로 알고 있는 APK는 Gradle에서 설정한 API 버전에 해당..

summer-west.tistory.com


Android Studio 상단 메뉴 > Build - Build Bundle(s) / APK (s) - Build APK(s) 클릭

 

​빌드가 끝나면 하단에 알림창 혹은 Event Log창에서 알림이 나타나고,
locate를 클릭하면 생성된 APK 디렉토리로 이동한다.

 

 

다들 알고 있듯이 이렇게 생성된 apk 파일은 안드로이드 단말에서 실행 시 앱이 설치 된다.

AndroidStudio 에서는 빌드 결과물로
APK(Android 애플리케이션 패키지)와 AAB(Android App Bundle) 두 가지 형태를 제공한다.

흔히 앱 설치 파일로 알고 있는 APK는 Gradle에서 설정한 API 버전에 해당하는 모든 설치 파일이 압축되어 있는 형태로,
Android 버전과 상관없이 동일한 파일로 앱을 설치한다.
반면, Android App Bundle은 다운로드 요청 시 사용자 단말 버전에 해당하는 API만 추출하여 빌드한 APK로 앱을 설치한다.
즉, Android App Bundle 형태로 빌드한 APK의 경우 필요한 API 버전만 포함하고 있어,
기존 방식의 APK 보다 현저히 작은 용량으로 앱을 제공한다.

실제로 Google Playstore에 앱을 등록할 때는 aab 형식을 권장하고,
테스트 과정에서 apk로만 테스트 할 경우 aab 설치 방식에서만 나타나는 이슈를 확인하지 못하는 경우도 있다.

그래서 알아본 aab 파일을 이용한 앱 빌드 및 설치 방법

 

 


Android App Bundle 빌드 방법

1. Android App Bundle 파일 생성

Android Studio 상단 메뉴 > Build  - Build Bundle(s) / APK(s) - Build Bundle(s) 클릭

 

2. aab 파일 디렉토리로 이동

일반적으로 C:\Users\사용자이름\AndroidStudioProjects\프로젝트이름\app\build\outputs\bundle\debug

Tip ! 빌드가 끝나면 하단에 알림창 or Event Log창에 알림이 뜨는데, locate 를 클릭하면 해당 디렉토리가 열린다.

 

 

Android App Bundle 앱 설치 방법

1. bundletool git hub 페이지에서 가장 최신 버전의 bundletool .jar 파일 다운로드

 

Releases · google/bundletool

Bundletool is a command-line tool to manipulate Android App Bundles - google/bundletool

github.com

aab 파일 위치로 bundletool.jar 다운로드


2. 명령 프롬프트(cmd) 실행 후 bundletool 버전 확인

cd aab 파일 디렉토리
java -jar bundletool파일명 version

예시)

/* 디렉토리로 이동 */
cd C:\Users\사용자이름\AndroidStudioProjects\프로젝트이름\app\build\outputs\bundle\debug
/* bundletool 버전 확인 */
java -jar bundletool파일명 version

예시)
Microsoft Windows [Version 10.0.18362.1139]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\Username> cd C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug
C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug> java -jar bundletool-all-1.3.0.jar version
1.3.0

 

3. bundletool을 이용하여 APK 파일 설치

 

① 앱 설치할 스마트폰 USB 디버깅 모드로 PC 연결 ※ adb devices 명령어로 연결상태 확인

 

② bundletool로 연결된 스마트폰 버전에 맞는 APKs 생성 ※--connected-device 옵션을 생략하면, 모든 API 버전을 포함하는 APKs 생성

java -jar "bundletool파일명.jar" build-apks --connected-device --bundle="aab파일명.abb" --output="생성할apks파일명.apks"

③ 생성한 APKs로 스마트폰에 앱 설치

java -jar "bundletool파일명.jar" install-apks --apks="생성된apks파일명.apks"

 

예시)

/* 디렉토리로 이동 */
cd C:\Users\사용자이름\AndroidStudioProjects\프로젝트이름\app\build\outputs\bundle\debug
/* APKs 생성 */
java -jar "bundletool파일명.jar" build-apks --connected-device --bundle="aab파일명.abb" --output="생성할apks파일명.apks"
/* APK 설치 */
java -jar "bundletool파일명.jar" install-apks --apks="생성된apks파일명.apks"

예시)

Microsoft Windows [Version 10.0.18362.1139]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\Username> cd C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug
C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug> 
java -jar "bundletool-all-1.3.0.jar" build-apks --connected-device --bundle="app-debug.abb" --output="generated.apks"
C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug> 
java -jar "bundletool-all-1.3.0.jar" build-apks install-apks --apks="generated.apks"

※ 주의 사항 ※

App Bundle Build 시 debug 폴더 자체가 재생성되므로,
bundletool.jar 파일을 따로 저장해두고 빌드 시 debug 폴더로 다시 옮겨줘야 한다.

APKs 파일 생성 시 동일한 이름의 APKs 파일이 존재할 경우 에러가 발생한다.

 

참고 사이트 : Android 개발할 맛 나게 해주는 친절한 Android 개발자 문서

 

bundletool  |  Android 개발자  |  Android Developers

Android App Bundle을 빌드한 후에는 Google Play에서 어떻게 Android App Bundle을 사용하여 APK를 생성하는지, APK가 기기에 배포되었을 때 어떻게 작동하는지 테스트해야 합니다. App Bundle을 두 가지 방식으로

developer.android.com

 

 

AndroidStudio Gradle 설정 후에는 Manifest 연동을 위해 반드시 동기화가 필요하다.

방법은 아주아주 간단하다.

 


gradle 설정 파일을 수정하면 파일 위쪽에 노랑색 알림줄이 표시 되는데,

우측 끝에 Sync Now 버튼을 클릭한다.

 

그럼 똑똑하게 알아서 동기화가 진행되고, 아래와 같이 뜨면 완료.

 

AndroidStudio 는 프로젝트 빌드 도구로 Gradle 을 사용한다.

Gradle 은 Groovy를 기반으로 한 오픈 소스 형태의 빌드 자동화 도구로 DSL을 스크립트 언어로 사용한다.
실행할 처리 명령들을 모아 만든 태스크 단위로 실행하며,
이전에 사용했던 태스크를 재사용하거나 다른 시스템의 태스크를 공유하는 빌드 캐시 기능을 지원하여 향상된 빌드 속도를 제공한다.

​AndroidStudio 에서 프로젝트를 생성하면 기본적으로 gradle 빌드 구성 파일을 포함한다.

 

Android 앱 모듈의 기본 프로젝트 구조 (출처 : Android 개발자 사이트 )

build.gradle(Module: app) 예시  코드
apply plugin: 'com.android.application' // 프로젝트 패키지명

android {

  compileSdkVersion 28 // API 28 이하 버전 지원

  buildToolsVersion "29.0.2" // SDK 29.0.2 버전으로 빌드

  defaultConfig {

    applicationId 'com.example.myapp' // 앱 고유 식별 ID
    minSdkVersion 15 // 최소 지원 API 버전
    targetSdkVersion 28 // 테스트 시 이용할 API 버전
    versionCode 1 // 앱 버전
    versionName "1.0" // 앱 버전 이름
  }
  buildTypes {
    debug { // 디버그용 빌드
        applicationIdSuffix ".debug" // 디버그용 빌드 시 앱 ID 변형
    }
    release {
        minifyEnabled true // 코드 축소 사용
        shrinkResources true // 리소스 축소 사용
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }

  productFlavors {
    free { // free 버전 빌드 변형
      applicationId 'com.example.myapp.free' // 빌드 변형 시 앱 고유 ID
      applicationIdSuffix ".free" // 위와 동일
    }

    paid { // paid 버전 빌드 변형
      applicationId 'com.example.myapp.paid' // 빌드 변형 시 앱 고유 ID
      applicationIdSuffix ".paid" // 위와 동일
    }
  }
}

dependencies {
    implementation project(":lib") // 로컬 라이브러리 모듈 종속 항목 추가

    implementation 'com.example.android:app-magic:12.3' // 원격 바이너리 종속 항목 추가
    implementation group: 'com.example.android', name: 'app-magic', version: '12.3' // 위와 동일

    implementation fileTree(dir: 'libs', include: ['*.jar']) // 로컬 바이너리 종속 항목 추가
    implementation files('libs/foo.jar', 'libs/bar.jar') // 위와 동일
}

 

AndroidStudio 에서 Project 하나를 빌드하면 apk 파일 하나가 생성 된다.

즉, Project = 앱을 의미한다.

하나의 Project는 기본적으로 다음과 같은 구조로 생성된다.

 

Android 앱 모듈의 기본 프로젝트 구조 (출처 :  Android 개발자 사이트 )

 

사용자 인터페이스를 결정하는 리소스 파일(res 폴더)들과 앱의 동작을 구현하는 자바 파일(java)을 비롯해,

앱의 전반적인 정보(앱의 이름, 액티비티 구성, 권한 등)를 정의하는 Manifest 파일,

그리고 빌드를 위한 Gradle 스크립트 파일(build.gradle, setting.gradle)로 구성 된다.

이렇게 구성된 Project를 빌드하면 스마트폰에서 앱을 설치하는 APK 파일, 즉 Android 애플리케이션 패키지가 생성 된다.

 

일반적인 Android 앱 모듈의 빌드 프로세스 (출처 :  Android 개발자 사이트 )

 

컴파일러는 소스 코드를 스마트폰에서 실행할 수 있는 바이트 코드를 포함한 DEX 파일로 변환하고,

그 외 파일은 컴파일된 리소스 파일로 변환한다.

APK 패키저는 DEX 파일과 컴파일된 리소스 파일을 하나의 APK 파일로 결합한다.

앱 배포를 위한 APK 생성 시에는 Keystore를 이용하여 전자 서명을 진행해야 한다.

+ Recent posts