From b713771472cc394aa3c18ff7c507d9ccea15b6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=99=EB=A6=BC?= <63008138+hfjxjjd123@users.noreply.github.com> Date: Wed, 21 Dec 2022 21:56:15 +0900 Subject: [PATCH 1/4] =?UTF-8?q?12=EC=9B=94=20=EB=AA=A8=EB=B0=94=EC=9D=BC?= =?UTF-8?q?=20=EB=B8=94=EB=A1=9C=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 + .idea/gdsc-university-of-seoul.github.io.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .../2022-12-21-how-to-release-mobile-app.md | 197 ++++++++++++++++++ .../post-release-mobile-app/appmarket.jpg | Bin 0 -> 26116 bytes 6 files changed, 223 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/gdsc-university-of-seoul.github.io.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 _posts/2022-12-21-how-to-release-mobile-app.md create mode 100644 assets/images/post-release-mobile-app/appmarket.jpg diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..26d33521af --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/gdsc-university-of-seoul.github.io.iml b/.idea/gdsc-university-of-seoul.github.io.iml new file mode 100644 index 0000000000..d6ebd48059 --- /dev/null +++ b/.idea/gdsc-university-of-seoul.github.io.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..33412bb382 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/_posts/2022-12-21-how-to-release-mobile-app.md b/_posts/2022-12-21-how-to-release-mobile-app.md new file mode 100644 index 0000000000..c12f3764d2 --- /dev/null +++ b/_posts/2022-12-21-how-to-release-mobile-app.md @@ -0,0 +1,197 @@ +--- +layout: post +title: "모바일 앱 배포하는 법" +authors: [hfjxjjd123] +tags: ["모바일 앱", "모바일 배포", "모바일 출시", "배포", "배포방식", "release build","Android","iOS"] +image: assets/images/post-release-mobile-app/appmarket.jpg +description: "모바일 앱 배포하는 법" +featured: true +--- + +# 배포란? +배포를 알아보기 전에 개발의 전반적인 맥락을 생각해보자. + +개발자가 프로그래밍 할 때, 최종 목적이 무엇일까? +자신이 개발한 프로그램을 사람들이 쓰게하는 것이 아닐까? + +개발자가 로컬환경에서 코딩 / 빌드 / 디버깅을 통해 프로그램을 완성했다면, +이제 완성된 프로그램을 다른 사람에게 나눠주고 싶을 것이다. +이렇게, 완성된 프로그램을 사용자가 접근할 수 있는 환경에 배치하는 과정을 배포과정이라고 한다. + +
+ +# 배포방식 +배포방식에는 크게 Google Play, App Store와 같은 **앱 마켓플레이스**를 이용한 배포와 그 외의 **대체 배포방식**으로 나눌 수 있다. +참고로 IOS 기기는 앱 마켓플레이스를 이용한 다운로드만 가능하다. + +두 방식 모두 출시용 앱을 배포해야 하므로 공통적으로 **release bulid**(배포용 빌드)를 거치게 된다. + +이 글에선 대체 배포방식에 대해서 가볍게 알아보고, +마켓플레이스에 배포하기 위해 **배포용 빌드 및 테스트 과정**에서 신경써야 할 부분들을 정리해봤다. + +
+ +# 🌐 대체 배포방식 (Android) + +## 1. 이메일을 통한 앱 배포 +앱을 출시하는 가장 쉽고 빠른 방법이다. + +이메일에 첨부된 출시용 앱을 사용자가 Android 기기에서 열면 Android 시스템이 APK를 인식해서 앱을 설치할 수 있게 한다. +다만 설치를 위해선 기기 설정에서 '출처를 알 수 없는 앱 설치' 설정을 해야 한다. + +이메일을 통한 앱 배포는 적은 수의 신뢰할 수 있는 사용자에게 전송하는 경우 편리하지만, 불법 복제와 무단 배포를 차단하기 어렵다. + +
+ +## 2. 웹사이트를 통한 배포 +웹사이트 또는 서버(개인/기업용 서버 등)에서도 앱을 다운로드하도록 제공할 수 있다. + +출시용 APK 파일을 호스팅하고 사용자에게 다운로드 링크를 제공하면 된다. +마찬가지로 '출처를 알 수 없는 앱 설치' 설정이 되어 있어야 한다. + +
+ +# 🌐 Google Play에 배포하기 (Android) + +## ✔️ 런처 아이콘 추가하기 +상표와 같이 사용되는 앱 고유의 아이콘 이미지를 추가한다. + +
+ +## ✔️ Java keystore를 이용한 앱 서명 + +Java JDK에 `keystore` 파일을 생성한다. + +`keystore` 참조에 관한 정보를 담은 `.properties` 파일을 프로젝트 경로에 추가한다. + +Gradle에서 서명을 구성하기 위해서, `build.gradle` 파일을 수정하여 `.properties` 파일로부터 `keystore` 정보를 가져올 수 있도록 한다. + +``` +* keystore: 인증서 & 암호화에 사용되는 보안 인증서(개인키 등등)를 저장하는 공간이다. +* .properties: 응용 프로그램에서 쓰이는 파라미터들을 저장(ex:language = English)하기 위한 파일의 확장자 +* Gradle: 빌드 자동화 시스템(compile, test, packaging 등의 빌드 작업을 자동으로 수행) +* build.gradle: 파일을 빌드할 때 필요한 정보를 저장하는 공간 +``` + +
+ +## ✔️ ProGuard 사용 + +`ProGuard`의 규칙을 명시한 `.pro` 파일을 만들어서 `ProGuard`를 적용할 때 쓸 규칙을 추가한다. + +Gradle에서 `ProGuard`를 구성하기 위해, `build.gradle` 파일을 수정하여 Release Build 할 때 `ProGuard`의 규칙이 적용되도록 한다. + +``` +* ProGard: 자바 코드를 최적화하고 난독화하는 도구이다.  + 바이트코드(컴파일 된 코드) 최적화 및 사용하지 않는 명령어 감지, 난독화 기능으로 아이디어 & 알고리즘 숨김 + 안드로이드 SDK의 한 부분으로 배포되며 Release Build 과정에서 실행된다. +``` + +
+ +## ✔️ 앱 manifest 검토하기 +Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수정보를 담고있는 `manifest` 파일(`.xml`)을 검토하여 올바른 값을 포함하고 있는지 확인한다. + +
+ +## ✔️ 빌드 구성 검토하기 +올바른 빌드 구성을 위하여 `build.gradle` 파일을 검토하고 올바른 값들을 포함하는지 확인한다. + +
+ +## ✔️ 앱 번들 빌드하기(추천) +규칙에 따라 구성한 앱의 코드와 리소스를 서명된 AAB(안드로이드 앱 번들)로 빌드한다. +(안드로이드 스튜디오, 커맨드 창 등 이용) + +``` +* APK: 안드로이드 응용 프로그램 패키지(프로그램 압축파일) +* AAB: 앱의 모든 컴파일된 코드 및 리소스를 포함하며 APK 생성 및 서명을 Google Play에 맡기는 게시 형식, + 각 기기 설정에 맞게 최적화된 APK를 Google Play가 생성해서 제공 +``` + +
+ +## ✔️ 앱 번들 테스트하기 +방법1: 번들 도구를 이용한 오프라인 테스트 +`GitHub`에서 `bundletool`을 다운받는다. +앱 번들로부터 APK 세트를 생성한다. +연결된 기기로 APK를 배포한다. + +방법2: 구글 플레이를 이용한 온라인 테스트 + +테스트 할 번들을 구글 플레이에 업로드한다. +내부 테스트 트랙을 사용하거나, 알파 or 베타 채널로 프로덕션 배포 이전에 테스트한다. + +
+ +## ✔️ Google Play 스토어에 출시하기 +`Play Console`에서 앱을 등록한다. + +앱 정보를 설정한다(예: 로그인 유무 설정, 연령 설정 등). + +스토어에 등록될 정보들을 설정한다(예: 연락처, 앱 카테고리, 앱 사진 등). + +프로덕션 탭에서 앱과 AAB를 등록해서 프로덕션 버전을 만든다. + +프로덕션 트랙으로 출시하면 Google의 심사를 거쳐 출시된다. + +``` +* Play Console: Google Play 앱 관리, 테스트 및 개선 기능 등을 제공하는 서비스 +``` + +
+ +# 🌐 App Store에 배포하기 (iOS) + +## ✔️ 번들 ID 등록하기 +iOS 개발자 계정에서 새로운 Apple 번들 ID를 만든다(개발자 계정 App IDs에서). + +앱 서비스 정보를 입력한 후 번들 ID를 등록한다. + +`App Store Connect`에서 앱 정보, 번들 ID를 입력하여 앱 레코드를 생성한다. + +``` +* App Store Connect: App Store에서 판매하는 앱을 제출하고 관리하는 데 사용하는 웹 기반 도구 모음 +``` + +
+ +## ✔️ Xcode 프로젝트 설정하기 + +`Xcode`를 열고 (프로젝트) > General 탭에서 버전, 빌드, 적합 UI 설정 등의 정보를 입력한다. + +project editor에서 런치 스크린을 설정한다. + +usage description을 명시한다. +``` +* launch screen(= splash screen): 앱이 실행 시작될 때 즉시 나타났다 바뀌는 화면 +* usage description: 앱(달력, 연락처 등)이나 자원(카메라, 마이크 등)에 대한 접근여부를 기술해놓은 것 +``` + +
+ +## ✔️ 앱 아이콘 추가하기 +App Store에서 보여질 앱 고유의 아이콘 이미지를 추가한다. + +
+ +## ✔️ 빌드 아카이브 생성 및 업로드하기 +`Xcode`에서 배포용 빌드로 빌드한다. + +Product > Archive 탭에서 배포용 빌드된 앱의 유효성을 검사한다(by `Validate App`). + +배포용 빌드된 아카이브를 App Store Connect에 업로드한다(by `Distribute App`). + +
+ +## ✔️ TestFilght에 앱 배포하기 +빌드된 앱을 테스트해보기 위해서 `TestFilght`를 사용할 수 있다. +``` +* TestFilght: 모바일 앱(iOS)의 무선 설치 및 테스트를 위한 온라인 서비스 + 내부/외부 테스터에게 빌드를 보내서 앱을 테스트해 볼 수 있다. +``` + +
+ +## ✔️ 앱스토어에 앱 출시하기 +`App Store Connect`를 통해 제출하게 되면 Apple의 심사를 거쳐 출시된다. \ No newline at end of file diff --git a/assets/images/post-release-mobile-app/appmarket.jpg b/assets/images/post-release-mobile-app/appmarket.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec369845e9c25726da1f249bf16ce51b048c5c49 GIT binary patch literal 26116 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 literal 0 HcmV?d00001 From e143cc4c8a9ecd5465d94ace598937176b09cd80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=99=EB=A6=BC?= <63008138+hfjxjjd123@users.noreply.github.com> Date: Mon, 2 Jan 2023 08:42:34 +0900 Subject: [PATCH 2/4] Update 2022-12-21-how-to-release-mobile-app.md --- _posts/2022-12-21-how-to-release-mobile-app.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2022-12-21-how-to-release-mobile-app.md b/_posts/2022-12-21-how-to-release-mobile-app.md index c12f3764d2..b0c1e81ccc 100644 --- a/_posts/2022-12-21-how-to-release-mobile-app.md +++ b/_posts/2022-12-21-how-to-release-mobile-app.md @@ -67,7 +67,7 @@ Java JDK에 `keystore` 파일을 생성한다. Gradle에서 서명을 구성하기 위해서, `build.gradle` 파일을 수정하여 `.properties` 파일로부터 `keystore` 정보를 가져올 수 있도록 한다. ``` -* keystore: 인증서 & 암호화에 사용되는 보안 인증서(개인키 등등)를 저장하는 공간이다. +* keystore: 인증서 & 암호화에 사용되는 보안 인증서(개인키 등등)를 저장하는 공간 * .properties: 응용 프로그램에서 쓰이는 파라미터들을 저장(ex:language = English)하기 위한 파일의 확장자 * Gradle: 빌드 자동화 시스템(compile, test, packaging 등의 빌드 작업을 자동으로 수행) * build.gradle: 파일을 빌드할 때 필요한 정보를 저장하는 공간 @@ -82,9 +82,9 @@ Gradle에서 서명을 구성하기 위해서, `build.gradle` 파일을 수정 Gradle에서 `ProGuard`를 구성하기 위해, `build.gradle` 파일을 수정하여 Release Build 할 때 `ProGuard`의 규칙이 적용되도록 한다. ``` -* ProGard: 자바 코드를 최적화하고 난독화하는 도구이다.  +* ProGaurd: 자바 코드를 최적화하고 난독화하는 도구  바이트코드(컴파일 된 코드) 최적화 및 사용하지 않는 명령어 감지, 난독화 기능으로 아이디어 & 알고리즘 숨김 - 안드로이드 SDK의 한 부분으로 배포되며 Release Build 과정에서 실행된다. + 안드로이드 SDK의 한 부분으로 배포되며 Release Build 과정에서 실행 ```
From 53b68043d9d69f4c86e7d9c8aa5ca5127d7516b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=99=EB=A6=BC?= <63008138+hfjxjjd123@users.noreply.github.com> Date: Tue, 3 Jan 2023 10:14:15 +0900 Subject: [PATCH 3/4] Update 2022-12-21-how-to-release-mobile-app.md --- _posts/2022-12-21-how-to-release-mobile-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2022-12-21-how-to-release-mobile-app.md b/_posts/2022-12-21-how-to-release-mobile-app.md index b0c1e81ccc..e4a05e7c4a 100644 --- a/_posts/2022-12-21-how-to-release-mobile-app.md +++ b/_posts/2022-12-21-how-to-release-mobile-app.md @@ -82,7 +82,7 @@ Gradle에서 서명을 구성하기 위해서, `build.gradle` 파일을 수정 Gradle에서 `ProGuard`를 구성하기 위해, `build.gradle` 파일을 수정하여 Release Build 할 때 `ProGuard`의 규칙이 적용되도록 한다. ``` -* ProGaurd: 자바 코드를 최적화하고 난독화하는 도구  +* ProGuard: 자바 코드를 최적화하고 난독화하는 도구  바이트코드(컴파일 된 코드) 최적화 및 사용하지 않는 명령어 감지, 난독화 기능으로 아이디어 & 알고리즘 숨김 안드로이드 SDK의 한 부분으로 배포되며 Release Build 과정에서 실행 ``` From 59f6cf5536cc55919a5724f2e4b9b3603e31d8e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=99=EB=A6=BC?= <63008138+hfjxjjd123@users.noreply.github.com> Date: Tue, 14 Feb 2023 14:58:48 +0900 Subject: [PATCH 4/4] =?UTF-8?q?remove=20.idea=ED=8C=8C=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 --- .idea/gdsc-university-of-seoul.github.io.iml | 9 --------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 26 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/gdsc-university-of-seoul.github.io.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521af..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/gdsc-university-of-seoul.github.io.iml b/.idea/gdsc-university-of-seoul.github.io.iml deleted file mode 100644 index d6ebd48059..0000000000 --- a/.idea/gdsc-university-of-seoul.github.io.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 33412bb382..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfbb..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file