# 바이너리

## **신규 바이너리** <a href="#apps-newbinary" id="apps-newbinary"></a>

서비스할 상품의 바이너리를 신규 등록하고, 지원 단말을 설정하는 메뉴입니다.\
해당 메뉴에 등록한 바이너리는 검증이 완료되면 '판매개시 옵션'에 따라 스토어에 서비스됩니다.

### **서명키 정보** <a href="#app-signing-preferences" id="app-signing-preferences"></a>

* 바이너리 유형 : 등록할 바이너리의 유형(AAB/APK)을 선택합니다.
  * APK를 선택한 경우 AAB로 변경할 수 있으나, AAB를 선택한 경우 바이너리 유형을 APK로 변경할 수 없습니다.
* 서명키 : 바이너리에 대한 서명 키 옵션을 선택합니다. 앱 서명에 대한 자세한 설명은 여기를 확인해주세요.
  * ONE store가 앱 서명키를 관리 보호\
    \- ONE store가 서명키를 직접 생성하고 저장합니다.\
    \- 기존 APK로 판매 중인 상품은 서명키가 달라지면 업데이트를 할 수 없기 때문에 신규 생성한 상품만 사용합니다.
  * 이 개발자 계정의 다른 앱과 동일한 키 사용\
    \- 다른 상품에서 서명키를 등록했다면, 해당 상품과 동일한 서명키를 사용합니다.\
    \- 계정 내 다른 상품의 서명키만 연결 가능하며, 다른 상품과 연동 등이 필요한 경우 사용합니다.
  * Java Keystore의 키 내보내기 및 업로드, 키 내보내기 및 업로드(Java Keystore를 사용하지 않음)\
    \- 직접 생성한 서명키를 등록하고 사용합니다.\
    \- 생성한 서명키를 PEPK(Play Encrypt Private Key) 툴을 통해 암호화하여 ONE store에 안전하게 전송 및 저장합니다.
  * 앱 서명 사용 안함(서명키를 등록하지 않고 서명한 APK를 등록합니다.)\
    \- 키를 등록하거나 생성하지 않고 개발자가 직접 관리합니다.\
    \- 앱 서명을 사용하지 않는 경우, 서명한 APK를 등록해야 합니다.\
    ※  바이너리 유형이 APK인 경우에만 선택 가능합니다.

<figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FYGL1bftQpAQ1C2qTAB87%2Fimage.png?alt=media&#x26;token=90e7c178-c804-4864-ba88-1c998828e477" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
'멀티 바이너리'를 통해 지원 단말별로 다른 바이너리를 제공할 수 있습니다.\
&#x20;\- 바이너리 유형이 'APK'이고, 서명키 옵션이 '앱 서명 사용 안함'인 경우에만 지원합니다.\
&#x20;\- '대한민국 외 다른국가'에서는 '멀티 바이너리'를 지원하지 않습니다.
{% endhint %}



*   신규 바이너리 업데이트

    * 바이너리 유형(APK/AAB)에 맞는 바이너리 파일을 최대 2GB까지 등록할 수 있습니다.
      * 상용 바이너리가 있는 경우 동일한 서명키를 사용한 바이너리를 등록합니다.
      * 바이러스 검사, 패키지 네임 중복 여부, 서명키, 버전 코드 등을 검사하고 이상이 있을 경우 등록에 실패합니다.
    * 바이너리를 업데이트는 아래의 2가지 방법이 있습니다.
      * &#x20;'신규 바이너리 업로드'영역에서 '파일찾기' 클릭
      * 바이너리 목록에서 바이너리 버전 옆의 '업데이트'버튼 클릭 후 '파일 업데이트'선택



    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FB7YChaIZEDBcpqSr6W2V%2Fimage.png?alt=media&#x26;token=4f31eee3-5fdf-4cf6-9c47-7e20af6bbbd2" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
- AAB 상품은 minSdkVersion을 21 이상으로 등록하셔야 합니다.
- 글로벌 플랫폼에 서비스하는 경우 '[글로벌 플랫폼 판매를 위한 최소 요구사항](#global-req)'을 확인해 주세요.
{% endhint %}

{% hint style="info" %}
AAB 상품인 경우 versionCodeMajor를 사용할 수 없습니다. versionCodeMajor를 사용하는 경우 바이너리 유형을 APK로 등록해주세요.
{% endhint %}

{% hint style="info" %}
AAB 파일 자체는 2GB를 초과하지 않더라도, 범용 APK를 생성할 경우 파일 크기가 2GB를 초과할 수 있습니다. &#x20;

* 이 경우 AAB를 지원하지 않는 일부 단말에서는 범용 APK가 설치되지 않거나 실행 중 문제가 발생할 수 있습니다. &#x20;
* AAB만 등록하더라도, 범용 APK에 대한 빌드 및 설치 테스트를 함께 진행하여, AAB 미지원 단말에서의 호환성을 사전에 확인하는 것을 권장합니다.
{% endhint %}

### **바이너리** <a href="#binary" id="binary"></a>

*   등록한 바이너리의 세부정보를 확인할 수 있습니다.

    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2F5owfChyZyUHNQBCpDSFZ%2Fimage.png?alt=media&#x26;token=1a54bc01-bab0-49c4-9ecd-6bf0ee62834d" alt=""><figcaption></figcaption></figure>
* 지원 단말 리스트
  * 신규 단말 추가 시 지원 단말로 적용하기 : 해당 항목을 체크하면 새로운 단말이 출시되어 지원 단말 리스트에 추가될 경우 지원 상태가 'ON'으로 자동 설정됩니다.&#x20;
  * 단말의 RAM 용량으로 지원 제외하기 : 상품을 서비스하기에 적합하지 않은 RAM 용량의 단말을 지원하지 않도록 설정할 수 있습니다.&#x20;
  * 단말 리스트 : 서비스 가능한 단말 리스트가 제공되며, 상품이 지원하지 않는 단말은 미지원(OFF)할 수 있습니다.
    * 바이너리 파일 등록 시 자동적으로 지원되는 모든 단말에 상품이 판매되며 만약 특정 단말에만 판매를 원할 경우 프로비저닝 정보 및 지원 단말을 수정할 수 있습니다.
      * 'manifest.xml'의 해상도/OS version을 기준으로 지원 단말 리스트가 기본 구성됩니다.
      * 단말 리스트에 없는 안드로이드 단말은 '기타단말(ANDROID-ETC)'를 통해 지원 여부를 설정할 수 있습니다.
      * '신규 바이너리' 메뉴는 지원 단말을 변경하더라도 판매중인 상품에는 영향을 주지 않으며, 검증 완료 되었을 때 반영됩니다.
  * 바이너리 유형이 APK인 경우
    *   서명된 APK 다운로드 : 앱 서명을 한 바이너리를 다운로드 해 테스트할 수 있습니다.\


        <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FA2SXMvxgaaJG8Ezc8QdA%2Fimage.png?alt=media&#x26;token=90dd9afb-fd7c-4d2b-b4e4-7756ecff50aa" alt=""><figcaption></figcaption></figure>
  * 바이너리 유형이 AAB인 경우
    * 범용 APK 다운로드 : AAB를 지원하지 않는 단말의 사용자에게는 '범용 APK'를 서비스합니다. '범용 APK 다운로드'를 통해 상품을 테스트할 수 있습니다.
    * 상세정보 : 사용자의 단말로부터 수집 된 정보를 json파일로 다운로드할 수 있습니다.
      * 지원 ABI, SDK 버전, Device Feature, 화면 밀도 정보를 제공합니다.
    * 다운로드 : 안드로이드 버전과 언어 정보가 표시되며, 선택한 정보로 추출한 APK 파일을 다운로드 받을 수 있습니다.
      * 언어는 복수 선택이 가능하며, 앱에서 지원하지 않는 언어를 선택할 경우 비어있는 APK가 다운로드됩니다.
      *   다운로드 받은 APK를 통해 단말별로 개발자 테스트 후 지원 단말을 설정할 수 있습니다.\


          <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FfQJZ5DFxohlE96cdhSn4%2Fimage.png?alt=media&#x26;token=856fbaff-9368-4ccb-ab11-78cfa1fa224a" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
판매중인 상품의 지원 단말을 OFF로 설정할 경우 해당 단말을 이용하는 구매자는 재다운로드가 불가능합니다. 이 경우 환불 처리가 필요하므로 지원 단말 변경 시 주의가 필요합니다.
{% endhint %}



*   서명 키 정보

    * 서명 키 : 사용자 단말로 배포하기 위한 서명에 사용되는 키입니다.
    * 업로드 키 : 바이너리 등록 시 개발자의 신원을 확인하기 위해 사용되는 키입니다.
      * 바이너리 업데이트 시 동일한 업로드 키로 서명 된 파일만 등록 가능합니다.
    * '다운로드' 버튼을 통해 '서명 키', '업로드 키'의 공개키 정보를 der 파일로 다운로드합니다.

    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FXf1eK2WsYE3RMVosvYJj%2Fimage.png?alt=media&#x26;token=5d503bc1-4b89-4acd-aed5-b3ea911de12a" alt=""><figcaption></figcaption></figure>

신규 바이너리

PC 환경용으로 제작된 EXE 바이너리를 등록하는 메뉴입니다.

* 신규 바이너리 업로드
  * 2GB 이하, 파일명 100자 이하의 EXE 파일을 업로드할 수 있습니다.
  * 등록된 바이너리는 '검증요청' 에 따른 승인이 진행된 이후 서비스에 반영되며 이때 '상용 바이너리'에 해당 정보가 반영됩니다. 단, APK상품과 PC 상품 중 하나라도 검증 요건에 미흡한 경우 검증이 반려될 수 있습니다.
  * 결제 적용을 위해서는 개발자센터 내 '[문의하기](https://dev.onestore.net/devpoc/support/help/technologyForm.omp)' 또는 devhelper@onestore.net로 연락 주시기 바랍니다.



## 대한민국 외 다른 국가/지역 판매를 위한 최소 요구사항 <a href="#global-req" id="global-req"></a>

* In-app 적용 상품인 경우
  * IAP SDK v19 이상(신규 앱은 v21 이상)
  * 바이너리 업로드 시 '서명키 옵션'을 '앱 서명 사용(권장)'으로 설정
* ALC 적용 상품인 경우
  * ALC SDK v2 이상
  * 바이너리 업로드 시 '서명 키 옵션'을 '앱 서명 사용(권장)'으로 설정
* 멀티 바이너리 상품은 판매 불가
  * 멀티 바이너리 상품은 단일 바이너리로 변경



## **유의사항** <a href="#apps-whenthe-blockedbyplayprotect-pop-upoccursduringinstallation" id="apps-whenthe-blockedbyplayprotect-pop-upoccursduringinstallation"></a>

### **'Google Play 프로텍트 - 안전하지 않은 앱 차단됨' 발생 시** <a href="#unsafe-app-blocked" id="unsafe-app-blocked"></a>

Android OS에 따라 설치하려는 앱의 targetSdkVersion이 낮은 경우 '안전하지 않은 앱 차단됨' 팝업이 발생할 수 있습니다.

<figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FHqZWq4SONDKmeM6OqE7O%2Fimage.png?alt=media&#x26;token=cae8c9ac-d721-4d3a-9912-95c7a44817a7" alt=""><figcaption></figcaption></figure>

이 경우 targetSdkVersion을 33 이상으로 타겟팅하여 앱을 업데이트해야 합니다. \
자세한 Android 정책은 '[여기](https://support.google.com/googleplay/android-developer/answer/11926878)'에서 확인해 주세요.



### **설치 시 'Play 프로텍트에 의해 차단됨' 팝업 발생 시** <a href="#id-play" id="id-play"></a>

Google Play에 유통된 적이 없는 패키지 네임의 상품을 원스토어에 유통할 경우, 'Play 프로텍트에 의해 차단됨' 팝업을 노출시켜 설치가 차단되는 사례가 발생되고 있습니다.

<figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2F9rQJhSJpcIJRhIkxGCLV%2Fimage.png?alt=media&#x26;token=18c01117-ec28-4bf9-82ac-899644ca5e93" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FSjssTOt4KO5vlXpl5aJg%2Fimage.png?alt=media&#x26;token=a4cbcea3-ac8a-44d8-b222-f1f83675a9ea" alt="" width="188"><figcaption></figcaption></figure>

Google Play와 패키지 네임 또는 서명 키를 다르게 빌드하여 판매하는 경우에 발생하며 사전에 Google에 소명하여 설치가 차단되지 않도록 처리하시기 바랍니다.

* Google 소명 링크 : [https://support.google.com/googleplay/android-developer/answer/2992033](https://support.google.com/googleplay/android-developer/answer/2992033)

\
이 현상으로 앱을 설치하지 못하고 있다면, 다음과 같이 설치하도록 가이드 할 수 있습니다.

1. 'Play 스토어' 앱 실행
2. 우측 상단의 프로필 선택 > 'Play 프로텍트' 메뉴 선택
3. 우측 상단 '설정'아이콘 선택
4. 'Play 프로텍트로 앱 검사' 항목을 'OFF'로 변경
5. 스토어 재 진입하여 해당 앱 다운로드 후 설치

\


### **Target SDK를 30 이상(OS 11 이상) 으로 설정 시** <a href="#id-targetsdk-30-os11" id="id-targetsdk-30-os11"></a>

현재 일부 게임 엔진(Unity, Unreal 등)에서 Target SDK 30 level을 지원하고 있지 않습니다.\
원스토어는 Target SDK를 30으로 현재 기준 강제 하지 않으므로 개발 환경을 고려하여 서비스 이용에 참고 부탁 드립니다.

사용자는 Android 11을 실행하는 기기에서 APK 서명 체계 v1만 사용하여 서명한 앱을 설치하거나 업데이트할 수 없습니다. \
따라서 현재 APK 서명 체계 v1만 사용하여 서명한 Android 11(API 수준 30)을 타겟팅하는 앱도 APK 서명 체계 v2 이상을 사용하여 서명해야 합니다.

Target SDK=30 으로 설정한 상품에 한해(Target SDK=30 미만으로 설정된 상품은 적용 대상이 아닙니다.)\
기존 원스토어 SDK(In-app v16, v17, v19, ALC) 가 적용되어 있는 바이너리의 경우 \
Androidmanifest.xml 항목에 아래 query 를 반드시 선언해주시기 바랍니다.

```java
<queries>
    <intent>
        <action android:name="com.onestore.ipc.iap.IapService.ACTION" />
    </intent>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="onestore" />
    </intent>
</queries>
```



#### **빌드 환경 별 대응 추가 안내**

* Android platform으로 개발되는 앱이 원스토어 인앱을 사용할 경우, Android 11 \<queries> 요소를 사용하기 위해서는 아래의 작업이 필요합니다.
  * Java & Kotlin (Android Studio)
    * TargetSDK를 16\~29로 설정한 경우, \<queries> TAG 필요 없음
    * TargetSDK를 30 적용 시 Android Manifest에 \<queries> TAG추가
* Unity
  * 2018.4 미만
    * TargetSDK를 30 미만으로 설정하여 \<queries> TAG 필요 없도록 함
  * 2018.4 이상 \~ 2020.1 미만
    * TargetSDK를 16\~29로 설정한 경우, \<queries> TAG 필요 없음
  * TargetSDK를 30으로 설정한 경우, Unity Engine의 Gradle 버전을 5.6.4 이상으로 올린 후 \<queries> TAG 추가
  * 참고 링크 : [https://developers.google.com/ar/develop/unity/android-11-build](https://developers.google.com/ar/develop/unity/android-11-build)
  * 2020.1 이후
    * TargetSDK를 16\~29로 설정한 경우, \<queries> TAG 필요 없음
    * TargetSDK 30 적용 시 Android Manifest에 \<queries> TAG추가 &#x20;
* Unreal
  * Target SDK 16\~29로 적용 (추후 가이드 예정)
* 기타 빌드 환경
  * 빌드 환경의 Gradle 버전 지원 여부에 따라 Target SDK를 설정
  * 빌드 환경이 Gradle 5.6.4를 지원하지 못할 경우 : TargetSDK 16\~29 사이로 설정
  * 빌드 환경이 Gradle 5.6.4를 지원할 경우 : TargetSDK 30 적용 후, Android Manifest에 \<queries> TAG추가

\


### **Target SDK 를 31 이상(OS 12 이상) 으로 설정 시** <a href="#id-targetsdk-31-os12" id="id-targetsdk-31-os12"></a>

Target SDK를 31 이상(OS 12)으로 설정한 앱에서 intent filter를 사용하지만 android:exported 속성을 명시적으로 선언하지 않으면 설치되지 않는 현상이 발생할 수 있습니다.

아래 예시 코드와 Android OS 12 이상의 동작 변경사항을 참고하여 개발해주시기 바랍니다.

```java
<service android:name="com.example.app.backgroundService"
         android:exported="false">
    <intent-filter>
        <action android:name="com.example.app.START_BACKGROUND" />
    </intent-filter>
</service>
```

\
Android OS 이상 동작 변경 사항 : [https://developer.android.com/about/versions/12/behavior-changes-12](https://developer.android.com/about/versions/12/behavior-changes-12)\


## **상용 바이너리** <a href="#apps-publishedbinary" id="apps-publishedbinary"></a>

현재 판매중인 바이너리 정보 및 지원 단말 정보 등을 확인할 수 있는 메뉴입니다.\
상용 바이너리의 다운로드 및 지원 단말 수정이 가능하며, 검증 절차 없이 실시간 반영됩니다.\
그 외 정보의 수정은 '신규 바이너리' 메뉴를 통해 검증 후 배포되어야 합니다.

