Vungle - Android SDK v.5 시작하기

목차

요구사항

  • Android 3.0(Honeycomb - API 버전 11) 이상
  • Java 1.7 - Android 5.+ 호환성을 위해 JDK 7가 필요합니다.
  • Java 1.8 - Android 7.+ 호환성을 위해 JDK 8이 필요합니다.

1단계. 프로젝트에 Vungle SDK 포함

Vungle SDK는 Maven을 통해서 AAR로 이용하거나 또는 수동 다운로드를 통해 이용할 수 있습니다.

옵션 1. Maven을 통해 Vungle SDK를 AAR로 포함

프로젝트 레벨 build.gradle을 열고 모든 프로젝트 섹션에 메이븐 URL을 추가합니다.

allprojects {
    repositories {
        maven {
            url "https://jitpack.io"
        }
    }
}

앱에서 앱 수준 build.gradle 파일을 열고 종속성 섹션에 컴파일 종속성을 추가합니다.

dependencies {
	…
	compile 'com.github.vungle:vungle-android-sdk:5.1.0'
	…
}

Maven을 통해서 Vungle SDK를 포함하는 경우 "2단계. AndroidManifest.xml 업데이트"를 건너 뛸 수 있습니다.

옵션 2. Vungle SDK 다운로드 및 앱에 포함

Vungle SDK를 다운로드하여 프로젝트 라이브러리에 추가합니다.

image2.png

프로젝트 수준 build.gradle을 열고 저장소 섹션을 업데이트합니다.

allprojects {
    repositories {
        jcenter()
    }
}

앱에서 앱 레벨 build.gradle 파일을 열고 종속성 섹션에 기타 종속성을 추가합니다.

dependencies {
	…
	compile('javax.inject:javax.inject:1',
       		 'com.google.dagger:dagger:2.7',
        		'de.greenrobot:eventbus:2.2.1',
        		'io.reactivex:rxjava:1.2.0',
        		'io.reactivex:rxandroid:1.2.1')

	compile files('libs/publisher-sdk-android-5.1.0.jar’)
	…
}
android{
...
    packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }
...
}

dependencies {
    …
    compile 'com.squareup.retrofit2:converter-gson:2.2.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
    compile 'com.google.android.gms:play-services-basement:11.4.0'  //use version 11.0.1 and up only
    compile 'com.google.android.gms:play-services-location:11.4.0'  //use version 11.0.1 and up only
    compile files('libs/dagger-2.7.jar')
    compile files('libs/javax.inject-1.jar')
    compile files('libs/eventbus-2.2.1.jar')
    compile files('libs/publisher-sdk-android-5.3.0.jar')
    compile files('libs/rxjava-1.2.0.jar')
    … 
}

Vungle SDK를 수동으로 포함하는 경우, "2단계. AndroidManifest.xml 업데이트"를 계속 진행합니다.

2단계. AndroidManifest.xml 업데이트

multidex에 대한 애플리케이션 클래스 이름에 애플리케이션 항목 이름을 지정하여 다음 행을 AndroidManifest.xml에 추가합니다.

<!-- permissions to download and cache video ads for playback --> 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
    android:name=”.(YourApplicationName)”
    ...
<activity android:name=“com.vungle.publisher.VideoFullScreenAdActivity”
android:configChanges=“keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize”
android:theme=“@android:style/Theme.NoTitleBar.Fullscreen”/>

<activity android:name=“com.vungle.publisher.MraidFullScreenAdActivity”
android:configChanges=“keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize”
android:theme=“@android:style/Theme.Translucent.NoTitleBar.Fullscreen”/>

<activity android:name=“com.vungle.publisher.FlexViewAdActivity”
android:configChanges=“keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize”
android:theme=“@android:style/Theme.Translucent.NoTitleBar.Fullscreen”/>
>

3단계. Vungle SDK 초기화

참고: 앱별로 기본 광고위치가 자동으로 생성됩니다. 이 초기화 단계에서 광고위치 기능을 사용하지 않더라도 반드시 광고위치 참조 ID를 제공해야 합니다. 광고위치를 여러 개 만드는 경우, 참조 ID를 모두 제공합니다.

애플리케이션 시작

앱 내부에서 사용할 활성 광고위치 참조 ID로 앱의 첫 번째 액티비티에서 Vungle Publisher SDK를 초기화합니다. SDK가 비동기적으로 초기화되며 init에 제공된 VungleInitListener에 콜백을 반환합니다.

public class FirstActivity extends android.app.Activity {

  //VunglePub 인스턴스 보기
  final VunglePub vunglePub = VunglePub.getInstance();

  //앱을 설치한 후 Vungle 대시보드에서 앱의 기본 페이지에 있는 해당 앱 ID 보기
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

       //앱 ID, 광고위치 참조 ID 목록 및 초기화 콜백 핸들러로 게시자 SDK 초기화
  	vunglePub.init(this, app_id, new String[] { placementID1, placementID2, placementID3 }, new VungleInitListener() {

            @Override
            public void onSuccess() {
            }
            @Override
            public void onFailure(Throwable e){

            }
        });

각 액티비티

또한, onPauseonResume 메서드(활동에 있음, 첫 번째 포함)를 다시 정의해서 애플리케이션이 포커스를 얻거나 잃었을 때 Vungle Android SDK가 올바르게 업데이트되는지 다음과 같이 확인해야 합니다.

public class EachActivity extends android.app.Activity {

  // get the VunglePub instance
  final VunglePub vunglePub = VunglePub.getInstance();
  ...
  @Override
  protected void onPause() {
      super.onPause();
      vunglePub.onPause();
  }

  @Override
  protected void onResume() {
      super.onResume();
      vunglePub.onResume();
  }
}

4단계. 리스너 설정

Vungler SDK는 VungleAdEventListener 클래스를 구현하고 clearAndSetEventListeners를 이용해 등록/제거함으로써 프로그래밍 방식으로 처리할 수 있는 여러 건의 이벤트를 발생시킵니다. 메모리 누수를 방지하려면 필요 없는 eventListener를 제거합니다.

vunglePub.clearAndSetEventListeners(vungleDefaultListener, vungleSecondListener);

5단계. 광고 로드 및 재생

Vungle SDK가 성공적으로 초기화되면 광고위치를 로드하고 준비가 완료되었을 때 광고를 재생할 수 있습니다. VungleAdEventListener을 설정하면 광고를 재생할 수 있을 때 AdAvailabilityUpdate(문자열 배치ReferenceId, 부울은 AdAvailable)에서 를 통해 콜백합니다 .

public class GameActivity extends android.app.Activity {

  //VunglePub 인스턴스 보기
  final VunglePub vunglePub = VunglePub.getInstance();
  final String placementIdForLevel = “your placement reference id”;
final AdConfig globalAdConfig = vunglePub.getGlobalAdConfig(); private void onLevelStart() { vunglePub.loadAd(placementIdForLevel); } private void onLevelComplete() { if (vunglePub.isAdPlayable(placementIdForLevel)) { vunglePub.playAd(placementIdForLevel, globalAdConfig); } } }

자동 캐시된 광고위치의 경우 초기화 후에 SDK가 광고를 자동으로 로드하므로 loadAd를 호출할 필요가 없습니다. 조회 수가 가장 높은 광고위치를 자동 캐시 섹션으로 설정하는 것이 좋습니다.

사용자에게 광고를 닫을 수 있는 옵션을 제공할지 결정하려면 Vungle 대시보드에서 강제 보기 옵션을 사용합니다.

참고: SDK v.5.1.에서는 아직 테스트 모드가 지원되지 않습니다.

고급 설정

Google Play Services(선택사항)

프로젝트에 Google Play Services를 포함하면 Vungle에서 최종 사용자가 누리는 사용자 지정형 광고 경험을 한층 강화할 수 있게 되지만, 의무 사항은 아닙니다. 8.4.0 이상의 버전을 사용하시길 권장합니다.

Google Play Services를 포함하려면 Google의 설치 설명서를 읽어 보시기 바랍니다. 앱에서 해당 장치에 최신 버전의 Google Play Services가 설치되어 있는지 확인합니다. Vungle SDK는 Google Play Services의 위치 및 광고 API를 선택적으로 사용합니다.

  • google.android.gms:play-services-location:11.0.1
  • google.android.gms:play-services-ads:11.0.1
  • 7.8.0 및 그 이하의 play-services: 지원 라이브러리 보유
  • 8.4.0 및 그 이상의 play-services: 지원 라이브러리 불필요

Google Play Services 7.8.0, 8.4.0, 9.8.0, 10.2.4, 11.0.1. 버전으로 컴파일하기 위해 독립형 SDK를 성공적으로 컴파일했습니다.

65K Dalvik Method Limit

Vungle Android SDK 5.1.0를 프로젝트에 추가하면, 필요한 다른 종속성을 제외한 6,557개의 메서드가 추가됩니다. 프로젝트 파이프 라인에서 메서드 수를 줄일 계획을 가지고 있으나, 현재로서는 이것이 한계입니다. 프로젝트에 추가되는 총 메서드 수를 줄이려면 다음 사항을 고려합니다.

  • 선택적 Gradle 컴파일: Google Play Services(GPS) SDK는 약 20,000개의 메서드를 가지고 있습니다. 프로젝트에 GPS를 사용하는 경우, 필요한 GPS SDK를 선택적으로 컴파일하는 옵션이 있습니다.
    • com.google.android.gms:play-services-location:11.0.1
    • com.google.android.gms:play-services-ads:11.0.1

  • ProGuard: ProGuard를 사용하여 프로젝트 코드를 축소할 수 있습니다. 이 방법을 사용하면 컴파일 시에 사용되지 않는 클래스를 버림으로써 총 메서드 수를 최대한으로 줄입니다. build.gradle에서 midifyEnabled true를 지정하고 적절한 빌드 유형 및 프로젝트에 필요한 클래스를 유지하는 규칙을 제공하여 이를 활성화할 수 있습니다.

  • Multidex: 메서드 수가 여전히 65K를 초과하는 경우, multiDex를 활성화하는 것만이 Google에서 제공된 유일한 해결책일 수 있습니다. multiDex에서 단 한 번만 프로젝트를 구성하면 되지만 빌드 및 앱 시작 시간에 영향을 줍니다.

Proguard

Proguard를 사용하는 경우 ProGuard 구성 파일에 다음과 같은 규칙을 추가합니다.

# Vungle
-dontwarn com.vungle.**
-dontnote com.vungle.**
-keep class com.vungle.** { *; }
-keep class javax.inject.*

# GreenRobot
-dontwarn de.greenrobot.event.util.**

# RxJava
-dontwarn rx.internal.util.unsafe.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
   rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
   rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-keep class rx.schedulers.Schedulers { public static ; }
-keep class rx.schedulers.ImmediateScheduler { public ; }
-keep class rx.schedulers.TestScheduler { public ; }
-keep class rx.schedulers.Schedulers { public static ** test(); }

# MOAT
-dontwarn com.moat.**
-keep class com.moat.** { public protected private *; }

# Retrofit
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8

EventListener 인터페이스

VungleAdEventListener를 관리하는 데 사용할 수 있는 메서드는 다음과 같습니다.

메서드

설명

clearAndSetEventListeners(VungleEventListener..)

등록된 이벤트 리스너를 지운 다음 입력 이벤트 리스너를 추가합니다.

clearEventListeners( )

EventListeners 모두 지우기

removeEventListeners(VungleEventListener..)

입력 이벤트 리스너를 제거합니다.

addEventListeners(VungleEventListener..)

입력 eventListener를 추가합니다.

VungleAdEventListener 델리게이트 호출 API:

public class FirstActivity extends android.app.Activity {
  ...

  private final VungleAdEventListener vungleListener = new VungleAdEventListener(){

    @Override
   public void onAdEnd(String placementReferenceId, boolean wasSuccessfulView, boolean wasCallToActionClicked) {
        //사용자가 광고에서 나가고 애플리케이션으로 컨트롤이 반환될 때 호출        
        //wasSuccessfulView가 true인 경우 사용자가 광고를 시청했으므로 보상 제공       
        //(보상형 광고일 경우).
        //wasCallToActionClicked가 true인 경우 사용자가 광고의 메시지
        //광고에서 버튼 클릭.    
      }

    @Override
    public void onAdStart(String placemetReferenceId) {
        //광고 재생 전에 호출
    }

    @Override
    public void onUnableToPlayAd(String placementReferenceId, String reason) {
        //playAd(placementId, adConfig)가 광고를 재생할 수 없는 경우에 호출       
     }

    @Override
  public void onAdAvailabilityUpdate(String placementReferenceId, boolean isAdAvailable) {
        //표시된 광고위치의 광고 가용성 통보
  //알림이 중복될 수 있음
    }
  };

  @Override
  public void onCreate(Bundle savedInstanceState) {
      ...

      vunglePub.init(this, app_id, placement_id_list, initCallback);
      vunglePub.clearAndSetEventListeners(vungleListener);

  };

 @Override
  public void onDestroy() {
      ...
      vunglePub.clearEventListeners();
      super.onDestroy();

  };
}</>pre

Vungle은 또한 SDK 초기화 이벤트 업데이트용 VunlgeInitListner을 제공합니다.

public void onSuccess();
public void onFailure(Throwable error);

UI 스레드 노트

콜백은 배경 스레드에서 실행되므로 이벤트 콜백에 의한 UI 상호 작용/업데이트는 실행 이전에 기본 UI 스레드로 전달되어야 합니다. UI 스레드에서 코드를 실행하는 대표적인 두 가지 방법은 다음과 같습니다.

구성 옵션

전역 광고 구성

init을 호출한 후 글로벌 AdConfig 객체를 설정해야 합니다. 기본적으로 각 playAd 호출에서 AdConfig 객체를 사용할 수 있습니다. 이 객체를 사용하면 재생하는 모든 광고에 자동으로 적용될 옵션을 설정할 수 있습니다.

public class FirstActivity extends android.app.Activity {
	...
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		...
		vunglePub.init(this, app_id, placement_list, new VungleInitListener() {
	 		@Override
			public void onSuccess() {
				//전역 AdConfig 객체에 대한 참조 얻기 
				final AdConfig globalAdConfig = vunglePub.getGlobalAdConfig(); 
				//사용 가능 옵션에 대한 전체 설명은 '구성 객체' 섹션 참조 
				globalAdConfig.setSoundEnabled(true);
			}
			@Override
			public void onFailure(Throwable e){

			}
		}); 
	...
	} 
}

단일 광고 구성

playAd를 호출할 때마다 Adconfig 객체를 사용해야 합니다.  하지만, 새로운 AdConfig 객체를 playAd에 제공하면 재생하는 광고를 각각 선택적으로 사용자 지정할 수 있습니다. 글로벌 광고 구성에서 어떠한 옵션을 설정하든, 이러한 옵션이 제공된 옵션에 의해 재정의됩니다. 다음 방법으로 재정의 AdConfig를 전달합니다.

public class GameActivity extends android.app.Activity {
  …
private void onLevelComplete() {
      //새로운 AdConfig 객체 생성
      final AdConfig overrideConfig = new AdConfig();

      overrideConfig.setSoundEnabled(false);

      //overrideConfig 객체는 이 광고 재생에만 적용됨
      vunglePub.playAd(yourPlacementId, overrideConfig);
  }
}

AdConfig 객체

재정의 AdConfig에는 각각의 광고 재생에 설정할 수 있는 옵션 집합이 있습니다. 사용할 수 있는 옵션의 목록은 아래와 같습니다.

메서드

기본값

설명

setOrientation

Orientation.matchVideo

Orientation.autoRotate는 광고가 기기 방향으로 자동 회전함을 나타냅니다.

Orientation.matchVideo는 광고가 동영상에 가장 적합한 방향(보통 가로)으로 재생됨을 나타냅니다.

setSoundEnabled

true

광고의 시작음 상태를 설정합니다. true에서는 오디오가 장치의 볼륨 및 소리 설정을 따릅니다. false에서는 비디오가 무음으로 시작되지만 사용자가 변경할 수 있습니다.

setBackButtonImmediatelyEnabled

false

true에서는 사용자가 뒤로 버튼을 사용해 즉시 광고를 끝낼 수 있습니다. false에서는 화면에 닫기 버튼이 나타날 때까지 사용자가 뒤로 버튼을 사용해 광고를 끝낼 수 없습니다.

setImmersiveMode

false

KitKat+ 장치에서 몰입형 모드를 사용하거나 중지합니다.

setIncentivizedUserId

none

해당 사용자에게 인센티브화 광고 시청에 대한 보상을 제공해야 하는지 확인하기 위해 애플리케이션에 고유한 사용자 ID가 전달되도록 설정합니다. 인센티브화 광고가 아닌 경우에는 해당되지 않습니다.

setIncentivizedCancelDialogTitle

"비디오를 닫을까요?"

인센티브화 광고를 건너뛸 경우 표시되는 확인 대화 상자의 제목을 설정합니다. 인센티브화 광고가 아닌 경우에는 해당되지 않습니다.

setIncentivizedCancelDialogBodyText

"이 비디오를 일찍 닫으면 보상을 받을 수 없습니다. 정말 닫을까요?"

인센티브화 광고를 건너뛸 경우 표시되는 확인 대화 상자의 본문을 설정합니다. 인센티브화 광고가 아닌 경우에는 해당되지 않습니다.

setIncentivizedCancelDialogCloseButtonText

"비디오 닫기"

인센티브화 광고를 건너뛸 경우 표시되는 확인 대화 상자의 '취소 버튼' 텍스트를 설정합니다. 인센티브화 광고가 아닌 경우에는 해당되지 않습니다.

setIncentivizedCancelDialogKeepWatchingButtonText

"계속 시청"

인센티브화 광고를 건너뛸 경우 표시되는 확인 대화 상자의 '계속 시청 버튼' 텍스트를 설정합니다. 인센티브화 광고가 아닌 경우에는 해당되지 않습니다.

setTransitionAnimationEnabled

false

표준 조각 전환 애니메이션을 사용하거나 중지합니다.

 

또 다른 질문이 있으십니까? 문의 등록

댓글