1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dwightwong-RePluginForAD

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Перевод текста на русский язык:

Сначала кратко опишу проблемы, с которыми мы столкнулись в рекламе. После того как приложение получило определённое количество пользователей, обычно возникает желание подключить стороннюю рекламу для монетизации. Однако во многих странах не разрешают размещать приложения с рекламой сторонних компаний, если только это не реклама от их собственных платформ. В этом случае я могу только усмехнуться. Эти трудности кажутся непреодолимыми для нас.

Что же делать дальше? Всё верно, речь идёт о плагинах. В качестве примера я использую 360 с открытым исходным кодом RePlugin (https://github.com/Qihoo360/RePlugin), а более подробное описание и инструкции по использованию можно найти в официальной документации.

1. Руководство по подключению плагина RePlugin Шаг 1: добавьте зависимость RePlugin Plugin Gradle Добавьте зависимость replugin-plugin-gradle в build.gradle (обратите внимание: не app/build.gradle) в корне проекта:

buildscript {
    dependencies {
        classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.0'
        ...
    }
}

Шаг 2: добавьте зависимость библиотеки RePlugin Plugin В app/build.gradle примените плагин replugin-plugin-gradle и добавьте зависимость replugin-plugin-lib:

apply plugin: 'replugin-plugin-gradle'

dependencies {
    compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.0'
    ...
}

Теперь вы можете разрабатывать плагины так же, как и при обычном подключении рекламы. Результатом будет APK, который можно «установить на устройство» или «использовать в качестве плагина».

2. Руководство по подключению основной программы RePlugin Шаг 1: добавьте зависимость Host Gradle Добавьте зависимость replugin-host-gradle в файл build.gradle в корне проекта (обратите внимание: не в app/build.gradle):

buildscript {
    dependencies {
        classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.0'
        ...
    }
}

Шаг 2: добавьте зависимость хост-библиотеки RePlugin В файле app/build.gradle примените плагин replugin-host-gradle и добавьте зависимость replugin-host-lib:

apply plugin: 'replugin-host-gradle'
repluginHostConfig {
    useAppCompat = true
}
dependencies {
    ...
    compile 'com.qihoo360.replugin:replugin-host-lib:2.1.7'
}

Шаг 3: настройте класс Application

public class App extends Application{
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        RePlugin.App.attachBaseContext(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        RePlugin.App.onCreate();
    }
}

3. Вызов плагина рекламы из хост-приложения

  1. Скомпилируйте плагин рекламы, и полученный xx.apk переименуйте в xx.jar. Поместите xx.jar в каталог assets/plugins хост-приложения. RePlugin автоматически получит этот встроенный плагин.

  2. Обработка рекламы GDT (Guangdian Tong). Поскольку все клики в рекламе GDT обрабатываются SDK, мы используем следующий подход: хост-приложение переходит к заставке плагина, после чего в плагине завершается запрос, показывается реклама, и после клика пользователь возвращается на главную страницу хоста. (1) Хост-приложение переходит на активность плагина:

try {
    String config = AssetsUtils.readText(MainActivity.this, "ad_config.json");
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("adPlugin", "com.plugin.ad.LogoActivity"));
    intent.putExtra("EXTRA_CONFIG", config);
    intent.putExtra("EXTRA_POI", POI_FIRST);
    RePlugin.startActivity(MainActivity.this, intent);
} catch (Throwable e) {
    e.printStackTrace();
}

(2) Плагин обрабатывает запрос на показ рекламы GDT и действует согласно обычной логике рекламы.

(3) Плагин возвращается на главную страницу хост-приложения:

private void intoMainPage() {
    //TODO 打开宿主应用
    Intent intent = new Intent();
    intent.setClassName("com.wifi.robot", "com.wifi.robot.ui.SecondActivity");
    startActivity(intent);
    finish();
}

(4) В файле манифеста хост-приложения добавьте необходимые настройки, иначе реклама не будет реагировать:

<!-- 广点通广告 -->
<service
    android:name="com.qq.e.comm.DownloadService"
    android:exported="false" />
<activity
    android:name="com.qq.e.ads.ADActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />

Примечание: чтобы избежать проблем с отсутствием прибыли от рекламы, рекомендуется сделать имена пакетов хост-приложений и плагинов максимально похожими.

  1. Обработка нативной рекламы GDT. Нативная реклама GDT отличается от заставочной тем, что и экспозиция показа, и экспозиция кликов обрабатываются самостоятельно. Мы можем запросить рекламу только через рефлексию.

(1) Сначала в плагине мы делаем слой упаковки для запроса рекламы:

package com.plugin.ad.managers;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;

import com.plugin.ad.listeners.ILoadListener;
import com.plugin.ad.models.ADModel;
import com.plugin.ad.models.ModelManager;
import com.plugin.ad.utils.JsonUtil;

/**
 * 广告请求管理类
 * Created by wong on 17-8-16.
 */
public class LoadManager {
    /**
     * 初始化
     *
     * @param config
     */
    private static void onInit(String config) {
        ADModel adModel = JsonUtil.getInstance().fromJson(config, ADModel.class);
        ModelManager.operationNativeConfig(adModel.place_ids);
        ModelManager.putAdKey("gdt", adModel.gdt_key);
    }
``` **Запрос на нативную рекламу**

public static void requestNativeAD(Context context, String config, int poi, final ILoadListener listener) { onInit(config); LoadGdtManager.loadAD(context,poi,listener); }


**Запрос рекламы**

public static void loadAD(Context context, final int poi, final ILoadListener listener) { NativeAD nativeAD = new NativeAD(context, getGdtKey(), getGdtId(poi), new NativeAD.NativeAdListener() { @Override public void onADLoaded(List list) { if (null != list && !list.isEmpty()) { listener.gdtNativeSuccess(poi, list.get(0)); } else { listener.failure("Empty"); } }

        @Override
        public void onNoAD(int i) {
            listener.failure("onNoAD->" + i);
        }

        @Override
        public void onADStatusChanged(NativeADDataRef nativeADDataRef) {
        }

        @Override
        public void onADError(NativeADDataRef nativeADDataRef, int i) {

        }
    });
    nativeAD.loadAD(1);
}
(2) В хосте отражение метода requestNativeAD() класса LoadManager
a. Получение ClassLoader плагина

ClassLoader classLoader = RePlugin.fetchClassLoader("adPlugin");

b. Получение необходимого класса

Class<?> methodClass = classLoader.loadClass("com.plugin.ad.managers.LoadManager");

c. Поскольку метод requestNativeAD(), запрашивающий рекламу, имеет один параметр — интерфейс.
(Здесь необходимо использовать динамический прокси)
Получение интерфейса, который будет проксироваться

/**

  • Интерфейс, который будет проксироваться / Class<?> callBackClass = classLoader.loadClass("com.plugin.ad.listeners.ILoadListener"); /*
  • Это динамический прокси
  • callBackClass: класс интерфейса, который нужно проксировать
  • proxListener: возвращает экземпляр этого проксируемого интерфейса */ Object proxListener = LoadCallBackProx.getInstance(classLoader, callBackClass);
d. Далее происходит отражение запроса интерфейса

/**

  • callBackClass: класс проксируемого интерфейса
  • proxListener: экземпляр проксируемого интерфейса */ Method load = methodClass.getDeclaredMethod("requestNativeAD", new Class[]{Context.class, String.class, int.class, callBackClass}); load.invoke(null, RePlugin.fetchContext("adPlugin"), config, poi, proxListener);
Обратите внимание, что передаваемый Context должен быть контекстом плагина.
e. В динамическом прокси получение обратного вызова

public class LoadCallBackProx implements InvocationHandler { /**

  • Здесь можно напрямую получить объект и поместить массив объектов байт-кода этого интерфейса внутрь */ public static Object getInstance(ClassLoader classLoader, Class<?> interfaces) { return Proxy.newProxyInstance(classLoader, new Class[]{interfaces}, new LoadCallBackProx()); }

/**

  • @param o
  • @param method: конкретное имя метода
  • @param objects: параметры метода обратного вызова проксируемого класса
  • @return
  • @throws Throwable */ @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { // Определить, какой метод был вызван String methodName = method.getName(); if ("gdtNativeSuccess".equals(methodName)) { int poi = (Integer) objects[0]; Object object = objects[1]; ReAdFactory.putNativeAD(poi, object); EventHelper.post(new ReNativeAdEvent(poi, object, true)); } else if (methodName.equals("failure")) { EventHelper.post(new ReNativeAdEvent(false)); } return null; } }
Здесь я использовал EventBus для передачи обратных вызовов рекламы в запрошенный интерфейс

/**

  • Нативный поток информации
  • Запрос плагина на рекламу */ @Subscribe public void onEventReADEvent(ReNativeAdEvent event) { if (event.isSucc) { // Успех try { Object object = ReAdFactory.getNativeAD(POI_SECOND); // Показать String title = (String) object.getClass().getMethod("getTitle").invoke(object); String iconUrl = (String) object.getClass().getMethod("getIconUrl").invoke(object); // Отражение вызова интерфейса экспонирования object.getClass().getMethod("onExposured", new Class[]{View.class}).invoke(object, findViewById(R.id.activity_main)); } catch (Exception e) { e.printStackTrace(); } }

**Отражение при нажатии на рекламу**

/**

  • Нажатие на нативную рекламу */ private void clickNativeAD() { try { Object object = ReAdFactory.getNativeAD(POI_SECOND); // Вызов метода нажатия на нативную рекламу object.getClass().getMethod("onClicked", new Class[]{View.class}).invoke(object, findViewById(R.id.activity_main)); } catch (Exception e) { e.printStackTrace(); } }

Четыре. Наконец, это моя первая статья, буду рад отзывам.

Хост-приложение: https://github.com/AndWong/RePluginHostForAD/tree/master/app

Приложение плагина: https://github.com/AndWong/RePluginHostForAD/tree/master/pluginApp

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Проблема невозможности размещения рекламы в приложениях, которые были созданы с использованием плагинов Android. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/dwightwong-RePluginForAD.git
git@api.gitlife.ru:oschina-mirror/dwightwong-RePluginForAD.git
oschina-mirror
dwightwong-RePluginForAD
dwightwong-RePluginForAD
master