本文已獨家授權 鴻洋(?hongyangAndroid?) 公眾號發(fā)布述寡!
????前不久入職于一家游戲研發(fā)公司,公司部門給我的開發(fā)需求是研發(fā)H5游戲SDK和對接H5渠道SDK(對于只有App研發(fā)的我來說,其中經歷和酸甜苦辣那可真是一把鼻涕一把淚铐然。不乏筆者犧牲周末時間去熟悉該業(yè)務的朋友公司向他取經討論技術方案迁匠,畫UML圖等等)橘蜜。既然是完成需求,首先需要分析這個需求是用來做什么的垄分,接下來在去考慮現有的技能點如何完成產品需求宛篇。
? ? 雖然更多的Android Developer傾向于APP研發(fā)(傾向,這個詞形容的不是太好薄湿,因為APP依舊占市場主導地位)叫倍。但考慮到未來的某些日子,一些哥們去了新公司也會遇到這種情況豺瘤,而且要命的是網上可查詢資料幾乎就是打廣告打廣告吆倦,免費解決技術方案的參考實在太少(這根本不能符合我大Android集思廣益忠于開源的靈魂好嘛)這實在是讓人深惡痛絕!所以這篇文章不僅是針對未來有類似研發(fā)需求的朋友傳道解惑坐求,節(jié)約時間少走彎路蚕泽,而且更主要的是揭開關于Android游戲SDK的神秘面紗。文章延續(xù)之前的風格桥嗤,篇幅雖長须妻,但力爭寫得清楚,也是方便各位看官清晰明了易于理解泛领。
? ? 另外荒吏,舊版本SDK因為種種原因已經刪掉了(如編碼設計的原因),還是感謝之前一些開發(fā)者點擊的上百個Star渊鞋。新版本SDK也已經編碼完畢绰更,源碼請見末尾。
問題:游戲APK锡宋,到底是什么儡湾?
? ? 和APP不同,我們編寫APP一套代碼測試編碼無誤后执俩,打包上線推廣維護即可徐钠,這就是APP研發(fā)流程;但是游戲apk那就大相徑庭(以下簡稱手游)了奠滑,因為手游使用到的技術是基于游戲引擎研發(fā)的丹皱。如unity3d,cocos2dx宋税,H5用到的Egret等等摊崭。你不可能說,哇杰赛,老鐵沒毛病我給你在Android Studio上去開發(fā)游戲呢簸。那么,作為Android開發(fā)乏屯,我們暫時先不研究游戲研發(fā)的具體內容根时,只關注Android本身開發(fā)即可。換個角度想辰晕,那些專門寫游戲代碼的哥們蛤迎,也不知道你Android,ios怎么寫(當然含友,大牛技術狂魔除外哈)替裆,游戲技術只關注這個游戲場景怎么弄,怎么設計個幫派技能窘问,怎樣讓你多充錢變的更強等等辆童。那么,純粹從技術的角度去分析游戲APK惠赫,介紹下我在公司的這些日子把鉴,個人對手游APK最簡單的理解(原創(chuàng)公式,非喜勿噴):
渠道手游SDK ? + ? 游戲研發(fā) ? ?= ? 手游 ?
概念一:渠道手游SDK
? ? 在Android開發(fā)中儿咱,有多渠道打包的概念庭砍。簡單點說,apk需求完成以后概疆,但需要給用戶去下載去可以使用逗威。用戶下載使用體驗有流量,有流量app才能賺錢盈利岔冀。但是你可能說凯旭,沒事,咱家技術哥體力強技術棒輕松無痛苦在擼一個給用戶下載的平臺使套。當然罐呼,這是不可能的。因為你不僅要考慮怎樣推廣怎樣運營還需考慮用戶量的大小消費者對應用的偏好等等侦高。
????引用下《獵場》的臺詞嫉柴,找最專業(yè)的人,做最專業(yè)的事奉呛。
????這種聚集了一定用戶量的平臺计螺,一般稱為夯尽,渠道。通過渠道登馒,就可以解決上面的問題匙握。 比如,360手機助手陈轿,豌豆莢圈纺,應用寶等等,這些就是渠道(這種千萬級的渠道也稱大渠道)麦射。所以蛾娶,我們多渠道打包,打的就是渠道包潜秋,將這些渠道包蛔琅,上架到對應的平臺上,讓他們上架APP半等,供用戶下載使用體驗即可揍愁。
? ? 說完渠道,我們就開始說渠道SDK杀饵,上面說了莽囤,渠道會有很多家,大渠道如豌豆莢切距、應用寶這些朽缎,小渠道如,XXX谜悟、XXXX這些话肖,既然是不同的渠道,那么每一家渠道就會有自己的數據后臺以及相應的個性化設置葡幸。
????舉個例子最筒,應用寶和豌豆莢主要就是給用戶去下載不同的apk,他們的核心都是是下載應用蔚叨,主要功能如手機注冊床蜘,登錄,獲取注冊驗證碼等這些基本功能(也稱為 接口)本質上也是一樣的蔑水;不同點就是邢锯,他們的UI不同,后臺架構搀别,請求參數等等這些也不同丹擎。
????那么,渠道SDK就可以簡單理解為(個人理解)歇父,在同一業(yè)務節(jié)點上蒂培,滿足市面上相同業(yè)務的基本功能再愈,但提供相對差異化的服務。(相對差異化的服務护戳,簡單理解就是UI和數據結構差異践磅,并不能理解為功能上的大差異)。
? ? 基于渠道SDK灸异,在舉個簡單的例子加深其概念理解。當我們集成百度地圖or高德地圖羔飞;極光推送or信鴿推送肺樟;熱云統計or TalkingData,這些第三方SDK的時候,他們主要完成的功能業(yè)務幾乎都是一樣的逻淌,比如地圖主要是為了定位和出行方便么伯;比如推送是為了吸引用戶,喚起APP卡儒;再比如數據統計田柔,是為了收集用戶數據做篩選統計等;他們在某一塊做著相同的事情骨望,但他們是不同公司的產品(當然硬爆,也不排除換馬甲的這種可能)也就是不同的渠道。不同的渠道做同一業(yè)務節(jié)點上SDK的研發(fā)擎鸠,市面上對他們有個統一的說法缀磕,就是渠道SDK。
? ? SDK開發(fā)(SDK翻譯過來就是劣光,軟件開發(fā)工具包)其開發(fā)本質就是袜蚕,隱藏內部實現細節(jié),對外提供公共的訪問方式(是不是很像封裝)绢涡。但SDK需將邏輯結果告知調用者牲剃,這個接口的功能你是調用成功還是失敗 ,成功以后你會通過SDK拿到什么樣的數據等等雄可。
????SDK開發(fā)的優(yōu)點就是凿傅,拓展性較強。這里的拓展性不僅可以理解為滞项,SDK是專注于為某一個功能模塊提供一套完整的解決方案狭归,減少各應用開發(fā)周期和難度,而且文判,可以為很多家想使用SDK的應用提供相同的技術方案过椎,復用性較強。
概念二:游戲研發(fā)
? ? 說完渠道SDK戏仓,在額外拓展下游戲研發(fā)疚宇。游戲研發(fā)的內容一般是使用unit3d亡鼠,cocos2dx等游戲引擎去完成研發(fā)內容,研發(fā)游戲的技術人員敷待,剛才說了间涵,這里我們不具體探討他們的研發(fā)技術,這里只討論他們的角色榜揖。換個角度想勾哩,做APP研發(fā)的時候,接入地圖SDK是不是首先會在他們的渠道上面举哟,申請我們自己開發(fā)應用的參數(比如 AppId思劳,AppKey等),去激活使用這套SDK妨猩。參數配置完畢以后潜叛,然后,在具體場景的代碼中壶硅,去調用該SDK邏輯威兜。以登錄場景,舉個偽代碼例子:
? ?Sdk.Login()庐椒;
? ? 那么椒舵,當應用場景調用此功能(簡稱接口),就會調起SDK的登錄约谈。但是逮栅,上述偽代碼是有問題的。設想窗宇,當手游開始時措伐,首先肯定會喚起登陸接口(一般是游戲先初始化,在調登錄接口)军俊,但是侥加,接入SDK的開發(fā)人員(也屬于游戲研發(fā)公司的技術)怎么知道登錄用戶登錄成功或登錄失敗粪躬?而且担败,實際開發(fā)場景是當玩家登錄成功以后,游戲研發(fā)或者其他第三方(一般是聚合平臺)還要去記錄用戶的信息(所以镰官,玩手游提前,賬號信息會暴露給一群人,后臺會記錄你的數據然后進行數據分析和數據挖掘......)泳唠。但是狈网,SDK的內部邏輯是走SDK自家的服務器,你只是使用罷了。(你要說抓包拓哺,那也是呵呵噠勇垛,接口一個個抓,豈不是抓到天荒地老)所以士鸥,SDK常用的做法就是通過接口回調的方式闲孤,將接口回調的結果告知調用者(也就是游戲研發(fā)),這個登錄接口成功還是失敗烤礁。下面是一個初始化接口的截圖讼积,通過接口回調,告知調用者該初始化接口是成功或失敗脚仔,然后從接口的response里面去獲取到什么樣的數據
????另外币砂,上面也說到了關于游戲研發(fā)的內容,這里不做過多描述玻侥。因此,本文所指的游戲研發(fā)具體是指亿蒸,對接渠道游戲SDK的技術人員凑兰。需要注意的是,有些公司的SDK開發(fā)边锁,不僅要寫渠道SDK也負責對接其他家的渠道SDK姑食。當然本文重點是突出如何編寫渠道的SDK,因為開源的項目是一套Android渠道SDK。既然是渠道茅坛,所以大家可以私人訂制音半、隨意擴展。
分析:H5游戲SDK
? ? 說完Android在談談H5的游戲SDK贡蓖。順道說一聲曹鸠,最近在游戲領域H5游戲可謂是趨勢剛猛異軍突起,可能一說H5斥铺,程序猿思維就直接告訴我們彻桃,這不是寫前端網頁的嘛。沒錯晾蜘,H5的確是寫網頁的邻眷,但是H5適配客戶端的優(yōu)勢相較于之前Html的幾個版本優(yōu)勢會更加明顯。而且剔交,H5游戲開發(fā)周期相對較短肆饶,靈活性較強。 我們知道岖常,在Android加載H5只需要webview.load(url)即可驯镊,所以,現在市面上也很流行將H5游戲打包成Apk(是的,將H5打包成APK阿宅,一個包才幾M候衍,之前的游戲APK動輒百M,這樣也為用戶節(jié)省內存)網絡環(huán)境較好的情況下洒放,用戶體驗也比較流暢蛉鹿,那么,既然是H5的渠道游戲SDK往湿,我們也來分析下其使用的技術棧妖异。
? ? 既然是H5,那么在純粹的網頁上领追,肯定會用到JavaScript(AJAX,JQuery)等技術他膳。如果是打包成Apk,市面上常用的做法有如下兩種,一種純H5展示绒窑,還有一種即H5互調Android棕孙。因此,H5的游戲SDK一般分為兩套(以下只是我個人的分析些膨,若分析有誤蟀俊,請大家不吝賜教):一套SDK就是純粹的JS,Android直接用webview加載url即可订雾,所有的登錄或支付全部是url內部完成肢预;還有一套SDK就是Android調H5,H5調Android混合調用洼哎。第一種的話烫映,Android這邊只需要webview處理即可,所以我們針對第二套SDK方案作進一步的技術分析噩峦。
? ? 當應用啟動的時候锭沟,一般會先調用初始化接口。
????初始化接口首先肯定會訪問渠道服務器后臺识补,當客戶端請求參數和拼接規(guī)則符合后臺規(guī)則時(比如渠道后臺給你分配的appId和appKey這些必要的參數)冈钦,也就是初始化成功,然后在調起Android的登錄界面李请。(當然问裕,界面包括登錄界面砖第,注冊界面廉丽,支付界面等)當用戶登錄成功以后净响,webview在去加載url(這個url可以寫在客戶端,也可以由后臺返回白翻,實現方式很多種)乍炉,也就是用戶進入游戲正式開車绢片。(當然,這只是其中的一種分析岛琼,不排除有別的實現方式底循,如果有別的實現方式,請知會筆者槐瑞,因為筆者現在也只是摸著石字過河)熙涤。基本的一些使用我會在下面的開源SDK進行更加詳細的說明困檩。
開源SDK聲明:
1:本項目僅使用到了2個接口(登錄祠挫、注冊),具體來說是 玩Android網站?的開放API悼沿,另外等舔,項目源碼沒有涉及任何商業(yè)機密,所以?請放心學習研究使用糟趾!(這里在次感謝鴻洋大神)
2:之前開源的那套SDK項目個人覺得太LOW慌植,雖然大家點了上百個star,但思考在三最后還是決定重寫义郑,所以原庫已被筆者毫無保留的給刪除了蝶柿!
3:最新版本的SDK是?基于Android界內流行的MVP架構進行編碼設計且拋棄了傳統代碼布局!
4:新項目短小精悍但是容易拓展魔慷,至于怎么拓展怎么玩怎么使用、主觀能動性全在開發(fā)者自己手中著恩,所以院尔,你懂的。
5:新項目個人更加想表達的并不是針對需求的面面俱到喉誊,而是通過分析現象去思考并解決問題邀摆,比如現有的設計模式以及設計架構能否滿足現階段開發(fā)需求以達到思想互通與共鳴。
項目說明及使用:
言歸正傳伍茄,下面是項目結構圖:
紅色矩形:SDK內部邏輯編碼層(本質是一個庫文件栋盹、將其打成jar包給對接技術使用)
綠色矩形:主要是用來測試SDK內部邏輯是否正常,一般是用此測試類進行技術對接敷矫。下面以登錄為例進行說明:
這里是測試類SDK登錄的源碼設計例获,可以看到這里首先調用了SDK內部的邏輯層(這里的GameSdkLogic 暫且可以定義為 組件核心類)
試想在不知道源碼的情況下,如何通過現象去分析本質來進行具體的功能設計曹仗?
舉例榨汤,這里使用 登錄接口 來進行分析:
首先:當用戶準備登錄的時候, 必須要喚起登錄界面(View層怎茫,彈出界面)收壕,然后妓灌,用戶輸入賬號密碼,輸入完畢以后蜜宪,發(fā)起Http請求虫埂、后臺接受請求接著進行解析并返回給客戶端響應體。
接著:客戶端拿到響應體之后圃验,SDK內部進行數據解析掉伏,分析判斷用戶是登錄成功還是登錄失敗,登錄成功以后回調到這里的組件核心類损谦,在將結果回調給外部岖免。回調外部的具體實現方式是接口回調照捡。
最后:在具體的狀態(tài)碼中颅湘,告知用戶(根據狀態(tài)碼來進行識別),登錄成功還是失敗栗精。
這里的checkInit闯参,是初始化成功or失敗的意思,上面也說到了悲立,原則上初始化成功以后才允許進行登錄鹿寨、支付
至此,整個登錄接口的設計流程完畢薪夕!于此脚草,源碼的設計原則也是基于此進行開發(fā):
????好了,現在進入到登錄界面之后原献,我們首先構建 HttpRequest馏慨,接著,后臺sever接受請求 返回響應體姑隅,客戶端收到響應體后根據規(guī)則去判斷用戶是否登錄成功写隶,登錄成功以后在將結果回調給V層。至此整個流程就結束了讲仰。
觸類旁通:
????關于MVP模式慕趴,這種架構主要是用來解決 View層與邏輯層過重的耦合導致的諸如后期維護困難等一些問題,這種架構的編碼細節(jié)實則是通過接口回調進行結果傳遞來達到項目解耦鄙陡、職責細分這一目的冕房。在文章的前面也說到,既然SDK開發(fā)的本質是將結果回調給接入人員趁矾,那么這兩種思想本質是互通的毒费。當然MVP設計也是新版本使用到的設計架構,因為筆者將APP的開發(fā)流程引入到了SDK里面的具體功能設計愈魏。另外觅玻,關于MVP這一模式我想要說的是想际,市面上流行很多MVP不同的設計版本,每一個版本都有它自己的優(yōu)點溪厘。筆者項目里面的MVP編碼應該是相對來說比較好理解的且短小精悍且伴隨好幾個項目了胡本。
????所謂:一千個讀者有一千個哈姆萊特。選擇適合自己的才是最好的畸悬。正如筆者前面說到的侧甫,新項目更加想表達的并不是針對需求的面面俱到,而是通過分析現象去思考并解決問題蹋宦,比如現有的設計模式以及設計架構能否滿足現階段開發(fā)需求以達到思想上的互通與共鳴披粟。
????另外:關于SDK的配置,諸如橫豎屏配置等一些靈活性較強的功能冷冗,SDK內部應要提前設計好守屉。筆者這里的UI是基于XML來進行編寫,拋棄了傳統代碼布局那種瑣冗余費時費力且不討好的寫法蒿辙;另外拇泛,關于浮標這一功能,我沒有進行編寫思灌,因為github上有位作者開源了此類輪子俺叭,雖然筆者沒有clone下來仔細研究,但效果貌似不錯泰偿。
? ? 多提一嘴熄守,由于游戲SDK對接的游戲會非常多,官方的微信支付一個賬號只能注冊10款應用耗跛,所以裕照,開發(fā)中需要考慮可替代微信支付方式,比如可以接入第三方的H5微信支付去替代傳統微信支付课兄。接入第三方的數據統計功能也需要考慮到牍氛,對接我們渠道的技術晨继,是否也集成了相同的數據統計功能烟阐,如果集成的話該如何處理等等。
? ? 更多細節(jié)請?參考源碼
? ? 不積跬步無以至千里紊扬,不積小流無以成江海蜒茄。希望我們能夠不斷豐富自己的技術棧,早日走上技術之巔餐屎!
如果這篇文章對您有開發(fā)or學習上的些許幫助檀葛,希望各位看官留下寶貴的star,謝謝腹缩。
Ps:著作權歸作者所有,轉載請注明作者, 商業(yè)轉載請聯系作者獲得授權屿聋,非商業(yè)轉載請注明出處(開頭或結尾請?zhí)砑愚D載出處空扎,添加原文url地址),文章請勿濫用,也希望大家尊重筆者的勞動成果,謝謝。