Розробка бібліотеки для IOS/Android на Golang



Платформна розробка мобільних додатків була дуже популярна в свій час. Даний підхід використали більшість компаній під час становлення мобільного галузі. Основні причини задіяти кроссплатформенную розробку були прості — відсутність професіональних кадрів на ринку, швидкість і вартість розробки. На жаль, в більшості випадків, даний підхід не виправдав себе.

Але чому б не дати йому другий шанс? Технології зробили крок вперед і теоретично ми можемо отримати дуже якісний продукт. У даній статті ми розглянемо на практиці як розробити бібліотеку для IOS/Android мовою Golang і подивимося з якими обмеженнями й проблемами ми зіткнулися в процесі розробки.

Наша основна задача розробити SDK для складання логів і крашей з мобільних додатків, при цьому SDK повинен підключатися і працювати з Android і з iOS додатками. У теж час бібліотека повинна взаємодіяти з основним сервісом LogPacker, який агрегує та аналізує дані.

Ми вирішили використовувати нові можливості мови Go для створення кроссплатформної бібліотеки. По-перше, наше основне додаток написано на Go, і для нас було простіше використовувати цю мову і не залучати Java/Objective-C розробників. По-друге, ми зекономили час на розробку і спробували старий підхід з новими можливостями.

Що таке gomobile?

Проект gomobile надає розробникам інструменти для складання коду під мобільні платформи Android і iOS.

Зараз існують два способи інтеграції Go в мобільну середовище:

  • Написання повноцінного Go-додатки без UI.
  • Генерація Java/Objective-C/Swift код з Go.
Дана функція підтримується починаючи з Golang версії 1.5. Нова утиліта gomobile допомагає компілювати Go в мобільні додатки або збирати Java/Objective-C/Swift код.

Для початку виберемо один із способів реалізації. Перший спосіб нам не підходить із-за постановки завдання — нам потрібна невелика бібліотека, а не окремий додаток. Хоча спосіб дуже цікавий і перспективний завдяки швидкості роботи go додатків і мінімізації споживання ресурсів мобільних пристроїв.
Ми виберемо другий спосіб, і згенеруємо Java/Objective-C/Swift код з Go.

Налаштування оточення

Для початку підготуємо оточення для розробки. Нам потрібен Go версії 1.5 або вище (чим вище — тим краще, Go-спільнота вносить постійні поліпшення в Go Mobile).

Далі встановлюємо утиліту gomobile і бібліотеку Android SDK. Почнемо з установки gomobile:
go get golang.org/x/mobile/cmd/gomobile

Примітка: На OS X необхідно мати встановлений Xcode Command Line Tools.

Далі ініціалізуємо gomobile, це може бути зроблено один раз у будь-якій робочій директорії:
gomobile init

Примітка: ця команда може зайняти кілька хвилин.

Для зборки Java-коду нам необхідний Android SDK і встановлена Java (OpenJDK достатньо).

Завантажити і распакуем Android SDK в домашню директорію, наприклад ~/android-sdk, і виконаємо наступну команду для установки API версій:
~/android-sdk/tools/android sdk

Далі встановіть змінну навколишнього середовища:
export ANDROID_HOME=$HOME"/android-sdk"

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

Загальний Go-код для Android і iOS

Один і той же код може бути використаний для подальшої компіляції під Android і iOS. Написання такого міжплатформового Go-коду має свої обмеження. В даний час ми можемо використовувати тільки певний набір типів даних. Розробляючи додаток Go, це необхідно враховувати. Розглянемо більш докладно підтримувані типи:
  • int і float;
  • string і boolean;
  • byte[]. Поточна реалізація не дозволяє використовувати []byte в якості аргументу функції (https://golang.org/issues/12113;
  • функція повинна повертати тільки підтримувані типи, може не повертати результат, повертати один тип або два типу, при тому, що другий тип повинен бути обов'язково error;
  • інтерфейси можуть бути використані, якщо при експорті вони будуть використовувати підтримуваний тип;
  • тип struct, тільки коли всі поля відповідають обмеженням.
Тому якщо тип не підтримується командою gomobile bind, ви побачите таку помилку:
panic: unsupported basic seqType: uint64

Безперечно набір підтримуваних типів сильно обмежений, але для реалізації нашого SDK цього цілком достатньо.

Складання та імпорт в Java/Objective-C/Swift

Gobind генерує еквівалентний Go-коду-код Java, Objective-C або Swift. На жаль, gomobile не працює для Windows Phone і це потрібно враховувати на етапі планування.

Зазвичай gobind не використовується безпосередньо, замість цього код генерується автоматично і обертається в пакет командою `gomobile bind`. Більш детально це описано тут golang.org/x/mobile/cmd/gomobile.

Розглянемо деякі команди та особливості процесу компіляції для кожної платформи.

Почнемо з прапора -target, який визначає платформу для генерації. Приклад для Android:
gomobile bind --target=android .

Ця команда згенерує з поточного коду .aar файл. Імпортувати цей файл в Android Studio дуже просто:
  • File > New > New Module > Import .JAR or .AAR package
  • File > Project Structure > app -> Dependencies -> Add Module Dependency
  • Додати імпорт: import go.logpackermobilesdk.Logpackermobilesdk






Примітка: В Java назва пакету для імпорту завжди починається з go.

Схожа команда використовується для складання Objective-C/Swift код:
gomobile bind --target=ios .

Буде створена папка .framework у поточній директорії.

Це працює як для Objective-C так і для Swift. Перемістіть .framework папку в файловий браузер Xcode і додайте імпорт в проект:
#import "Logpackermobilesdk/Logpackermobilesdk.h"



Примітка: Go дозволяє створювати не тільки SDK, але і компілювати сам додаток в апк/ipa файли з main.go файлу, правда без підтримки нативного мобільного UI. Безперечно це є дуже цікавим експериментом Go-спільноти.

Використання підключених пакетів

Gomobile bind автоматично створює функції getSomething(), setSomething(). Також всі експортовані функції будуть доступні публічно.

Для прикладу використання нашої бібліотеки в Android Studio:
import go.logpackermobilesdk.Logpackermobilesdk;
// ...
try {
client = Logpackermobilesdk.NewClient("https://logpacker.mywebsite.com", "dev", android.os.Build.MODEL);

msg = client.NewMessage();
msg.setMessage("Crash is here!");
// Use another optional setters for msg object

client.Send(msg); // Send will return Cluster response
} catch (Exception e) {
// Cannot connect to Cluster or validation error
}

Вона ж для Objective-C:
#import "ViewController.h"
#import "Logpackermobilesdk/Logpackermobilesdk.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
GoLogpackermobilesdkClient *client;
NSError *error;
GoLogpackermobilesdkNewClient(@"https://logpacker.mywebsite.com", @"dev", [[UIDevice currentDevice] systemVersion], &client, &error);
GoLogpackermobilesdkMessage *msg;
msg = client.newMessage;
msg.message = @"Crash is here!";
// Use another optional setters for msg object
GoLogpackermobilesdkResult *result;
[client send:(msg) ret0_:(&result) error:(&error)];
}

Як видно з прикладів вище, у підсумку ми отримали стандартні бібліотеки. Конфігурація бібліотек у додатку гранично проста і знайома розробникам.

Висновок

Всі розуміють, що створення окремих команд для розробки під кожну мобільну платформу — це не саме просте і дешеве задоволення. Але для створення якісного продукту це необхідно на даному етапі часу. З іншого боку, нашу невелику завдання ми змогли виконати в рамках кроссплатформної розробки і скористалися всіма її плюсами:
  • Мінімальні ресурси на розробку.
  • Швидкість розробки.
  • Проста підтримка вирішення в подальшому.
Мінусом є те, що ми не змогли зібрати бібліотеку під Windows Phone, але про це ми знали заздалегідь.
Ми сподіваємося, що незабаром з'явиться простий спосіб написання повноцінних додатків і SDK мовою Golang.

Ви можете ознайомитися з нашими напрацюваннями, склонировав наш репозиторій.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.