Android 手游聚合SDK小知識(shí)(一)
Android 手游聚合SDK小知識(shí)(二) 聚合分包
前言
回頭想想肃弟,在安卓游戲SDK這個(gè)領(lǐng)域,我也呆了4年了风喇,從啥都不懂的小菜鳥(niǎo)议泵,逐漸靠自己不斷學(xué)習(xí)贡这,對(duì)這個(gè)行業(yè)也算有了一些理解,趁著最近有空,我想了一下睡陪,還是把最近這幾年對(duì)游戲SDK聚合的一些理解分享出來(lái)給大家,希望能和大家一起進(jìn)步夕凝。PS:目前我做的聚合SDK只能適用于國(guó)內(nèi)宝穗,海外谷歌包用的是aab,并且海外渠道sdk資源引用時(shí)經(jīng)常不使用反射码秉,所以海外SDK目前我還沒(méi)想出來(lái)如何聚合逮矛,希望有朋友能解決這個(gè)問(wèn)題分享給我。
1转砖、渠道SDK
一個(gè)游戲需要龐大的用戶(hù)量须鼎,畢竟玩的人越多,越多人充值府蔗,老板就賺得越多晋控,你的工資獎(jiǎng)金才能越多嘛,這時(shí)候就需要接入一些第三方渠道姓赤,讓他們幫你進(jìn)行有償推廣赡译,這些第三方渠道擁有大量用戶(hù),可以幫你進(jìn)行迅速的起量不铆,讓大家都去玩你的游戲蝌焚。
1.1、聯(lián)運(yùn)渠道SDK
我們可以接入一些聯(lián)運(yùn)SDK渠道誓斥,使用他們的渠道來(lái)幫我們推廣游戲只洒,百度、360劳坑、應(yīng)用寶毕谴,Huawei、OPPO 等距芬,包含了最核心的登陸涝开、支付等體系。如果接入了這些渠道蔑穴,就可以使用他們的SDK服務(wù)(登陸忠寻、支付等)。
當(dāng)然了存和,使用這些聯(lián)運(yùn)渠道奕剃,一般情況下都是要與對(duì)方分成的衷旅,充值的時(shí)候吊起來(lái)的是對(duì)方的充值界面,先充到對(duì)方的賬戶(hù)上纵朋,再進(jìn)行分成柿顶,一般來(lái)說(shuō)分成比例從37開(kāi)到19開(kāi)不等。
1.2操软、自有SDK渠道
如同上面說(shuō)的嘁锯,聯(lián)運(yùn)SDK需要與渠道方分成,而且分成比例極高聂薪,這個(gè)時(shí)候如果老板自己有穩(wěn)定的推廣渠道家乘,就可以使用自有的SDK,說(shuō)白了藏澳,自有SDK和聯(lián)運(yùn)渠道SDK本質(zhì)上沒(méi)什么區(qū)別仁锯,也擁有登錄、支付等一系列體系翔悠,只不過(guò)它屬于發(fā)行公司內(nèi)的的SDK业崖,使用自有的SDK就可以100%收入歸自己了,但是相應(yīng)的蓄愁,推廣的成本也要自己掏双炕,這里就不贅述了。
內(nèi)部SDK可以封裝在聚合SDK中撮抓,也可以單獨(dú)寫(xiě)成一個(gè)moudle妇斤,我這里是單獨(dú)寫(xiě)成了一個(gè)moudle,用的時(shí)候打包成aar丹拯,和聚合sdk一起給cp接入趟济,cp接入后就可以吊起我們自有的SDK,完成登錄支付等一系列操作咽笼,后續(xù)我再將包用腳本進(jìn)行渠道分包。
2戚炫、游戲研發(fā)(CP)
游戲研發(fā)也就是專(zhuān)門(mén)開(kāi)發(fā)游戲的公司剑刑,一般稱(chēng)為CP。
3双肤、聚合SDK
在游戲行業(yè)中施掏,聚合SDK可以理解為一個(gè)中間層,一個(gè)橋梁茅糜,作用是溝通游戲CP和渠道SDK七芭。
聚合SDK = 聚合層接口 + 渠道SDK(或者是自有SDK)
使用聚合SDK,聚合層接口不變蔑赘,變得是渠道SDK狸驳,可以在游戲接入一次聚合SDK后预明,用腳本自動(dòng)反編譯回編譯,替換掉渠道SDK代碼耙箍,實(shí)現(xiàn)一包多渠道撰糠,減少CP方的工作量。
圖中是游戲未接入聚合SDK的情況下辩昆,調(diào)用登錄邏輯阅酪。
- 游戲客戶(hù)端調(diào)用SDK客戶(hù)端的登錄API進(jìn)行登錄,SDK客戶(hù)端會(huì)拉起登錄界面
- SDK客戶(hù)端在登錄界面輸入賬密或調(diào)用第三方登錄
- SDK服務(wù)端校驗(yàn)登錄信息成功汁针,返回userID和token給SDK客戶(hù)端
- SDK客戶(hù)端通過(guò)回調(diào)將userID和token返回給游戲客戶(hù)端
- 游戲客戶(hù)端獲取到token和userID后术辐,將其傳給游戲服務(wù)器端
- 游戲服務(wù)器將數(shù)據(jù)傳給SDK服務(wù)器進(jìn)行校驗(yàn)
- 校驗(yàn)通過(guò),游戲服務(wù)器將用戶(hù)的賬戶(hù)信息返回給游戲客戶(hù)端
- 游戲客戶(hù)端登錄成功
上面的步驟解釋了游戲和渠道SDK的交互邏輯施无,理論上CP是可以直接接入SDK渠道的辉词,但是帆精,目前有一個(gè)問(wèn)題较屿,那就是如果有多個(gè)SDK渠道怎么辦,目前國(guó)內(nèi)大大小小的渠道有上百個(gè)卓练,如果要將這上百個(gè)渠道挨個(gè)接入隘蝎,這里面的工作量想必巨大無(wú)比,需要占用游戲研發(fā)非常多的工作時(shí)間襟企,那么有沒(méi)有這么一種方法嘱么,游戲研發(fā)接入一遍就可以實(shí)現(xiàn)完成多個(gè)sdk渠道的上架呢,這時(shí)候顽悼,聚合SDK就應(yīng)運(yùn)而生了曼振。
聚合SDK只有一個(gè),游戲研發(fā)只用接入一個(gè)聚合SDK蔚龙,然后剩下都交給聚合方冰评,由聚合方進(jìn)行分包上架。
下圖是加入聚合SDK后的登錄邏輯:
4木羹、聚合SDK對(duì)外接口及注意事項(xiàng)
1甲雅、初始化
Application 的初始化,讓CP使用或繼承我們的Application坑填,我們?cè)倮^承渠道方的Application抛人。
Activity中的init方法。
2脐瑰、登錄
統(tǒng)一登錄接口妖枚,接收渠道方的登錄回調(diào)參數(shù),再將登錄回調(diào)參數(shù)去聚合服務(wù)器校驗(yàn)苍在,通過(guò)校驗(yàn)后绝页,聚合服務(wù)器返回token和userID荠商,聚合SDK再將參數(shù)傳給游戲客戶(hù)端,由游戲客戶(hù)端和服務(wù)器完成登錄校驗(yàn)抒寂。
/**
* 登錄方法
* @param activity 上下文環(huán)境
*/
public void login(Activity activity){
Log.v(TAG,"進(jìn)入登錄");
}
3结啼、支付
4、注銷(xiāo)(切換賬號(hào))
5屈芜、生命周期
/**
* onCreate生命周期方法
* @param activity
*/
public void onCreate(Activity activity, Bundle savedInstanceState){
Log.v(TAG,"進(jìn)入onCreate");
Log.v(TAG,"onCreate執(zhí)行完成");
}
/**
* onResume生命周期方法
* @param activity 之前的塔防版署包這里是context
*/
public void onResume(Activity activity){
Log.v(TAG,"進(jìn)入onResume");
Log.v(TAG,"onResume執(zhí)行完成");
}
/**
* onPause生命周期方法
* @param activity 之前的塔防版署包這里是context
*/
public void onPause(Activity activity){
Log.v(TAG,"進(jìn)入onPause");
Log.v(TAG,"onPause執(zhí)行完成");
}
/**
* onDestroy生命周期方法
* @param context
*/
public void onDestroy(Context context){
Log.v(TAG,"進(jìn)入onDestroy");
Log.v(TAG,"onDestroy執(zhí)行完成");
}
/**
* onRestart生命周期方法
* @param context
*/
public void onRestart(Context context){
Log.v(TAG,"進(jìn)入onRestart");
Log.v(TAG,"onRestart執(zhí)行完成");
}
/**
* onStart生命周期方法
* @param context
*/
public void onStart(Context context){
Log.v(TAG,"進(jìn)入onStart");
Log.v(TAG,"onStart執(zhí)行完成");
}
/**
* onStop生命周期方法
* @param context
*/
public void onStop(Context context){
Log.v(TAG,"進(jìn)入onStop");
Log.v(TAG,"onStop執(zhí)行完成");
}
6郊愧、退出
/**
* 退出游戲彈窗
*/
public void exitGame(Context context){
}
7、數(shù)據(jù)上報(bào)
- 創(chuàng)建角色
- 角色升級(jí)
- 進(jìn)入游戲
- 選擇區(qū)服
這些場(chǎng)景一般是接收游戲傳遞過(guò)來(lái)的數(shù)據(jù)上報(bào)到渠道或聚合sdk中井佑,用于數(shù)據(jù)統(tǒng)計(jì)用
Map map = new HashMap();
map.put("uid", "123456"); //角色id
map.put("server_id", "310"); //區(qū)服id
map.put("server_name", "houruoyu333"); //區(qū)服名稱(chēng)
map.put("role_id", "1225883"); //角色id
map.put("role_name ", "houruoyu"); //角色名稱(chēng)
map.put("role_level", "3"); //角色等級(jí)
map.put("game_name", ""); //游戲名稱(chēng)
map.put("role_type", "戰(zhàn)士"); //角色職業(yè)
map.put("vip_level", "13"); //vip等級(jí)
map.put("game_money", "999"); //玩家擁有金幣數(shù)量
map.put("create_role_time", Long.valueOf(1616136064)); //創(chuàng)角時(shí)間
map.put("level_up_role_time", Long.valueOf(1616136064)); //升級(jí)時(shí)間
map.put("has_gold", "3000"); //補(bǔ)充字段
8属铁、實(shí)名認(rèn)證接口
5、聚合SDK規(guī)范
1躬翁、盡量少使用第三方開(kāi)源庫(kù)焦蘑,避免和cp引入的依賴(lài)發(fā)生沖突
2、命名規(guī)范
聚合SDK中可能會(huì)使用string盒发、color例嘱、布局文件等資源,如果和cp或渠道sdk發(fā)生重名會(huì)很麻煩宁舰,會(huì)導(dǎo)致合并資源的時(shí)候發(fā)生沖突拼卵。所以一般來(lái)說(shuō),資源等命名蛮艰,都需要加上自己獨(dú)特的前綴腋腮,避免沖突,例如:
<string name="houruoyu_app_online">登錄</string>
如果不加上 houruoyu_作為前綴的話壤蚜,很容易沖突即寡。
3、聚合SDK中使用資源索引(R.java),會(huì)導(dǎo)致合包的時(shí)候資源沖突袜刷,或者缺失資源等問(wèn)題聪富。
解決方法:所有涉及到R.java資源的引用,統(tǒng)一使用context.getResources().getIdentifier("資源名", "資源類(lèi)型", "包名");
4著蟹、回調(diào)統(tǒng)一
建議在初始化處善涨,統(tǒng)一做回調(diào)處理,例如:
HouruoyuSDK.getInstance().init(this, new Callback(){
@Override
public void onInitSuccess() {
//初始化成功
}
@Override
public void onInitFailed() {
//初始化失敗
}
@Override
public void onLoginSuccess(User user) {
//登錄成功
}
@Override
public void onLoginFailed(String msg) {
//登錄失敗
}
@Override
public void onLoginCancel() {
//登錄取消
}
@Override
public void exitGame() {
//退出游戲
}
});