Android Studio Project를 이용하여 개발할 때 Com2uS 개별모듈을 포팅하는 방법과 빌드하는 방법을 안내합니다.
본 가이드는 Android Studio 3.2 버전을 기준으로 안내합니다.
포팅하기
Android 개발 환경을 이용한다면 개별모듈을 플러그인의 형태로 Android 개발 환경에 포팅해 주세요. 다음의 안내대로 개별모듈을 개발 환경에 추가하고 필요한 설정 작업과 코드 작업을 수행하세요.
프로젝트 생성하기
- Android Studio Project를 실행하세요.
- Start a new Android Studio project를 클릭해 신규 프로젝트를 생성하세요. 기존에 생성한 프로젝트가 있다면 그대로 사용할 수 있습니다.
AndroidX 적용하기
AndroidX를 적용하려면 먼저 모듈별 지원 버전을 확인하세요.
- ModuleManager v2.5.15
- ActiveUser v2.9.3
- Mercury v2.13.1
- HivePromotion v4.4.2 (C2S.19.0.1+)
- Push v3.6.3
- InApp v2.16.5
- InAppV4 v14.5.0
- Peppermint v2.8.2
위에 언급한 버전 또는 이후 버전을 사용 중이라면 Android Support Library 버전을 업데이트하면서 AndroidX를 여러분의 프로젝트에 적용해야 합니다. 아래 순서대로 AndroidX를 적용하세요.
- Android Studio를 실행합니다.
- 메뉴 바에서 Refactor > Migrate to AndroidX를 실행합니다.
- 프로젝트 내 Android support library 참조가 변경되고 gradle.properties에 아래 항목이 추가됩니다.
- android.enableJetifier=true
- android.useAndroidX=true
개별모듈 추가하기
Android Studio 프로젝트에 포팅하는 개별모듈은 Hive 개발자 사이트에서 다운로드한 개별모듈 압축 파일에 포함되어 있습니다.
공통 적용
- ModuleManager-2.x.x.aar
- ActiveUser-2.x.x.aar
- Peppermint-2.x.x.aar
- Offerwall-2.x.x.aar
- Push-3.x.x.aar
- hive-core-x.x.x.aar (C2S.18.4+)
- hive-protocol-x.x.x.aar (C2S.18.4+)
- hive-base-x.x.x.aar (C2S.18.4+)
- hive-ui-x.x.x.aar (C2S.19.0.1+)
- hive-repayment-.x.x.x.aar (C2S.19.3+)(C2S.19.4-)
- universalimageloader-release.aar
- YouTubeAndroidWebPlayerApi.aar
- YouTubeAndroidPlayerApi.jar
- Unity 전용 라이브러리
- ActiveUserPlugin.aar
- MercuryUnityPlugin.aar
- OfferwallUnityPlugin.aar
- InAppUnityPlugin.aar
- QQ 로그인 지원 시 추가
- open_sdk_r2973327_lite.jar (C2S.19.2-)
- open_sdk_3.5.4.11_r3f56456_lite.jar (C2S.19.2+)
- Huawei 로그인 지원 시 추가
- Peppermint_Social_Plugin_Huawei-2.x.x.aar
프로모션 기능 지원
- 개별모듈 Promotion 1.0 지원 시 추가
- Mercury-2.x.x.aar
- 개별모듈 Promotion 2.0 지원 시 추가 (C2S.19.0.1+)
- HivePromotion-4.x.x.aar
- HivePromotionUnityPlugin.aar (Unity 개발 환경 시)
Google Play Store를 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- InAppLibrary-googleplay-2.x.x.aar 혹은 InAppLibrary-inappAll-2.x.x.aar
- IAP v4(InAppV4) 지원 시 추가
- hive-iapv4-x.x.x.aar
- hive-iapv4-plugin-x.x.x.aar
Hive Lebi를 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- InAppLibrary-lebi-2.x.x.aar 혹은 InAppLibrary-inappAll-2.x.x.aar
- InAppC2SSecurity.jar
- alipaySdk-15.6.8-20191021122514.aar
- WeChatPay 지원 시 추가
- wechat-sdk-android-with-mta_5.0.8.jar
- IAP v4(InAppV4) 지원 시 추가
- hive-iapv4-x.x.x.aar
- hive-iapv4-plugin-x.x.x.aar
- WeChatPay 지원 시 추가
- wechat-sdk-android-with-mta_5.0.8.jar
(C2S.19.1부터 build.gradle에 추가하는 방법을 개별로 가이드)
- wechat-sdk-android-with-mta_5.0.8.jar
ONE store를 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- InAppLibrary-tstore-2.x.x.aar 혹은 InAppLibrary-inappAll-2.x.x.aar
- ONE store V4 결제 지원 시 추가
- InAppTstoreSDKv4-16.06.00_20201007.jar
- ONE store V5 결제 지원 시 추가
- InAppTstoreSDKv5-17.03.00_20201007.jar
- IAP v4(InAppV4) 지원 시 추가
- hive-iapv4-x.x.x.aar
- hive-iapv4-plugin-x.x.x.aar
- ONE store V4 결제 지원 시 추가 (C2S.19.2+)
- InAppTstoreSDKv4-16.06.00_20201007.jar
- ONE store V5 결제 지원 시 추가 (C2S.19.1-)
- InAppTstoreSDKv5-17.03.00_20201007.jar
- ONE store V6 결제 지원 시 추가 (C2S.19.1+)
- onestore_iap_sdk-v19.00.01.aar
Amazon Market을 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- in-app-purchasing-2.0.76.jar
- C2S.19.1부터 C2S.19.3 미만 버전은 hive-iapv4-x.x.x.aar에 포함되어 별도 추가 필요 없음
- C2S.19.3부터 hive-iapv4-x.x.x.aar에서 제외되어 추가 필요
- 기존 InAppAmazonSDK.jar를 제거
- in-app-purchasing-2.0.76.jar
- Amazon 푸시 지원 시 추가
- amazon-device-messaging-1.0.1.jar
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- IAP v4(InAppV4) 지원 시 추가
- hive-iapv4-x.x.x.aar
- hive-iapv4-plugin-x.x.x.aar
- Amazon 결제 지원 시 추가
- in-app-purchasing-2.0.76.jar
- 기존 InAppAmazonSDK.jar를 제거
- Amazon 푸시 지원 시 추가
- amazon-device-messaging-1.0.1.jar
Galaxy Store를 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- InAppLibrary-galaxystore-2.x.x.aar 혹은 InAppLibrary-inappAll-2.x.x.aar
- Galaxy Store 결제 지원 시 추가
- SamsungInAppPurchase_5.1.0.aar
Huawei Market을 지원
- IAP v1(InAppLibrary) 지원 시 추가 (C2S.19.1-)
- InAppLibrary-huawei-2.x.x.aar
- IAP v4(InAppV4) 지원 시 추가
- hive-iapv4-x.x.x.aar
- hive-iapv4-plugin-x.x.x.aar
AndroidManifest.xml 설정하기
AndroidManifest.xml에 다음의 항목을 직접 입력해 주세요.
- 개별모듈 설정
- 아래 내용은 각 모듈에 공통으로 필요합니다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374<manifest><application ...><!-- ActiveUser Start --><activityandroid:name="com.com2us.module.activeuser.useragree.AgreementUIActivity"android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale|fontScale"android:screenOrientation="behind"android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /><service android:name="com.com2us.module.activeuser.downloadcheck.InstallService" /><!-- ActiveUser End --><!-- Mercury Start --><activityandroid:name="com.com2us.module.mercury.MercuryVideoActivity"android:hardwareAccelerated="true"android:screenOrientation="sensorLandscape"android:launchMode="standard"/><activityandroid:name="com.com2us.module.mercury.MercuryWebVideoActivity"android:hardwareAccelerated="true"android:screenOrientation="sensorLandscape"android:theme="@style/Theme.AppCompat.NoActionBar"/><!-- Mercury End --><!-- Push Start --><activity android:name="com.com2us.module.push.ShowMsgActivity" android:launchMode="singleInstance" android:theme="@android:style/Theme.Translucent" /><activity android:name="com.com2us.module.push.NotificationMessage" android:exported="true" android:launchMode="singleInstance" android:theme="@android:style/Theme.Translucent" /><activity android:name="com.com2us.module.push.PushWakeLock" android:launchMode="singleInstance" android:theme="@android:style/Theme.Translucent" /><receiver android:name="com.com2us.module.push.LocalPushReceiver" android:process=":remote" /><receiver android:name="com.com2us.module.push.DeviceStatusReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><action android:name="android.intent.action.TIME_SET" /><category android:name="{게임 패키지 이름}" /></intent-filter></receiver><!-- Push End --><!-- Peppermint Start --><providerandroid:name="androidx.core.content.FileProvider"android:authorities="{게임 패키지 이름}.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider><!-- Peppermint End --></application>// buildTargetSdk 30 이상에서 외부 앱 사용할 수 있도록 아래 내용 추가 (gradle 3.6.0 이상 필요) (C2S.19.1+)// 그 외 적용하려는 외부 앱의 package 명칭 추가하여 사용 가능<queries><package android:name="com.kakao.talk" /><package android:name="jp.naver.line.android" /><package android:name="com.whatsapp" /><package android:name="com.facebook.katana" /><package android:name="com.facebook.orca" /><package android:name="com.tencent.mm" /><package android:name="com.tencent.mobileqq" /><package android:name="com.huawei.appmarket" /> // C2S.19.4+, Huawei 적용 시<package android:name="com.huawei.hwid" /> // C2S.19.4+, Huawei 적용 시</queries></manifest> - android:targetSdkVersion의 값이 28 이상일 때 아래 내용을 추가합니다. <uses-library android:name=”org.apache.http.legacy” android:required=”false”/> 설정은 <application></application> 내에 추가합니다.
12<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-library android:name="org.apache.http.legacy" android:required="false"/>
- Android OS 12 이상 단말에서 광고 식별자를 사용할 수 있도록 AD_ID 권한을 추가합니다. (C2S.19.3+)
1<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
- FCM을 사용할 경우 아래 내용을 추가합니다.
12345<service android:name="com.com2us.module.fcm.MessagingService"><intent-filter><action android:name="com.google.firebase.MESSAGING_EVENT" /></intent-filter></service>
- QQ 로그인 지원하는 경우 아래 내용을 추가합니다.
123456789101112131415161718<activityandroid:name="com.tencent.connect.common.AssistActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><activityandroid:name="com.tencent.tauth.AuthActivity"android:launchMode="singleTask"android:noHistory="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="tencent{QQ appId}" /></intent-filter></activity>
- QQ 로그인을 지원하면서 Android 11 (API 30) 대응 시 AndroidManifest 설정 사항 (아래에 각각 해당하는 경우 설정 필요)
- Android 11 단말에서 QQ로그인 사용 시
- targetSDK 버전을 30 이상 적용하여 QQ로그인 사용 시
123456<manifest package=”com.com2us….”><queries><package android:name=”con.tencent.mm” /></queries>….</manifest> - 챗봇 기능을 지원하는 경우 아래 내용을 추가합니다.
1234<activityandroid:name="com.com2us.peppermint.PeppermintChatbotActivity"android:configChanges="orientation|screenSize|keyboard|keyboardHidden"android:screenOrientation="behind" />
- 아래 내용은 각 모듈에 공통으로 필요합니다.
- Facebook 설정
- Facebook 로그인에 필요한 설정을 추가합니다.
1234<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId" /><meta-data android:name="com.facebook.sdk.AutoInitEnabled" android:value="false"/><meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled" android:value="false"/><meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>
- Facebook 로그인에 필요한 설정을 추가합니다.
- Google Play Services 설정
- Google Play Services 로그인에 필요한 설정을 추가합니다.
1<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
- Google Play Services 로그인에 필요한 설정을 추가합니다.
- Android 앱 데이터 백업 허용 여부 설정
- 앱 사용 기기에서 앱 데이터를 백업한 후 다른 기기에서 복구하면 로컬 데이터에 저장된 정보가 그대로 복사될 수 있습니다. Hive에서 사용하는 기기 정보나 유저 식별 정보가 앱에 복사될 수 있으니 백업을 허용하지 마세요.
123<!-- <application> 태그 안에 android:allowBackup="false"로 설정 --><!-- (allowBackup을 설정하지 않을 경우 default는 true) --><application android:name="com.com2us…" android:allowBackup="false">
- 앱 사용 기기에서 앱 데이터를 백업한 후 다른 기기에서 복구하면 로컬 데이터에 저장된 정보가 그대로 복사될 수 있습니다. Hive에서 사용하는 기기 정보나 유저 식별 정보가 앱에 복사될 수 있으니 백업을 허용하지 마세요.
- 퍼미션 설정
<manifest>
하위에 아래 값을 입력하여 전체 모듈에 적용할 공통 퍼미션을 설정합니다. (C2S.19.0+)123456789101112<uses-permission android:name="android.permission.INTERNET"/><!-- uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="25"/><uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />READ_PHONE_STATE, READ_PHONE_NUMBERS 권한 사용 중단 (C2S.19.3+) --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.VIBRATE"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="com.android.vending.BILLING"/><uses-permission android:name="android.permission.GET_TASKS" android:maxSdkVersion="20" />// Hive 프로필 사진첩 접근을 위한 설정<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22"/>- READ_PHONE_STATE : Hive SDK v1을 사용할 때 선언되는 위험 권한(dangerous permission) 중 하나로, 앱 최초 실행 시 권한 고지 페이지를 노출한 후 팝업을 띄워 유저에게 권한 사용 여부를 묻는다. C2S.19.0.1 이상을 적용하는 경우 maxSdkVersion을 25으로 설정한다.
- READ_PHONE_NUMBERRS : Hive SDK v1을 사용할 때 선언되는 위험 권한(dangerous permission) 중 하나로, 앱 최초 실행 시 권한 고지 페이지를 노출한 후 팝업을 띄워 유저에게 권한 사용 여부를 묻는다. C2S.19.0.1 이상을 READ_PHONE_STATE와 함께 설정한다. (C2S.19.0.1 미만 사용 시 READ_PHONE_STATE을 maxSdkVersion 제한 없이 사용)
- C2S.19.3부터 각 모듈은 READ_PHONE_STATE와 READ_PHONE_NUMBERS 권한 사용을 중단합니다. 또한, Hive 1.19.3 이상에서
manifest
에 dangerous 권한이 추가되어있다면 Hive 초기화 시 Hive SDK가 권한 고지와 권한 요청을 진행합니다. 별도의 시점에서 권한 고지 및 요청을 사용하려면 권한 고지 커스텀 및 권한 별도 요청 API를 참고하세요.
- Lebi Market 설정
- IAP v1 사용 시
- WeChat Pay 충전 기능을 지원할 경우
<application>
하위에 아래 값을 입력하여 WeChat Pay를 설정합니다.12345678<activityandroid:name="com.com2us.module.inapp.lebi.WeChatPayActivity" /><activity-alias android:name=".wxapi.WXPayEntryActivity"android:targetActivity="com.com2us.module.inapp.lebi.WeChatPayActivity"tools:node="replace"android:exported="true" />
- WeChat Pay 충전 기능을 지원할 경우
- IAP v4 사용 시
- 별도 설정 없음
- Wechat Pay 충전 기능을 지원하면서 Android 11 (API 30) 대응 시 AndroidManifest 설정 사항 (IAP v1/v4 공통, 아래에 각각 해당하는 경우 설정 필요)
- Android 11 단말에서 Wechat Pay 사용 시
- targetSDK 버전을 30 이상 적용하여 Wechat Pay 사용 시
123456<manifest package=”com.com2us….”><queries><package android:name=”con.tencent.mm” /></queries>….</manifest>
- IAP v1 사용 시
- ONE store Market 설정
- ONE store V4 결제를 지원할 경우
<application>
하위에 아래 값을 입력하여 ONE store V4 결제를 설정합니다.123456789// C2S.19.2+ (InAppV4Plugin v4.15.2.2+)에서 InAppV4 원스토어 V4 적용 시 tools:replace 설정을 반드시 추가해야 합니다.<meta-dataandroid:name="iap:api_version"android:value="4"tools:replace="android:value"/><activity android:name="com.skplanet.dodo.IapWeb"android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"android:excludeFromRecents="true"android:windowSoftInputMode="stateHidden" /> - ONE store V5 결제를 지원할 경우
<application>
하위에 아래 값을 입력하여 ONE store V5 결제를 설정합니다.1<meta-data android:name="iap:api_version" android:value="5" /> - ONE store V6 결제를 지원하는 경우에는 V6에 대해 개별로 설정할 사항이 없습니다.
- (ONE store 적용 공통 사항) Android 11 (API 30) 대응 시 AndroidManifest 설정 사항 (아래에 각각 해당하는 경우 설정 필요)
- Android 11 단말에서 원스토어 사용 시
- targetSDK 버전을 30 이상 적용하여 원스토어 사용 시
1234567891011<manifest><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></manifest> - ONE Store V7 결제를 지원하는 경우 라이브러리 다운로드를 위한 설정만 추가하면 됩니다. OneStore V7은 국내 빌드 혹은 글로벌 빌드(C2S.22.0.1 이상)로 적용 가능합니다. 기존 OneStore V6 결제의 onestore_iap_sdk-v19.00.02.aar 파일이 있다면 제거합니다.
프로젝트 수준 build.gradle1234567allprojects {repositories {...maven { url 'https://repo.onestore.co.kr/repository/onestore-sdk-public' } // only for OneStore...}}모듈 수준 build.gradle: 국내용 빌드
12345678dependencies {...implementation "com.onestorecorp.sdk:sdk-iap:21.00.02"implementation "com.onestorecorp.sdk:sdk-configuration-kr:1.0.0"...}모듈 수준 build.gradle: 글로벌 빌드
12345678dependencies {...implementation "com.onestorecorp.sdk:sdk-iap:21.00.02"implementation "com.onestorecorp.sdk:sdk-configuration-gl:1.0.0"...}
- ONE store V4 결제를 지원할 경우
- Amazon Market 설정
- (IAP v1에만 해당)Amazon 결제를 지원할 경우
<application>
하위에 아래 값을 입력하여 Amazon 결제를 설정합니다.1234567<receiverandroid:name="com.amazon.device.iap.ResponseReceiver"android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY"><intent-filter><action android:name="com.amazon.inapp.purchasing.NOTIFY"></intent-filter></receiver> - Amazon 푸시를 지원할 경우
<application>
하위에 아래 값을 입력하여 Amazon 푸시를 설정합니다.123456789101112131415161718192021<service android:name="com.com2us.module.amazonpush.ADMMessageHandler" android:exported="false" /><receiver android:name="com.com2us.module.amazonpush.ADMMessageHandler$MessageAlertReceiver"android:permission="com.amazon.device.messaging.permission.SEND"><intent-filter><action android:name="com.amazon.device.messaging.intent.REGISTRATION" /><action android:name="com.amazon.device.messaging.intent.RECEIVE" /><category android:name="{게임 패키지 이름}"/></intent-filter></receiver><meta-data android:name="AmazonAPIKey" android:value="{Your API Key}"/><amazon:enable-feature android:name="com.amazon.device.messaging" android:required="true" /><permission android:name="{게임 패키지 이름}.permission.RECEIVE_ADM_MESSAGE" android:protectionLevel="signature"/><uses-permission android:name="{게임 패키지 이름}.permission.RECEIVE_ADM_MESSAGE"/><uses-permission android:name="com.amazon.device.messaging.permission.RECEIVE"/>
- (IAP v1에만 해당)Amazon 결제를 지원할 경우
strings.xml 설정하기
res/values/strings.xml 파일에 아래와 같이 설정합니다.
- “app_id” 값에 Google App ID를 입력하세요.
예. 331526026701 - “applicationId” 값에 Facbook App ID를 입력하세요.
예. 1809615065921877 - WeChat Pay 충전 지원 시 “wechat_appid” 값에 WeChat에서 발급받은 AppID를 입력하세요.
예. wx810adfc018b5f0bd - WeChat Pay 충전 지원 시 “wechat_key” 값에 WeChat에서 발급받은 key를 입력하세요.
예. auILMZisSYHnEb4ISD58QYm7uETdVX6d - QQ 로그인 지원 시 “qq_appid” 값에 QQ에서 발급받은 APPID를 입력하세요.
예. 101518248
기타 설정하기
FCM 설정
/res/values/ 경로에 추가한 fcm_settings.xml 파일을 앱 설정에 맞게 수정합니다. FCM을 설정하려면 Firebase에 로그인한 후 프로젝트 설정 항목에서 google-service.json을 다운로드해 확인할 수 있습니다. 파일을 다운로드한 후 google-service.json 파일 내 주요 키 값을 fcm_settings.xml 파일에 설정해 FCM을 동작합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<!– google-service.json에서 fcm_settings.xml로의 키 매칭 –> <!– (1) client > oauth_client > client_id : default_web_client_id –> <!– (2) project_info > firebase_url : firebase_database_url –> <!– (3) project_info > project_number : gcm_defaultSenderId –> <!– (4) client > api_key > current_key : google_api_key –> <!– (5) client > client_info > mobilesdk_app_id : google_app_id –> <!– (6) project_info > storage_bucket : google_storage_bucket –> <?xml version="1.0″ encoding="utf-8″?> <resources> <string name="default_web_client_id" translatable="false">123456789101-a12bcd34e5fghijk67abcdefghi8abde.apps.googleusercontent.com</string> <string name="firebase_database_url" translatable="false">https://hive-sdk-1234567.firebaseio.com</string> <string name="gcm_defaultSenderId" translatable="false">987654321010</string> <string name="google_api_key" translatable="false">AbcdEfGHIjk0LMnopQRsTUv2Wx3YzabcD45eFGh</string> <string name="google_app_id" translatable="false">1:123456789101:android:1a234bd567ef8g9h</string> <string name="google_storage_bucket" translatable="false">hive-sdk-1234567.appspot.com</string> </resources> |
Huawei 로그인 및 결제 설정
- Project 폴더에 Huawei 콘솔에서 다운로드한 agconnect-services.json 파일을 추가합니다.
- Project 폴더 내 build.gradle 파일에 아래 내용을 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
allprojects { repositories { //... maven {url 'http://developer.huawei.com/repo/'} // huawei } } buildscript { repositories { //... maven {url 'http://developer.huawei.com/repo/'} // huawei } dependencies { //... classpath 'com.huawei.agconnect:agcp:1.4.2.300' // huawei (C2S.19.4) } } |
- Proguard 사용시 난독화 제외 설정하기
-
– ignorewarnings
– keepattributes *Annotation*
– keepattributes Exceptions
– keepattributes InnerClasses
– keepattributes Signature
– keepattributes SourceFile,LineNumberTable
– keep class com.hianalytics.android.**{*;}
– keep class com.huawei.updatesdk.**{*;}
– keep class com.huawei.hms.**{*;} - AndroidManifest 설정
- C2S.19.4 이하에 Huawei를 적용하는 모든 버전에서 요구됩니다.
12345678910111213141516// Huawei 요구 Android 권한 추가<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />// Android 11 대응을 위한 설정<queries><intent><action android:name="com.huawei.hms.core.aidlservice" /></intent></queries><queries><package android:name="com.huawei.appmarket" /><package android:name="com.huawei.hwid" /></queries>
Android Activity Lifecycle
MainActivity에서 Android Lifecycle에 맞춰 아래 코드를 호출합니다. 개별모듈이 정상 동작하려면 반드시 추가되어야 합니다.
- 모듈 인스턴스 선언 예시 (Java native, C Plugin, 기타 환경)
- MainActivity에서 모듈 라이브러리의 인스턴스를 아래와 같이 선언한 경우를 예시로 설명
- 각 모듈이 생성자 호출을 통해 MainActivity를 알 수 있도록 구현 필요
- 해당 내용은 Unity 환경이 아닌 ‘Java native 환경, Cocos2d-x 엔진 등 C Plugin 환경, 그외 기타 자체 환경’에서 개별모듈 사용 시 해당
- Unity에선 모듈 패키지에서 제공하는 플러그인 코드를 통해 제어됨
- 게임 로직(초기화 시점)에 따라 인스턴스 생성자를 호출하는 부분은 자유롭게 구현 가능
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253public class MainActivity { // 게임에서 사용중인 엔진, 기타 설정에 따라 MainActivity가 상속(extends)하고 있는 부분이 있을 수 있음static ActiveUser mActiveUser;static InApp mInApp; // InAppV1(IAP v1) 사용 시static InAppV4 mInAppV4; // InAppV4(IAP v4) 사용 시static Mercury mMercury;static Offerwall mOfferwall;static Push mPush;static Peppermint mPeppermint; // Peppermint 사용 시 (Java native, 기타 환경)// C Plugin 환경에선 Peppermint 라이브러리의 HubBridge 클래스로 제어, 별도의 Peppermint 인스턴스 선언하지 않음static PromotionJNI mPromotionJNI; // HIVE Prmotion 사용 시 (C Plugin 환경)// ...(생략)...// Cococs2d-x 등의 C 플러그인 환경인 경우 모듈 인스턴스에 SurfaceViewWrapper를 상속받는 클래스를 정의 (C Plugin 환경)static ViewEx mViewEx;class ViewEx extends SurfaceViewWrapper {public ViewEx(SurfaceView view) {super(view);// TODO Auto-generated constructor stub}@Overridepublic void queueEvent(Runnable paramRunnable) {// TODO Auto-generated method stubparamRunnable.run();}}// ...// Case 1 : 게임 로직(초기화 시점)에 따라 인스턴스 생성자를 호출 (Java native 환경, 기타 환경)// (setModulesExample 메서드는 예시 코드)// ...private void setModulesExample() {// (예시 코드)mActiveUser = new ActiveUser(this);mMercury = new Mercury(this);// ...(생략)...}// Case 2 : 게임 로직(초기화 시점)에 따라 인스턴스 생성자를 호출 (C Plugin 환경)// (setModulesExampleForCPlugin 메서드는 예시 코드)// ...private void setModulesExampleForCPlugin() {// (예시 코드)SurfaceView sf = new SurfaceView(this);mViewEx = new ViewEx(sf);mActiveUser = new ActiveUser(this, mViewEx);mMercury = new Mercury(this, mViewEx);// ...(생략)...}} - 모듈 인스턴스 선언 예시 (Unity 환경)
- MainActivity(보통 UnityPlayerActivity)에서 모듈 라이브러리의 인스턴스를 아래와 같이 선언한 경우를 예시로 설명
- 각 모듈이 생성자 호출을 통해 MainActivity를 알 수 있도록 구현 필요
- Unity에선 모듈 패키지에서 제공하는 플러그인 코드를 통해 제어되나 모듈 패키지에서 제공하는 HubUnityController 를 사용하는 경우에 해당
- HubUnityController는 Peppermint에 신호를 전달하는 역할
- 게임 로직(초기화 시점)에 따라 인스턴스 생성자를 호출하는 부분은 자유롭게 구현 가능
123456789101112131415public class MainActivity { // 게임에서 사용중인 엔진, 기타 설정에 따라 MainActivity가 상속(extends)하고 있는 부분이 있을 수 있음static HubUnityController mHubUnityController;// ...// 게임 로직(초기화 시점)에 따라 인스턴스 생성자를 호출// (setModulesExampleForUnity 메서드는 예시 코드)// ...private void setModulesExampleForUnity() {// (예시 코드)mHubUnityController = new HubUnityController(this);// ...(생략)...}} - Peppermint 공통 적용
- Pepermint에서 소셜 서비스 관련 응답 처리를 위해 필요
- Peppermint에서 Android 권환 관련 처리를 위해 필요
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051// C Plugin 환경@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//...if (HubBridge.getPeppermint() != null) {HubBridge.getPeppermint().onActivityResult(requestCode, resultCode, data);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {//...if (HubBridge.getPeppermint() != null) {HubBridge.getPeppermint().onRequestPermissionsResult(requestCode, permissions, grantResults);}}// Java native, 기타 환경@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//...if (mPeppermint != null) {mPeppermint.onActivityResult(requestCode, resultCode, data);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {//...if (mPeppermint != null) {mPeppermint.onRequestPermissionsResult(requestCode, permissions, grantResults);}}// Unity 환경@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//...if (mHubUnityController != null && mHubUnityController.getPeppermint() != null) {mHubUnityController.getPeppermint().onActivityResult(requestCode, resultCode, data);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {//...if (mHubUnityController != null && mHubUnityController.getPeppermint() != null) {mHubUnityController.getPeppermint().onRequestPermissionsResult(requestCode, permissions, grantResults);}} - ActiveUser 사용 시 적용 (C Plugin 환경)
- 약관 동의 후 모듈 내부로 신호 전달
- 약관 로직이 끝났는지 알려주는 UserAgreeCB(API 문서 링크)를 게임 로직에서 활용할 경우 필요
- C Plugin 외 다른 환경은 적용 필요하지 않음
1234567@Overrideprotected void onResume() {// ...mActiveUser.onCletResumed();// ...}
InApp 모듈(IAP v1)을 사용하는 경우
- Unity 환경에서 개발 시 적용
123456789@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// ...if(InAppUnityPlugin.getInstance() != null) {InAppUnityPlugin.getInstance().onActivityResult(requestCode, resultCode, data);}// ...}
- 그 외 환경에서 개발 시 적용
12345678910@Overrideprotected void onActivityResult(){super.onActivityResult();// ...if(mInApp != null)mInApp.onActivityResult();// ...}
- Lebi Market
WeChat Pay 지원 시 추가로 설정합니다. (WeChat Pay로부터의 응답 처리)- Unity 환경에서 개발 시 적용
123456789@Overrideprotected void onResume(){// ...if(InAppUnityPlugin.getInstance() != null) {InAppUnityPlugin.getInstance().onActivityResumed();// ...}- 그 외 환경에서 개발 시 적용
123456789@Overrideprotected void onResume(){super.onResume();if(mInApp != null)mInApp.onActivityResumed();// ...}
InAppV4 모듈(IAP v4)을 사용하는 경우
- HiveActivity의 lifecycle 메서드 호출 필요
- 하단에 ‘C2S.19.0.1 이상 모듈을 사용하는 경우’ 항목 참고
C2S.19.0.1 이상 모듈을 사용하는 경우
- 공통 적용
- 메인 액티비티에서 lifecycle 메서드에 HiveActivity의 lifecycle 메서드를 호출하도록 구현
- 기존 각기 개별모듈에서 사용되는 lifecycle 메서드를 지우고 HiveActivity lifecycle 메서드로 대체하는 것이 아닌 추가 호출해야하는 요소
- 모든 환경(Unity, C Plugin, Java native, 기타 환경)에서 적용 필요
- hive-core-x.x.x.aar, hive-protocol-x.x.x.aar, hive-base-x.x.x.aar, hive-ui-x.x.x.aar 라이브러리가 C2S.19.0.1에서 기본 적용 요소가 되어 설정이 꼭 필요한 내용
- C2S.19.3부터는 추가로 hive-repayment-x.x.x.aar 적용 필요
- C2S.19.4부터는 hive-repayment-x.x.x.aar 라이브러리 제거됨
- InAppV4를 사용하는 경우 마켓 응답을 처리하기 위해 꼭 필요한 내용
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100@Overrideprotected void onCreate(Bundle savedInstanceState) {// ...HiveActivity.onCreate(this, savedInstanceState);com.hive.v1.Configuration.setActivity(this); // hive-ui 라이브러리에 설정 전달을 위해 필요// ...}@Overrideprotected void onResume(){super.onResume();// ...HiveActivity.onResume(this);// ...}@Overrideprotected void onPause(){super.onPause();// ...HiveActivity.onPause(this);// ...}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);// ...HiveActivity.onActivityResult(this, requestCode, resultCode, data);// ...}@Overrideprotected void onStart(){super.onStart();// ...HiveActivity.onStart(this);// ...}@Overrideprotected void onStop(){super.onStop();// ...HiveActivity.onStop(this);// ...}@Overrideprotected void onRestart(){super.onRestart();// ...HiveActivity.onRestart(this);// ...}@Overridepublic void onWindowFocusChanged(final boolean hasFocus){super.onWindowFocusChanged(hasFocus);// ...HiveActivity.onWindowFocusChanged(this, hasFocus);// ..}@Overrideprotected void onNewIntent(Intent intent){super.onNewIntent(intent);// ...HiveActivity.onNewIntent(this, intent);// ...}@Overrideprotected void onDestroy(){super.onDestroy();// ...HiveActivity.onDestroy(this);// ...}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);// ...HiveActivity.onRequestPermissionsResult(this, requestCode, permissions, grantResults);// ...}
- 메인 액티비티에서 lifecycle 메서드에 HiveActivity의 lifecycle 메서드를 호출하도록 구현
빌드하기
Gradle 설정하기
Gradle 설정으로 개별모듈에서 사용 중인 외부 라이브러리를 추가할 수 있습니다.
- 프로젝트 수준의 build.gradle 파일에 외부 라이브러리를 가져올 수 있도록 레파지토리를 추가합니다.
1234567891011121314151617181920allprojects {repositories {google()jcenter()mavenCentral()}}buildscript {ext.kotlin_version = '1.4.32' // C2S.19.1+repositories {google()jcenter()mavenCentral()}dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"classpath 'com.android.tools.build:gradle:x.x.x' // 사용중인 gradle 버전 설정}}
- android > defaultConfig > applicationId에 AndroidManifest.xml 파일의
packageName
과 동일하게 입력해야 합니다. 개별모듈에서 지원하는minSdkVersion
은 15이고, Unity 환경에서 개발할 경우 16, Huawei Market을 지원할 경우 17을 설정합니다.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182android {compileSdkVersion 30buildToolVersion "30.0.3"// ...defaultConfig {applicationId "com.hive.example.gameapp"minSdkVersion 15targetSdkVersion 30versionCode 1versionName "1.0"vectorDrawables.useSupportLibrary = true // Mercury v2.13.5 이상 적용 필수, HIVE Promotion 적용 시 필수}// ...compileOptions { // C2S.19.0.1+sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}// ...}dependencies {implementation fileTree(include: ['*.jar'], dir: 'libs')implementation fileTree(include: ['*.aar'], dir: 'libs')// Kotlin Library (kotlin_version은 1.4.32를 사용)implementation 'org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version'implementation 'org.jetbrains.kotlin:kotlin-reflect:$kotlin_version'implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" // v1.19.1+implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3" // v1.19.1+// Android Support Libraryimplementation 'androidx.core:core-ktx:1.3.0'implementation 'androidx.appcompat:appcompat:1.0.0'implementation 'androidx.cardview:cardview:1.0.0'implementation 'androidx.legacy:legacy-support-v4:1.0.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha05' // v1.19.0+ (C2S.19.0)// Google Play Servicesimplementation 'com.google.android.gms:play-services-auth:17.0.0'implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0' //중요// Google Billingimplementation 'com.android.billingclient:billing:3.0.3' // updated C2S.19.1// Google In App Reviewimplementation 'com.google.android.play:core:1.8.3' // C2S.19.1+implementation 'com.google.android.play:core-ktx:1.8.1' // C2S.19.1+// Firebaseimplementation 'com.google.firebase:firebase-iid:20.2.4'implementation 'com.google.firebase:firebase-messaging:20.2.4'// Facebookimplementation 'com.facebook.android:facebook-common:9.1.0' // updated C2S.19.1implementation 'com.facebook.android:facebook-core:9.1.0' // updated C2S.19.1implementation 'com.facebook.android:facebook-login:9.1.0' // updated C2S.19.1implementation 'com.facebook.android:facebook-share:9.1.0' // updated C2S.19.1implementation 'androidx.multidex:multidex:2.0.0'// Install Referrerimplementation ‘com.android.installreferrer:installreferrer:2.2’ // updated C2S.19.1// Wechat Pay 지원 시 (C2S.19.1+)implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.4.0'// Huawei 로그인 지원 시 (C2S.19.4)implementation ‘com.huawei.hms:hwid:6.0.1.300’// Huawei 결제 지원 시 (C2S.19.4)implementation ‘com.huawei.hms:iap:6.0.0.300’// QQ Login 지원 시 (C2S.19.2+)implementation 'com.squareup.okhttp3:okhttp:3.12.12'// ...}apply plugin: 'com.huawei.agconnect' // Huawei 로그인 및 결제를 지원하는 경우 반드시 추가
ProGuard 설정하기
Hive SDK 및 Hive SDK에서 사용 중인 외부 라이브러리에 대해서 프로가드 설정을 하려면 다음의 내용을 적용하세요.
hive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-keep class com.google.android.material.** { *; } -dontwarn com.google.android.material.** -dontnote com.google.android.material.** -dontwarn androidx.** -keep class androidx.** { *; } -keep interface androidx.** { *; } # ORIG/KS Interface -keep class com.hive.** { *; } # KS -keep class com.gcp.** { *; } # 개별모듈 및 SDK v1 ORIG -keep class com.com2us.** { *; } |
unity
1 2 3 |
-keep class com.android.** { *; } -keep class com.unity3d.** { *; } |
1 2 |
-keep class com.facebook.** { *; } |
google / admob/adkit
1 2 3 4 5 |
-keep class com.google.** { *; } -keepattributes *Annotation* -dontobfuscate |
1 2 |
-keep class * extends android.app.Dialog |
1 2 3 4 |
-keep class com.tencent.mm.opensdk.** { *; } -keep class com.tencent.wxop.** { *; } -keep class com.tencent.mm.sdk.** { *; } |
adjust
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-keep class com.adjust.sdk.** { *; } # google 적용시 포함 -keep class com.google.android.gms.common.ConnectionResult { int SUCCESS; } # google 적용시 포함 -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); } # google 적용시 포함 -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { java.lang.String getId(); boolean isLimitAdTrackingEnabled(); } -keep public class com.android.installreferrer.** { *; } |
singular
1 2 3 |
-keep class com.singular.sdk.** { *; } -keep public class com.android.installreferrer.** { *; } |
huawei
1 2 3 4 5 6 7 8 9 10 |
-ignorewarnings -keepattributes Annotation -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.*{;} -keep class com.huawei.updatesdk.*{;} -keep class com.huawei.hms.*{;} |