Подключить Firebase не получилось. Напишу по памяти, так как время прошло уже прилично и это мои собственные умозаключения не претендующие на истину.
Было много различных попыток подключить Firebase , основная проблема, что нет в наличии библиотеки jar, последняя библиотека лежит в maven репозитории и она уже устарела, по-моему от 2019 года.
Ссылка на maven репозиторий
Firebase, да и многие другие предлагают использовать только Gradle, что не дает мне возможность использовать это для Delphi .
После общения с поддержкой от Firebase (если сильно упростить), мне предложили изменить среду разработки. Но приложение уже было полностью готово для двух мобильных платформ, и мне пришлось искать другие SDK.
Я перебрал многие, которые предлагали помимо установки с помощью Gradle, скачать SDK в виде файла jar или aar (из aar иногда можно добыть jar, но это только иногда, например в последних firebase его там нет)
Забыл сказать, что для всех манипуляций, обязательно нужна установленная и запущенная Android Studio, и подключенный телефон, на который Delphi устанавливает приложение. В Android Studio я собрал проект с таким же именем, как и у моего Delphi приложения, для удобства отладки и контроля логов logcat. В приложение на Android Studio я подключил через Gradle нужное мне SDK и проверил его работоспособность, скопировал логи правильной работы приложения, отследил результаты на сайте аналитики, увидел что они действительно появились, и все данные телефона (размер экрана, марка ...) пришли в аналитику. Включил режим debag на стороне аналитики.
Эти действия я проделывал и с Firebase, приложение написанное на Android Studio запускалось без проблем, приложение написанное на Delphi, в силу отсутствия новой библиотеки jar не запускалось и сыпало в logcat целые "простыни" ошибок, никакие данные в аналитику не приходили.
Я пробовал вытащить нужную мне библиотеку Firebase из собранного в Android Studio dex файла, рабочего приложения. Затем вычленить из него нужные мне файлы и прикрепить их Delphiпроекту в виде jar библиотеки, но появлялась новая проблема, конфликты с уже установленными библиотеками на Delphi, отключение которых уже не позволяло собрать dex файл для Delphi проекта.
Остановился я на SDK AppsFlyer, интеграция была возможна, так как сервис предлагал добавление SDK с помощью Gradle и возможность скачать и установить вручную. Саму библиотеку я подключил, но возникла проблема с получением событий, которые приходили например от google play
Вот пример того что не получилось сделать:
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
Эти события, никак не удалось получить, и решить проблему не удалось, информации я не нашел.
Было принято решение попробовать другое SDK. На этот раз это была Yandex AppMetrica, эта интеграция получилась.
Для начала у них в доках по интеграции написано что есть возможность скачать jar и что все библиотеки (старые версии мне в дальнейшем тоже пригодились) есть в maven репозитории
Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи
Вот сама библиотека: com.yandex.androidmobmetricalib3.20.1.jar.7z
Файл мост я создавал с помощью утилиты java2op, которая находится в ... Embarcadero\Studio\21.0\bin\converters
Но, при создании я получил ошибку, что-то там дублировалось и что-то мешало. Пытался проделать это с конкретным классом, но ничего не получилось. Оставалось только или делать файл ручками, или надеяться что в одной из старых библиотек все сгенерируется. Эмпирическим методом была найдена старая библиотека, в которой название методов нужного мне класса осталось прежним, а ошибка с дубликатами ушла.
Файл мост был создан. Android.JNI.Yandex.pas.7z
Осталось подключить его к моему приложению. Был создан класс, который работал с нужными мне методами SDK Yandex аналитики (Android.JNI.Yandex):
unit YandexAnalytics;
interface
uses
System.SysUtils,
System.Types, System.UITypes, System.Classes, System.Variants,
{$IFDEF ANDROID}
Android.JNI.Yandex,
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Os,
Androidapi.JNI.App,
{$ENDIF}
FMX.Types;
type
TYandexMetrica = class
private
public
{$IFDEF ANDROID}
YAC : JYandexMetricaConfig;
YA : JYandexMetrica;
{$ENDIF}
constructor Create;
procedure SendEvent(Category, Action, LabelName : String; LabelValue : Integer);
end;
implementation
constructor TYandexMetrica.Create;
var
AnKey,
AnRepKey
: JString;
begin
try
AnKey := StringToJString('86e64a77-XXXX-XXXX-XXXX-XXXXXXXcbbc');
AnRepKey := StringToJString('20799a27-XXXX-XXXX-XXXX-XXXXXXX14180');
YAC := TJYandexMetricaConfig.JavaClass.newConfigBuilder(AnKey).withLogs().build;
YA := TJYandexMetrica.Create;
TJYandexMetrica.JavaClass.activate(TAndroidHelper.Context, YAC);
TJYandexMetrica.JavaClass.enableActivityAutoTracking( TAndroidHelper.Activity.getApplication );
Log.d('================= TYandexMetrica.Created ======================');
EXCEPT on E : Exception do
Begin
Log.d( E.ClassName + 'YandexMetrica.Create -> ' + E.Message );
End;
END;
end;
procedure TYandexMetrica.SendEvent(Category, Action, LabelName : String; LabelValue : Integer);
begin
{$IFDEF ANDROID}
try
Log.d( 'TRY YandexMetrica.SendEvent -> ' + Category + ',' + Action + ',' + LabelName + ',' + LabelValue.ToString );
TJYandexMetrica.JavaClass.reportEvent(StringToJString(Category),
StringToJString('{"Action":"' + Action + '", "LabelName":"' + LabelName + '", "LabelValue":"' + LabelValue.ToString + '"}'));
Log.d('================= Event Sended ======================');
EXCEPT on E : Exception do
Begin
Log.d( E.ClassName + 'YandexMetrica.SendEvent -> ' + E.Message );
End;
END;
{$ENDIF}
end;
end.
В событии приложения onCreate создал экземпляр класса, и отправил событие
YA := TYandexMetrica.Create;
YA.SendEvent('AppEvent','Started',User.Client_Id, 0);
Было добавлено в файл AndroidManifest.template.xml (информация из яндекс документов по интеграции)
<%services%>
<service android:name="com.yandex.metrica.MetricaService" android:enabled="true" android:exported="true" android:process=":Metrica">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.yandex.metrica.IMetricaService" />
<data android:scheme="metrica" />
</intent-filter>
<meta-data android:name="metrica:api:level" android:value="16" />
</service>
<receiver android:name="com.yandex.metrica.MetricaEventHandler" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.yandex.metrica.intent.action.SYNC" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<data android:scheme="package" />
</intent-filter>
<!-- Необходимо для трэкинга кампаний -->
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
Пример логов из logcat, из которых видно что библиотека инициализирована, и отправлены два события [AppEvent] и [Balance]
2021-07-01 14:02:17.108 15138-15168/? I/AppMetrica: [ru.yandex.mobile.appmetrica] : [27889a6e-xxxx-xxxx-xxxx-xxxxxxxx3c64] Initializing of Metrica, Release type, Version 3.5.3, API Level 76, Dated 30.01.2019.
2021-07-01 14:58:48.979 18460-18460/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021.
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: Activate AppMetrica with APIKey 86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Enable activity auto tracking
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"Started", "LabelName":"2905202123125", "LabelValue":"0"}
2021-07-01 14:58:49.034 18460-18531/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180
2021-07-01 14:58:49.233 18542-18567/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021.
2021-07-01 14:58:49.263 18542-18567/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180
2021-07-01 14:59:13.975 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"ProfilesDeleted", "LabelName":"alex", "LabelValue":"319"}
2021-07-01 14:59:31.368 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: Balance. With value: {"Action":"TrStart", "LabelName":"2905202123125", "LabelValue":"3"}
Вот такие данные пришли в аналитику. +1 пользователь