Metin2 Android istemcisini derle ve test sunucuna bağlan
Cemre Android portunu derle, uyumlu verileri hazırla ve test sunucunu yapılandır. ABI, protokol ve port sorunlarını gider.
Seçilen istemci ve kapsam
Android'de Metin2'nin tam istemcisini çalıştırmak için incelediğimiz herkese açık kaynak kodlu projeler arasında en kullanışlı başlangıç cemreefe/metin2-android projesi. Orijinal C++ istemciyi, Android başlatıcısını, dokunmatik girdileri, yerel kitaplıkları ve uyumlu bir sunucuya bağlanma rehberini içeriyor. Bu kılavuz 4ac33651d49000de95e520e6de4373213dc54405 revizyonunu temel alıyor. Her özel sunucu için geçerli evrensel bir APK değil; istemci, oyun verileri ve sunucu uyumlu olmalı.
Açık kaynak nitelemesi için önemli bir not: 25 Ekim 2026 kontrolünde ana depoda istemcinin tamamını kapsayan bir lisans yoktu. Kodun herkese açık olması, onu yeniden dağıtma hakkı vermez. OpenGr2ndma bileşeni MPL-2.0 lisanslı; bu, istemcinin geri kalanı veya oyun verileri için geçerli değil. Bu rehber oyun verisi ya da verileri içeren APK sunmuyor. Seçilen kaynak revizyonu, OpenGr2ndma lisansı.

İllüstrasyon: istemci hazırlanırken telefonda görülen tanınabilir bir Metin2 karakteri. Bu görsel derleme veya oyun ekran görüntüsü değildir.
Bu projeyi neden seçtik ve forumlarda ne bulduk
Turkmmo'daki Metin2 Mobile & PC Cross Platform Source konusu giriş yaptıktan sonra BGFX/OpenGL arşivlerini gösteriyor. İncelediğimiz opengl.zip içinde gerçekten bir Android projesi ve C++ istemcisi var. Ancak derleme için gereken Android .a/.so kitaplıkları eksik; Windows Granny kitaplığı bunların yerini tutmuyor. Hazır APK, tam Gradle wrapper'ı veya istemcinin tamamı için lisans bulamadık. Dosyaları inceledik, içlerindeki programları çalıştırmadık.
Daha yeni Mobile Source … Full başlıklı konu yazısında bir Unity prototipi anlatıyor. Dokunmatik kontroller ile Android/iOS desteği gelecekte yapılacak işler arasında. Bağlantıdaki büyük arşivi incelemedik; konu başlığı tek başına tamamlanmış bir mobil istemci kanıtı değil.
| Proje | Herkese açık kaynaklarda görülenler | Bu rehber için anlamı |
|---|---|---|
| Cemre Android portu | C++/Java, iki ABI için kitaplıklar, profiller, veri yükleyici, dokunmatik arayüz ve yerel sunucu kodu | İncelenenler arasındaki en güçlü aday; ana istemcinin lisansı belirsiz |
| Turkmmo'da paylaşılan OpenGL arşivi | Android iskeleti ve kapsamlı istemci kodu, fakat Android kitaplıkları eksik | Daha fazla portlama ve bağımlılık çalışması gerekiyor |
| M2Dev'de Metin2ToUnity | Oyun varlıklarını dönüştürme araçları | İçe aktarıcı, tam bir ağ istemcisi değildir |
| metin2-godot | Kendi kodu için MIT lisansı, belgelenmiş geliştirme adımları | İlginç bir geliştirme tabanı; hazır Android portu değil |
Portun yazarı giriş yapabildiğini, dünyaya girdiğini, savaştığını, envanteri açtığını ve kayıt aldığını bildiriyor. Başlıca kanıtları x86_64 emülatörden; fiziksel arm64 telefon ve uzun oyun oturumları ayrıca denenmeli. Projelerin geneli için Metin2 mobil istemcileri incelememize bakabilirsin.
Önce sınanabilir bir yapılandırma seç
Ana adımlar Android istemcisini yerel ağdaki kendi test sunucuna bağlar. Sunucuyu ayrı bir Linux makinede veya sanal makinede çalıştır; telefonu aynı Wi-Fi ağına bağla. Sunucuyu APK içine gömme seçeneği rehberin sonunda ayrıca anlatılıyor.
| Bileşen | Kullanılan sabit revizyon/sürüm |
|---|---|
| Android istemcisi | 4ac33651d49000de95e520e6de4373213dc54405 |
| m2dev-server-src | 66068c1 |
| m2dev-server: yapılandırma, haritalar, SQL ve görevler | ad30738 |
| Beklenen m2dev-client veri yapısı | 98d2c1af; yalnızca kullanma hakkın olan veriyi kullan |
| Java / Gradle | JDK 17 / Gradle 8.1.1 |
| Android araçları | platform 33, Build Tools 33.0.1, NDK 25.2.9519653, CMake 3.22.1 |
| Hedef ABI | Uyumlu telefon için arm64-v8a; uyumlu emülatör için x86_64 |
Build Tools 33.0.1, app/build.gradle içinde belirtiliyor. Upstream kurulum örneğinde farklı bir yama sürümü yer alıyor. Sabitlenmiş sürümleri gelişigüzel en yenileriyle değiştirme.
1. Araçları kur ve tam revizyonu çek
Komutlar Linux'ta Bash içindir. Android SDK ve ayrı Gradle 8.1.1 kurulumunun gerçek yollarını ayarla. JDK 17, JAVA_HOME içinde etkin olmalı. SDK'yı resmi Android araçlarıyla kur; yeni lisans koşullarını kendin oku ve kabul et. SDK Manager belgeleri.
java -version
gradle --version
sdkmanager "platforms;android-33" "build-tools;33.0.1" \
"ndk;25.2.9519653" "cmake;3.22.1" "platform-tools"
mkdir -p "$HOME/metin2-lab"
cd "$HOME/metin2-lab"
git clone https://github.com/cemreefe/metin2-android.git
cd metin2-android
git checkout --detach 4ac33651d49000de95e520e6de4373213dc54405
git submodule update --init --recursive
git submodule status
export M2_REPO="$PWD"
export M2_ANDROID="$M2_REPO/r10dev.net OPENGL-ITJA/android"
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export GRADLE="/opt/gradle-8.1.1/bin/gradle"
printf 'sdk.dir=%s\n' "$ANDROID_SDK_ROOT" > "$M2_ANDROID/local.properties"
Bu revizyonda OpenGr2ndma 210f5c326531297495c24e7bb1e24dc1b1a77833 commit'ine sabitlenmiş. Alt modülü atlamak CMake hatasına yol açar; GitHub ZIP'i indirmek onu otomatik olarak hazırlamaz. Boşluk içeren r10dev.net OPENGL-ITJA yolunu tırnak içinde tut.
2. Profil oluştur ve harici sunucu listesini kapat
Aşağıdaki değerleri profiles/home.properties dosyasına yaz. 192.168.1.50 yerine Linux sunucunun yerel IP adresini koy. Telefonda 127.0.0.1 telefonun kendisidir; başka bilgisayardaki sunucuyu göstermez.
m2.abi=arm64-v8a
m2.serverMode=remote
m2.serverHost=192.168.1.50
m2.authPort=11000
m2.channelPort=11011
m2.gamePortOffset=0
m2.applicationIdSuffix=.lab
m2.appLabel=Metin2 Local Lab
m2.versionName=home
m2.dataBundled=false
m2.dataUrl=
m2.dataVersion=1
m2.serverListUrl=
m2.devUrl=
m2.updateChannel=
servers/servers.json dosyasında yalnızca kendi test sunucun olsun:
{
"version": 1,
"servers": [
{
"name": "Home Lab",
"host": "192.168.1.50",
"authPort": 11000,
"channelPort": 11011
}
]
}
m2.serverListUrl= değerinin boş bırakılması bilinçli. Bu ayar yoksa derleme yazarın varsayılan uzak sunucu listesini kullanır. Boş m2.devUrl= isteğe bağlı tanılama yüklemelerini ve güncelleme kontrolünü kapatır. Böylece laboratuvar sürümünde başkasının geliştirme sunucusu listelenmez. Ayrıntılar: ServerCatalog.java ve DevReporter.java.
3. Oyun verisi eklemeden APK derle
Bu adım araç zinciri ve yerel kitaplık hatalarını veri ya da sunucu sorunlarından ayırır. Derlemenin başarılı olması, oyun dünyasına girilebildiğini tek başına göstermez.
cd "$M2_ANDROID"
"$GRADLE" --no-daemon --max-workers=4 assembleDebug \
-Pm2profile=home -Pm2abi=arm64-v8a
ls -lh app/build/outputs/apk/debug/app-debug.apk
x86_64 emülatör için son parametreyi -Pm2abi=x86_64 yap. ABI hedef cihazla eşleşmeli. Bu inceleme sırasında depoda hazır, herkese açık APK yoktu; bu komut kendi debug sürümünü oluşturur.
Gözlemlediğimiz derleme sonucu
Windows'ta değiştirilmemiş revizyonu ilk derlememiz C++ aşamasında durdu: oyunun UserInterface/Locale.h başlığı sistemdeki <locale.h> dosyasının önüne geçiyordu. Ayrı çalışma kopyasında clientsource/CMakeLists.txt içindeki include_directories(...) listesinden ${CMAKE_CURRENT_SOURCE_DIR}/UserInterface satırını çıkardık ve listenin hemen arkasına şunu ekledik:
add_compile_options("-iquote${CMAKE_CURRENT_SOURCE_DIR}/UserInterface")
Oyun dizini tırnaklı başlıklarda kullanılmaya devam ederken sistem başlıklarının aranmasını engellemez. Bu değişiklikle x86_64 için assembleDebug başarılı oldu ve yerel istemci kitaplığını içeren APK üretildi. Bu, değiştirilmiş çalışma kopyasının derlemesini doğrular; değiştirilmemiş upstream'in her Windows bilgisayarında derleneceği anlamına gelmez. Linux adımları yazarın kodu ve rehberini izler. Oyun dünyasına giriş, fiziksel telefon, performans veya gömülü sunucu burada test edilmedi.
4. Uyumlu verileri verilen betikle hazırla
Beklenen dizin yapısına sahip veri checkout'unu ~/metin2-lab/client-data konumuna koy ve bu verileri kullanma hakkına sahip ol. Bu rehber özgün model, harita ya da müzikler için hak vermez. Başka bir özel sunucudan rastgele alınan pack doğrulanmış bir ikame değildir; proto dosyaları, Python arayüzü ve biçimler değişebilir.
sudo apt install rsync patch python3-pil libsodium23 liblzo2-2 zip imagemagick ninja-build
export M2_DATA="$HOME/metin2-lab/client-data"
export M2_STAGE="$HOME/metin2-lab/staged-data"
test -d "$M2_DATA/assets/root"
"$M2_ANDROID/tools/stage_client_data.sh" "$M2_DATA" "$M2_STAGE" en
stage_client_data.sh pack'leri sırayla birleştirir, root dizinini en üste koyar, item_proto/mob_proto dosyalarını dönüştürür ve uyumluluk betikleri, ölçekleme ve dokunmatik HUD ekler. Renderer'ı suçlamadan önce staging çıktısını kontrol et. Korece dosya adlarını topluca küçük harfe çevirme.
İstemci ayrıca Python 2.7.18 standart kitaplığının Lib dizinini bekler; ana sistemdeki Python 3 bunu karşılamaz. Resmi Python 2.7.18 kaynak arşivini ayrı bir çalışma dizinine aç. Örneğin M2_PYLIB=~/metin2-lab/python-2.7.18/Lib ayarla. Python 2 sıradan sunucu hizmetleri için desteklenen bir çalışma ortamı değildir; burada eski istemcinin bağımlılığıdır.
Veriyi APK içine koymak için home.properties içindeki m2.dataBundled=true değerini ayarla ve:
export M2_PYLIB="$HOME/metin2-lab/python-2.7.18/Lib"
test -f "$M2_PYLIB/os.py"
M2_CLIENT_DATA="$M2_STAGE" M2_PYLIB="$M2_PYLIB" \
M2_BUNDLE_OUT="$HOME/metin2-lab/bundle" GRADLE="$GRADLE" \
"$M2_ANDROID/tools/make_bundle.sh" home 1
Çıktı ~/metin2-lab/bundle/metin2-home-1.apk ile sürümlenmiş bir veri ZIP'idir. Hazırlanan veriler, ZIP ve APK için disk alanı bırak. Veriyi değiştirince m2.dataVersion değerini artır; yalnızca eski ZIP'i silmek kurulu uygulamanın aynı sürümü yeniden açmasını sağlamaz. APK derleme numarası ayrıdır. Ayrıntılar make_bundle.sh içinde.
5. Uyumlu sunucuyu ve erişilebilir core adreslerini hazırla
Bu bölüm yazarın kendi sunucunu çalıştırma rehberini izler. Ayrı bir Linux test sanal makinesi kullan; üretim sunucusunda değişiklik yapma. Upstream Ubuntu 22.04, g++ 11, CMake 3.22 ve MariaDB 10.6 sürümlerini belirtiyor.
sudo apt install build-essential cmake git mariadb-server python3
cd "$HOME/metin2-lab"
git clone https://github.com/d1str4ught/m2dev-server-src.git
git -C m2dev-server-src checkout --detach 66068c1
git -C m2dev-server-src apply "$M2_REPO/server/m2dev-server-src-linux.patch"
cmake -S m2dev-server-src -B m2dev-server-src/build -DCMAKE_BUILD_TYPE=Release
cmake --build m2dev-server-src/build -j4
git clone https://github.com/d1str4ught/m2dev-server.git m2srv
git -C m2srv checkout --detach ad30738
cp m2dev-server-src/build/bin/{db,game,qc} m2srv/share/bin/
cp m2srv/share/bin/qc m2srv/share/locale/english/quest/qc
(cd m2srv/share/locale/english/quest && python3 make.py)
Başlamadan veritabanlarını ve yetkileri kısıtlı bir kullanıcıyı oluştur. SQL bu adlarda önceden veritabanı bulunmayan yeni ve ayrı bir sanal makine içindir. sudo mariadb içinde DOPLN_VLASTNI_HESLO metninin iki örneğini de aynı güçlü parolayla değiştir; bu yer tutucuyla SQL'i çalıştırma.
CREATE DATABASE account;
CREATE DATABASE common;
CREATE DATABASE player;
CREATE DATABASE log;
CREATE DATABASE hotbackup;
CREATE USER 'm2lab'@'127.0.0.1' IDENTIFIED BY 'DOPLN_VLASTNI_HESLO';
CREATE USER 'm2lab'@'localhost' IDENTIFIED BY 'DOPLN_VLASTNI_HESLO';
GRANT ALL ON account.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON common.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON player.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON log.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON hotbackup.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
Ardından sağlanan dört şemayı içe aktar. Runtime rehberine göre hotbackup başlangıçta boş kalmalı:
cd "$HOME/metin2-lab/m2srv"
for db in account common player log; do
sudo mariadb "$db" < "sql/$db.sql"
done
share/conf/db.txt içinde SQL_ACCOUNT, SQL_PLAYER, SQL_COMMON, SQL_HOTBACKUP satırlarındaki kullanıcı/parolayı kendi m2lab değerlerinle değiştir. share/conf/game.txt dosyasında da ACCOUNT_SQL, PLAYER_SQL, COMMON_SQL ve LOG_SQL için aynısını yap. Diğer değerleri ve iki dosyadaki farklı alan sıralamasını koru. Gerçek parolaları açık bir Git deposuna koyma. DB yapılandırması, oyun yapılandırması.
MariaDB yalnızca 127.0.0.1 adresini dinlesin; telefon veritabanına bağlanmamalı. Bu sanal makinede /etc/mysql/mariadb.conf.d/99-metin2-lab.cnf dosyasında [mysqld] altına şunu ekle:
[mysqld]
bind-address=127.0.0.1
sql_mode=NO_ENGINE_SUBSTITUTION
sudo systemctl restart mariadb sonrasında mariadb -h 127.0.0.1 -u m2lab -p account ile bağlantıyı dene. Parolayı komut satırında değil, sorulduğunda gir. Eski runtime bu SQL moduna ihtiyaç duyuyor; başka bir projenin ortak veritabanına uygulama.
Bu veritabanında yeni bir test hesabı oluştur; dump içinde önceden hazırlanmış hesaplar da var. Örnekteki değerleri kendi test bilgilerinle değiştir:
INSERT INTO account.account (login, password, social_id, status)
VALUES ('VLASTNI_TEST_LOGIN', PASSWORD('VLASTNI_TEST_HESLO'), '1234567', 'OK');
Veritabanlarını hazırlayınca m2srv içinde python3 install.py çalıştır. Betik yapılandırmaları üretir. Ardından telefonun ulaşabildiği IP adresini her oyun channels/channel1/coreN/CONFIG dosyasına koy:
BIND_IP: 192.168.1.50
Otomatik adres bulma sunucunun yerel IP'sini atlayabilir. Her core kendi adresini de istemciye bildirir. install.py bu dosyaları yeniden ürettiği için onu tekrar çalıştırınca ayarı yeniden kontrol et.
| Bağlantı | Varsayılan TCP portu | Telefondan erişim |
|---|---|---|
| Giriş | 11000 | Evet, yalnızca test LAN'ında |
| Channel 1 oyun core'ları | 11011, 11012, 11013 | Üçü de; harita değişimi istemciyi yönlendirebilir |
| DB süreci | 9000 | Sunucu içi iletişim |
| Core'lar arası P2P | 12000 ve üzeri | Sunucu içi iletişim |
m2srv içinde channel'ı python3 start.py 1 ile başlat, python3 stop.py ile durdur. Giriş ve üç core'un loglarını kontrol et. Giriş çalışıp karakter seçiminden sonra sunucu listesine dönüyorsa önce hedef core'un IP ve portunu incele. Yalnızca giriş portuna ulaşmak yetmez.
Sunucuyu gelişigüzel güncelleme. 0cc595bf097dcf89ddba60615e56fe790823cd22 commit'inden itibaren el sıkışma libsodium/XChaCha20 kullanan 0xf8 protokolüne geçiyor. Bu istemci eski 0xfb/0xfa el sıkışmasını bekliyor. Daha yeni sunucu için protokolü istemciye gerçekten portlamak gerekir; IP veya parola değiştirmek sorunu çözmez.
6. Telefona kur ve ilk çalıştırmayı incele
adb devices
adb shell getprop ro.product.cpu.abilist
adb install -r "$HOME/metin2-lab/bundle/metin2-home-1.apk"
adb shell pm path com.metin2.client.lab
Uygulamayı aç, kendi Home Lab sunucunu seç ve yalnızca bu sunucudaki test hesabınla giriş yap. Bu profilin paket adı com.metin2.client.lab; dış uygulama verileri genelde burada:
adb shell ls /sdcard/Android/data/com.metin2.client.lab/files/
adb shell cat /sdcard/Android/data/com.metin2.client.lab/files/syserr.txt
adb logcat -d > metin2-android-logcat.txt
Temel paket com.metin2.client, upstream offline profili com.metin2.client.offline kullanır. Yolları karıştırma. Uygulama getExternalFilesDir(null) kullanır; cihazdaki gerçek uygulama dizinini kontrol et. Güncelleme başarısızsa ABI, paket adı ve APK imzasını incele. Uygulamayı düşünmeden kaldırmak offline karakterleri silebilir.
| Belirti | Önce kontrol edilecekler |
|---|---|
| CMake OpenGr2ndma'yı bulamıyor | Alt modül başlatıldı mı, doğru commit'te mi |
| APK bu ABI'ye kurulmuyor | ro.product.cpu.abilist ile -Pm2abi eşleşiyor mu |
| Girişten hemen sonra bağlantı kesiliyor | Sunucu el sıkışma sürümü, ardından loglar |
| Karakter seçiminden sonra geri dönüyor | Yönlendirilen IP, BIND_IP ve tüm core portları |
| Arayüz yok veya ekran siyah | Staging çıktısı, protolar, Python Lib, syserr.txt |
| Güncellemeden sonra eski veri var | Daha yüksek m2.dataVersion, profil ve veri ZIP'i |
Sunucunun tamamını APK içine koymak
Upstream'deki bundled profili Android sunucu süreçlerini derler, MySQL yerine SQLite katmanı ekler ve sunucu verisini istemciyle paketler. Böylece telefon uzak sunucuya ihtiyaç duymaz. Bunun için ayrı bir derleme ve veri paketi gerekir; 3. adımdaki APK bunu kendiliğinden yapmaz.
Offline moddan önce servers/servers.json dosyasını bu yerel sunucu listesiyle değiştir:
{
"version": 2,
"servers": [
{ "name": "Single Player", "embedded": true }
]
}
Aksi halde önceki LAN adımlarındaki uzak Home Lab listede tek başına kalır. profiles/bundled.properties içinde m2.serverListUrl=, m2.devUrl= ve m2.updateChannel= değerlerini boş bırak. m2.serverMode=embedded, m2.dataBundled=true ve .offline sonekini koru. Yeni veri paketi için m2.dataVersion değerini artır. Source/runtime checkout'ları hazır olunca:
"$M2_REPO/r10dev.net OPENGL-ITJA/server/tools/make-server-pack.sh" \
"$HOME/metin2-lab/m2srv" \
"$HOME/metin2-lab/m2dev-server-src" \
"$HOME/metin2-lab/server-pack"
M2_SERVER_PACK="$HOME/metin2-lab/server-pack" \
M2_CLIENT_DATA="$M2_STAGE" M2_PYLIB="$M2_PYLIB" \
M2_BUNDLE_OUT="$HOME/metin2-lab/bundle" GRADLE="$GRADLE" \
"$M2_ANDROID/tools/make_bundle.sh" bundled 1
Önce bundled.properties, kendi sunucu kataloğunu, dataVersion değerini ve seed veritabanındaki test hesabını kontrol et. make-server-pack.sh sırasıyla runtime checkout, source checkout ve çıktı dizini bekler. Upstream web bölümündeki farklı örneği buraya kopyalama. Gömülü sunucu Gradle görevi Linux'a özgü NDK yolları içeriyor; Windows'ta offline derleme burada doğrulanmadı.
Başarılı derleme, açılan uygulama, giriş ve kesintisiz oyun farklı sonuçlardır. Kendi işlev testinde karakter oluştur, haritaya gir, savaş, core'lar arasında geçiş yap, uygulamayı yeniden aç ve envanterin kaydedildiğini kontrol et. Bu adımlar olmadan belirli bir telefon/sunucu eşleşmesinin doğrulandığını söyleyemezsin.
Sıkça Sorulan Sorular
Bu istemci en sevdiğim özel sunucuya bağlanır mı?
Bu, iPhone için de bir rehber mi?
Oyun verileriyle birlikte APK'yı herkese açık paylaşabilir miyim?
İlgili Sayfalar
Mükemmel Sunucunu Bul
METIN2.GG'deki en üst sıradaki Metin2 özel sunucularına göz atın veya kendi sunucunuzu sıralamaya ekleyin.

