自2017年初開始曹动,我就致力于Android應(yīng)用框架的研究,到2018年開始在Github上陸續(xù)開源系列作品牲览,再到2019年收獲我的第一個(gè)star過千的項(xiàng)目墓陈,期間我付出了很多,失去了很多第献,同時(shí)也獲得了很多贡必。
前言
為了能夠讓更多的人了解到我的開源項(xiàng)目,我也是使出了渾身解數(shù)庸毫,寫了不少文章和文檔來提高項(xiàng)目的曝光率仔拟,不過在這期間我也發(fā)現(xiàn)了不少問題:讀者的水平參差不齊,以往我寫的文章都是建立在有一定開發(fā)基礎(chǔ)之上的岔绸,這就導(dǎo)致了很多新手小白理逊、學(xué)生黨看不懂,不會(huì)用盒揉,瞎折騰晋被,這完全違背了我的初衷。我希望我的開源項(xiàng)目不僅能夠服務(wù)那些有一定開發(fā)經(jīng)驗(yàn)的人刚盈,還能幫助那些熱愛Android的人學(xué)習(xí)并提升自己的開發(fā)水平羡洛,早日能夠跟上我們的步伐。
在接下來的數(shù)月里,我將一一詳細(xì)講解我開源的幾個(gè)熱門項(xiàng)目欲侮,介紹他們所使用的場(chǎng)景崭闲,解決的問題以及分析其中實(shí)現(xiàn)的邏輯。
概述
所有的技術(shù)框架都必須服務(wù)于實(shí)際生產(chǎn)威蕉,否則就是耍流氓刁俭。
我一直認(rèn)為這世上沒有絕對(duì)完美的事物,當(dāng)然技術(shù)也并不例外韧涨。在做Android的最初幾年里牍戚,我一直認(rèn)為技術(shù)是產(chǎn)品的靈魂,用于創(chuàng)造產(chǎn)品而又高于產(chǎn)品虑粥,是無可替代的如孝,這也是我初期為何執(zhí)著于技術(shù)的原因。漸漸地娩贷,當(dāng)一項(xiàng)技術(shù)趨于成熟的時(shí)候第晰,你會(huì)發(fā)現(xiàn)其實(shí)技術(shù)也并不是想象中的那么重要,同樣的功能或是產(chǎn)品彬祖,你可以用2種或者更多的技術(shù)方案來實(shí)現(xiàn)茁瘦,這個(gè)時(shí)候你才會(huì)發(fā)現(xiàn),原來技術(shù)也如同資本涧至、人力腹躁、市場(chǎng)和物料等資源,只是我們實(shí)現(xiàn)目的的工具而已南蓬。
其實(shí)X-Library
正是我早期做Android開發(fā)過程中積累沉淀下來的技術(shù)經(jīng)驗(yàn)纺非,并通過我后期不斷完善之后形成的。雖說可能不及大廠和google爸爸他們開源的項(xiàng)目那么牛掰赘方,不過相信我烧颖,這些框架都是在實(shí)際生產(chǎn)中誕生出來的優(yōu)秀項(xiàng)目,相比大廠和google爸爸他們開源的項(xiàng)目窄陡,他們可能更適合中小企業(yè)或者獨(dú)立開發(fā)者的你使用哦炕淮!
下面是X-Library
的思維導(dǎo)圖:
Library簡介
XPage
一個(gè)非常方便的fragment頁面框架
XPage是我開源的第一個(gè)項(xiàng)目,也是最實(shí)用跳夭、最方便的項(xiàng)目之一涂圆。設(shè)計(jì)的初衷是希望能做一個(gè)通用的Activity作為殼,F(xiàn)ragment作為頁面填充展示币叹,并且能夠?qū)崿F(xiàn)自由的切換和數(shù)據(jù)交互润歉。
設(shè)計(jì)原由
當(dāng)初做Android開發(fā)時(shí)每當(dāng)我寫一個(gè)頁面,都需要?jiǎng)?chuàng)建一個(gè)Activity颈抚,并且還需要在manifest中注冊(cè)一堆Activity信息踩衩,這樣既不方便,而且對(duì)資源的開銷也比較大。因此當(dāng)時(shí)我就設(shè)想能否創(chuàng)造出一個(gè)通用萬能的Activity容器驱富,可以全權(quán)負(fù)責(zé)Fragment的切換展示和數(shù)據(jù)交互锚赤,只需要一行代碼即可完成所有的操作,還不需要自己手動(dòng)去注冊(cè)褐鸥,可以一鍵生成线脚。
設(shè)計(jì)思路
剛開始的時(shí)候真的很難,沒有什么好的思路晶疼,最初只是簡單封裝了一個(gè)Activity酒贬,通過傳入一些key值從而獲取并加載對(duì)應(yīng)的fragment,類似ARouter
中Fragment發(fā)現(xiàn)那種翠霍。其實(shí)這樣做并沒有解決一個(gè)容器的問題,而且頁面切換也不是很靈活蠢莺,不夠通用寒匙,使用起來也不是很方便。
突然有一天我發(fā)現(xiàn)Github上有個(gè)開源項(xiàng)目CorePage寫得非常好躏将,完美地解決了我對(duì)一個(gè)Activity容器的問題锄弱,于是我決定仔細(xì)研究其代碼,并在其基礎(chǔ)上設(shè)計(jì)出了XPage的最初版本祸憋。
就在XPage正式投入使用的過程中会宪,我發(fā)現(xiàn)還是存在不少問題的:
1.對(duì)外API不夠靈活,使用起來不夠方便蚯窥;
2.每個(gè)Fragment仍需要手動(dòng)注冊(cè)掸鹅,很麻煩;
對(duì)于API不夠靈活的問題拦赠,我在之后的版本中陸續(xù)通過構(gòu)造者模式設(shè)計(jì)以及Android主題屬性等手段解決了巍沙。
而對(duì)于手動(dòng)注冊(cè)的問題,我正是借鑒了ARouter的思路荷鼠,通過Android APT技術(shù)句携,從而實(shí)現(xiàn)了Fragment信息的自動(dòng)注冊(cè)。
解決痛點(diǎn)
只需要一個(gè)Activity容器就可以實(shí)現(xiàn)多個(gè)頁面的交互允乐。
Fragment自由切換和數(shù)據(jù)交互矮嫉。
無需在manifest中注冊(cè)一堆Activity信息,通過@Page注解一鍵自動(dòng)注冊(cè)牍疏。
項(xiàng)目地址
https://github.com/xuexiangjys/XPage
XAOP
一個(gè)輕量級(jí)的AOP(Android)應(yīng)用框架蠢笋。囊括了最實(shí)用的AOP應(yīng)用。
XAOP是我剛接觸到AOP(面向切片編程)思想后麸澜,靈光乍現(xiàn)編寫的應(yīng)用庫挺尿,應(yīng)該說是我使用得最多的庫了,因?yàn)橛辛怂幋a真的很方便编矾!
設(shè)計(jì)原由
在我們平時(shí)開發(fā)的過程中熟史,一定會(huì)遇到權(quán)限申請(qǐng)、線程切換窄俏、數(shù)據(jù)緩存蹂匹、異常捕獲、埋點(diǎn)和方法執(zhí)行時(shí)間統(tǒng)計(jì)等問題凹蜈。這些都是非常常見的問題限寞,實(shí)現(xiàn)起來也不是很難,不過就是太麻煩了仰坦,還會(huì)讓程序多出很多重復(fù)性履植、模版化的代碼。
設(shè)計(jì)思路
讓我最初接觸到AOP思想的是JakeWharton的hugo,通過閱讀它的源碼之后悄晃,讓我對(duì)aspectj
這項(xiàng)技術(shù)的動(dòng)態(tài)代碼編織深深地著了迷玫霎。之后我詳細(xì)研究了aspectj
相關(guān)的技術(shù),并不斷搜集AOP在Android上的典型應(yīng)用場(chǎng)景妈橄,然后通過aspectj
這項(xiàng)技術(shù)去逐一實(shí)現(xiàn)庶近。最后就成就了XAOP這個(gè)庫。
解決痛點(diǎn)
- 可以解決快速點(diǎn)擊的問題
- 解決Android6.0以上動(dòng)態(tài)權(quán)限申請(qǐng)的問題
- 線程自由切換的問題
- 日志埋點(diǎn)問題
- 緩存問題(磁盤緩存和內(nèi)存緩存)
- 異常捕獲處理
- 業(yè)務(wù)攔截(登陸驗(yàn)證眷蚓、有效性驗(yàn)證等)
項(xiàng)目地址
https://github.com/xuexiangjys/XAOP
XUI
一個(gè)簡潔而又優(yōu)雅的Android原生UI框架鼻种,解放你的雙手!
XUI可以說是我花費(fèi)心血最多的開源項(xiàng)目了沙热,目前稍微大一點(diǎn)的項(xiàng)目我都會(huì)選擇引入它叉钥。XUI幾乎涵蓋了目前Android開發(fā)所需要的所有組件,可以說有了XUI之后校读,可以大大提高我們的開發(fā)效率沼侣,讓我們可以將精力很多地放在業(yè)務(wù)功能和數(shù)據(jù)處理上∏革可以說XUI是目前Github上組件最全蛾洛、文檔最詳細(xì)、案例最多的Android原生UI庫雁芙。
設(shè)計(jì)原由
相信做過Android的人都知道Android原生組件在國內(nèi)很不受設(shè)計(jì)師的待見轧膘,至于Google推行的Material Design設(shè)計(jì)風(fēng)格更是無人問津,這就導(dǎo)致了設(shè)計(jì)師給出的原型圖幾乎是清一色的IOS風(fēng)格兔甘,更尷尬的是谎碍,網(wǎng)上Android相關(guān)的開源UI庫是少之又少,這可就為難死我們了洞焙,幾乎所有的基礎(chǔ)組件都需要自己重寫蟆淀。之前也寫過React和Vue拯啦,發(fā)現(xiàn)它們都有非常方便的UI庫,而且使用起來也非常方便熔任,直接在示例代碼的基礎(chǔ)上修修改改就能大致上實(shí)現(xiàn)自己想要的效果褒链,極大地提高了開發(fā)的效率淆攻。
設(shè)計(jì)思路
在開始著手做這樣一個(gè)開源庫之前吟逝,我是一點(diǎn)思路都沒有的。好在在2017年的某一天蓝牲,我接觸到了QMUI,通過閱讀它的源碼惦费,我發(fā)現(xiàn)它的設(shè)計(jì)思路非常好兵迅,可以通過設(shè)置不同的主題樣式、組件屬性等實(shí)現(xiàn)不同的組件效果薪贫,非常靈活恍箭;除此之外,它還對(duì)UI主題風(fēng)格做了較為詳細(xì)的制定和歸類瞧省,可以說很有啟發(fā)意義季惯。于是我就遵循了QMUI的思路,開啟了XUI的編寫臀突。
解決痛點(diǎn)
- 簡潔優(yōu)雅,盡可能少得引用資源文件的數(shù)量贾漏,項(xiàng)目庫整體大小不足1M候学。
- 組件豐富,提供了絕大多數(shù)我們?cè)陂_發(fā)者常用的功能組件纵散。
- 使用簡單梳码,為方便快速開發(fā),提高開發(fā)效率伍掀,對(duì)api進(jìn)行了優(yōu)化掰茶,提供一鍵式接入。
- 樣式統(tǒng)一蜜笤,框架提供了一系列統(tǒng)一的樣式濒蒋,使UI整體看上去美觀和諧。
- 兼容性高把兔,框架還提供了3種不同尺寸設(shè)備的樣式(4.5英寸沪伙、7英寸和10英寸),并且最低兼容到Android 17, 讓UI兼容性更強(qiáng)县好。
- 擴(kuò)展性強(qiáng)围橡,各組件提供了豐富的屬性和樣式API,可以通過設(shè)置不同的樣式屬性缕贡,構(gòu)建不同風(fēng)格的UI翁授。
項(xiàng)目地址
https://github.com/xuexiangjys/XUI
XUpdate
一個(gè)輕量級(jí)拣播、高可用性的Android全量版本更新框架。
XUpdate是為了解決在不同項(xiàng)目組收擦、不同平臺(tái)之間進(jìn)行統(tǒng)一的Android全量版本更新的庫贮配。它具有輕量、靈活炬守、低耦合牧嫉、高可用等特點(diǎn),可以很方便地定制屬于自己的版本更新减途。
設(shè)計(jì)原由
在沒有XUpdate之前的版本更新酣藻,Android版本更新基本都是靠寫各種版本更新工具類來實(shí)現(xiàn)版本更新,更可怕的是有時(shí)在不同項(xiàng)目組或者平臺(tái)之間鳍置,它們的版本更新完全是不一樣的辽剧,這樣的結(jié)果就是會(huì)寫無數(shù)的版本更新工具類,并且每次更換一個(gè)項(xiàng)目組或者平臺(tái)就需要從頭重寫再寫一遍税产,非常得麻煩怕轿。當(dāng)時(shí)我就在想,版本更新作為一個(gè)Android應(yīng)用基本都有辟拷,且內(nèi)容相對(duì)穩(wěn)定的功能撞羽,有沒有可能設(shè)計(jì)出一個(gè)通用的、不為業(yè)務(wù)或者平臺(tái)所影響的基礎(chǔ)庫呢衫冻?
設(shè)計(jì)思路
在著手寫XUpdate之前诀紊,我特地去Github上搜了一圈有關(guān)Android版本更新的內(nèi)容,發(fā)現(xiàn)AppUpdate這個(gè)項(xiàng)目star數(shù)量最多隅俘。但是當(dāng)我翻閱它的源碼之后發(fā)現(xiàn)邻奠,它設(shè)計(jì)得并不優(yōu)美,內(nèi)部耦合非常嚴(yán)重为居,不過優(yōu)點(diǎn)就是Android版本更新的功能基本都涵蓋了碌宴。于是我就照著它所擁有的功能,結(jié)合了我對(duì)版本更新的理解進(jìn)行了重新設(shè)計(jì)蒙畴,感興趣的可點(diǎn)擊查看框架UML設(shè)計(jì)圖贰镣。
解決痛點(diǎn)
- 使用簡單,只需一行代碼即可完成版本更新功能忍抽。
- 功能強(qiáng)大八孝,兼容Android6.0、7.0鸠项、8.0干跛,支持靜默更新和自動(dòng)更新,支持國際化祟绊。
- 擴(kuò)展性強(qiáng)楼入,可自定義請(qǐng)求API接口哥捕、提示彈窗、下載服務(wù)嘉熊、文件加密器等遥赚。
- 搭建簡單,只需提供json內(nèi)容即可支持版本更新阐肤。
- 配套齊全凫佛,默認(rèn)提供了后臺(tái)服務(wù)和管理界面。
項(xiàng)目地址
- Android基礎(chǔ)庫: https://github.com/xuexiangjys/XUpdate
- 版本更新后臺(tái)服務(wù): https://github.com/xuexiangjys/XUpdateService
- 版本更新管理系統(tǒng): https://github.com/xuexiangjys/xupdate-management
XHttp2
一個(gè)功能強(qiáng)悍的網(wǎng)絡(luò)請(qǐng)求庫孕惜,使用RxJava2 + Retrofit2 + OKHttp組合進(jìn)行封裝愧薛。
XHttp2的出現(xiàn)主要是為了解決網(wǎng)絡(luò)請(qǐng)求前后端統(tǒng)一、靈活性衫画、易用性和可拓展性等問題毫炉。它提供了豐富的API調(diào)用和功能,可以靈活地設(shè)置請(qǐng)求參數(shù)削罩、攔截器瞄勾、緩存策略,動(dòng)態(tài)添加參數(shù)弥激、異常攔截捕獲进陡、自定義請(qǐng)求等。
設(shè)計(jì)原由
在沒有設(shè)計(jì)XHttp2之前微服,網(wǎng)絡(luò)請(qǐng)求我用過async-http四濒、Volley、okhttp等網(wǎng)絡(luò)請(qǐng)求职辨,普遍的做法就是寫一個(gè)網(wǎng)絡(luò)請(qǐng)求的工具類,提供幾種常用的請(qǐng)求方法進(jìn)行調(diào)用戈二,這樣做確實(shí)可以舒裤,但是也存在很多問題:
靈活性差。請(qǐng)求參數(shù)一般都是固定的觉吭,不可以靈活地設(shè)置腾供,每次有新的請(qǐng)求方式都需要增加更多的方法。
易用性差鲜滩。每次請(qǐng)求可能都需要構(gòu)建一個(gè)請(qǐng)求實(shí)體伴鳖,并且不同的請(qǐng)求需要調(diào)用不同的方法,傳入不同的參數(shù)徙硅,往往一個(gè)請(qǐng)求需要寫很多重復(fù)的代碼榜聂。
耦合度高。如果需要切換一種請(qǐng)求方式的話嗓蘑,需要修改所有工具類調(diào)用相關(guān)的代碼须肆,非常麻煩匿乃。
請(qǐng)求的行為不好控制。例如請(qǐng)求策略的控制豌汇、請(qǐng)求線程的控制幢炸、緩存策略的控制、請(qǐng)求響應(yīng)以及異常處理的控制等拒贱。
可拓展性差宛徊。無法自定義請(qǐng)求的形式,很難對(duì)請(qǐng)求進(jìn)行統(tǒng)一和有效的管理逻澳,不利于解決前后端統(tǒng)一的問題闸天。
但是自從有了Retrofit之后,以上的問題都得到了很好的解決赡盘『耪恚可以說Retrofit真的是一個(gè)不錯(cuò)的網(wǎng)絡(luò)請(qǐng)求框架,很好地體現(xiàn)了設(shè)計(jì)模式的優(yōu)美陨享。當(dāng)然葱淳,Retrofit也有自己的問題:
Retrofit定義的接口返回類型不支持二次泛型。
Retrofit雖具備高度的靈活性抛姑,但卻缺乏易用性赞厕,無法對(duì)請(qǐng)求進(jìn)行統(tǒng)一的管理,所以使用起來不是那么方便定硝。
Retrofit的擴(kuò)展性不強(qiáng)皿桑。不支持自定義請(qǐng)求形式,只能在其提供的框架內(nèi)進(jìn)行網(wǎng)絡(luò)請(qǐng)求蔬啡。
設(shè)計(jì)思路
XHttp2最初的設(shè)計(jì)思路來源于RxEasyHttp 和axios诲侮。綜合使用了原型模式、構(gòu)建者模式箱蟆、代理模式沟绪、策略模式、模板模式空猜、裝飾模式绽慈、外觀模式、中介者模式辈毯、責(zé)任鏈模式和觀察者模式坝疼,并且嚴(yán)格遵循Java設(shè)計(jì)模式的七大設(shè)計(jì)原則進(jìn)行了嚴(yán)格地設(shè)計(jì)。想了解更多設(shè)計(jì)細(xì)節(jié)的點(diǎn)擊查看XHttp2的設(shè)計(jì)類圖谆沃。
解決痛點(diǎn)
- 提供了一整套統(tǒng)一的請(qǐng)求形式钝凶、攔截器、緩存唁影、線程控制腿椎、請(qǐng)求響應(yīng)桌硫、異常處理的解決方案。
- 解決網(wǎng)絡(luò)請(qǐng)求前后端統(tǒng)一的問題啃炸。
- 解決Retrofit易用性差的問題铆隘。
- 解決網(wǎng)絡(luò)請(qǐng)求靈活性、易用性和可拓展性等問題南用。
項(xiàng)目地址
https://github.com/xuexiangjys/XHttp2
XPush
一個(gè)輕量級(jí)膀钠、可插拔的Android消息推送框架。一鍵集成推送(極光推送裹虫、友盟推送肿嘲、信鴿推送、華為筑公、小米推送等)雳窟,提供有效的保活機(jī)制匣屡,支持推送的拓展封救,充分解耦推送和業(yè)務(wù)邏輯,解放你的雙手捣作!
XPush是對(duì)Android各大消息推送平臺(tái)錯(cuò)綜復(fù)雜的API進(jìn)行統(tǒng)一的整合和管理誉结,提供一致性的入口和出口,簡化消息推送的集成和使用券躁。
設(shè)計(jì)原由
做過Android消息推送的人都知道惩坑,Android不僅設(shè)備碎片化嚴(yán)重,推送平臺(tái)也是五花八門的也拜。早在2017年工信部就號(hào)召所有的廠商來制定統(tǒng)一的Android消息推送平臺(tái)以舒,可到現(xiàn)在也沒有下文(究其原因還是這其中的利益太大了,誰也不想妥協(xié))慢哈。我們不能將希望全都寄托在這個(gè)完全沒有定數(shù)的事件上稀轨,代碼終歸要寫,功能終歸要上岸军,與其受制于人,不如自己革命瓦侮,搞一個(gè)自己能控制的消息推送全平臺(tái)解決方案來得靠譜艰赞。
設(shè)計(jì)思路
雖然目前市面上各家提供的消息推送服務(wù)都各不相同,但仔細(xì)研究了之后就會(huì)發(fā)現(xiàn)它們其中是有很多共性的地方肚吏。其實(shí)我們完全可以提取一下公因數(shù)方妖,將他們共性的地方提取出來并建立統(tǒng)一的管理,這樣就可以非常方便地接入和切換各大消息推送平臺(tái)了罚攀。這樣帶來的好處就是党觅,無論后臺(tái)推送平臺(tái)或者方式如何變化雌澄,我們都不需要修改業(yè)務(wù)代碼,只需要簡單切換一下推送客戶端的實(shí)現(xiàn)方式就行了杯瞻,做到消息推送和業(yè)務(wù)代碼的隔離镐牺。
解決痛點(diǎn)
- 弱化了Android各大消息推送平臺(tái)的差異。
- 簡化了Android各大消息推送平臺(tái)的集成和使用魁莉。
- 提供了一致性的消息推送入口和出口睬涧。
- 支持推送消息的過濾處理。
項(xiàng)目地址
https://github.com/xuexiangjys/XPush
XQRCode
一個(gè)非常方便實(shí)用的二維碼掃描旗唁、解析畦浓、生成庫
XQRCode作為一個(gè)二維碼掃描的應(yīng)用庫,是基于zxing的識(shí)別功能實(shí)現(xiàn)的检疫。它的設(shè)計(jì)目標(biāo)就是方便讶请、好用以及易拓展。
設(shè)計(jì)原由
二維碼掃描功能在App中可以說是一個(gè)非常常見的功能了屎媳,而且在網(wǎng)上也有很多相關(guān)的開源庫夺溢,那我為何還要自己重復(fù)造輪子呢?其實(shí)最初我使用的也是別人的開源庫:android-zxingLibrary.使用起來很方便剿牺,但問題也很多企垦。還是那句話,易用性和靈活性不能很好地共存晒来。雖然使用起來非常方便钞诡,但是默認(rèn)提供的掃描界面效果并不是很理想,而且想自定義掃描界面非常地麻煩湃崩,很多掃描參數(shù)都無法自定義設(shè)置荧降,不支持多次掃描,代碼的耦合性非常高攒读。
設(shè)計(jì)思路
通過提供兩種自定義的方式:1.組件屬性自定義(自定義Fragment) 2.主題樣式自定義(自定義Activity) 這兩種方式以解決界面UI自定義難的問題朵诫。同時(shí)為一些重要的參數(shù)提供可設(shè)置的API。
解決痛點(diǎn)
- 二維碼掃描界面自定義難的問題薄扁。
- 二維碼多次掃描的問題剪返。
- 二維碼生成和解析的問題。
項(xiàng)目地址
https://github.com/xuexiangjys/XQRCode
XLog
一個(gè)簡易的日志打印框架(支持打印策略自定義邓梅,默認(rèn)提供2種策略:logcat打印和磁盤打油衙ぁ)
XLog是一個(gè)非常方便易用的日志打印框架,主要提供日志打印輸出的能力日缨∏矗可以靈活地控制日志打印的樣式和策略。
設(shè)計(jì)原由
在沒有XLog之前做日志打印的時(shí)候,基本都是基于工具類進(jìn)行打印的面哥,這就出現(xiàn)了一個(gè)比較嚴(yán)重的問題:定制化的問題哎壳。因?yàn)椴煌燃?jí)的日志需要打印的內(nèi)容是不一樣的,而且不同業(yè)務(wù)下打印的日志信息內(nèi)容也是不一樣的尚卫。例如:崩潰日志需要將盡可能的信息都記錄下來归榕,單獨(dú)存成一個(gè)文件;一般性的錯(cuò)誤日志需要將堆棧信息打印出來焕毫;關(guān)鍵點(diǎn)的日志需要將入?yún)⒍卓馈⒊鰠ⅰ⒑臅r(shí)以及所處線程等信息都打印出來邑飒;一般性的埋點(diǎn)信息可能只需要打印極少的內(nèi)容....
當(dāng)日志打印出現(xiàn)如上需求的時(shí)候循签,想只通過簡簡單單的工具類來實(shí)現(xiàn)日志打印就顯得非常蹩腳了。
設(shè)計(jì)思路
為了解決定制化的問題疙咸,這里我借鑒了logger的設(shè)計(jì)思想县匠,將日志打印拆分為兩個(gè)部分:日志格式策略和打印策略。日志格式策略主要負(fù)責(zé)日志輸出信息和樣式的處理撒轮,而打印策略主要負(fù)責(zé)日志輸出打印乞旦。
除此之外,為了能夠?qū)Ξ惓1罎⑦M(jìn)行定制化處理题山,我還專門設(shè)計(jì)了一套崩潰處理的定制化方案兰粉,支持崩潰信息展示、郵件發(fā)送等形式顶瞳。
解決痛點(diǎn)
- 解決日志定制化的問題玖姑。支持自定義日志格式策略IFormatStrategy和打印策略ILogStrategy。
- 支持自定義日志文件存儲(chǔ)形式(文件前綴慨菱、時(shí)間片存儲(chǔ)等)焰络。
- 支持自定義崩潰日志處理【默認(rèn)提供了3種處理方式】。
- 支持第三方打印接口的適配符喝。
項(xiàng)目地址
https://github.com/xuexiangjys/XLog
XRouter
一個(gè)輕量級(jí)的Android路由框架闪彼,基于ARouter上進(jìn)行改良,優(yōu)化Fragment的使用协饲,可結(jié)合XPage使用畏腕。
XRouter是我在仔細(xì)研讀ARouter框架的源碼之后,結(jié)合我使用XPage過程中遇到的問題茉稠,而進(jìn)行重新改寫的一個(gè)框架描馅,一般是配合XPage使用。
設(shè)計(jì)原由
在我使用ARouter的時(shí)候战惊,我發(fā)現(xiàn)它對(duì)Fragment的支持并不是很友好。說到底它主要還是為Activity路由服務(wù)的。而在我的XPage中Activity類非常少吞获,因此使用起來極為不方便况凉,不過ARouter的依賴注入設(shè)計(jì)得還是挺好的,因此改進(jìn)它對(duì)Fragment的支持就顯得尤為重要各拷。
解決痛點(diǎn)
- 讓ARouter對(duì)Fragment的支持更加友好刁绒。
- 配合XPage使用。
項(xiàng)目地址
https://github.com/xuexiangjys/XRouter
XOrmlite
一個(gè)方便實(shí)用的OrmLite數(shù)據(jù)庫框架烤黍,支持一鍵集成知市。
XOrmlite是我在接觸了APT(編譯時(shí)注解處理)技術(shù)后,在數(shù)據(jù)庫框架構(gòu)建上的一項(xiàng)應(yīng)用速蕊。通過它嫂丙,你可以一鍵集成ormlite數(shù)據(jù)庫框架,非常得方便规哲。
設(shè)計(jì)原由
做Android都必定會(huì)和SQLite打交道跟啤,無奈在Google還沒有提供Room數(shù)據(jù)庫框架的時(shí)候,真的是要被SQLite折騰廢了唉锌,好在后來有了ormlite數(shù)據(jù)庫框架隅肥。
在使用了ormlite一段時(shí)間后,我發(fā)現(xiàn)應(yīng)用使用的數(shù)據(jù)庫不一定都是內(nèi)存數(shù)據(jù)庫袄简,可能還需要讀取操作外部存儲(chǔ)的數(shù)據(jù)庫腥放,于是我又對(duì)其做了一定的封裝,讓其同時(shí)支持內(nèi)部數(shù)據(jù)庫和外部存儲(chǔ)數(shù)據(jù)庫绿语,同時(shí)增加了數(shù)據(jù)庫連接池的功能秃症。
但就是這樣,在使用的過程中我仍然發(fā)現(xiàn)庫在項(xiàng)目間的移植非常麻煩,每次引入都需要?jiǎng)?chuàng)建幾個(gè)幾乎完全類似的類汞舱,而應(yīng)對(duì)的通常做法就是復(fù)制粘貼伍纫,有時(shí)有的地方不修改就可能導(dǎo)致出錯(cuò),總之還是比較麻煩的昂芜。同時(shí)莹规,在數(shù)據(jù)庫第一次打開的時(shí)候,我們還需要根據(jù)數(shù)據(jù)庫類去創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫表泌神,有的時(shí)候漏了個(gè)沒發(fā)現(xiàn)良漱,結(jié)果就有可能出現(xiàn)排查了一下午問題最后發(fā)現(xiàn)是漏寫了一個(gè)類的尷尬。因此需要使用APT技術(shù)欢际,在程序編譯時(shí)自動(dòng)幫我們生成那幾個(gè)我們每次都需要?jiǎng)?chuàng)建的類以及收集我們所有使用到的數(shù)據(jù)庫實(shí)體類信息母市,這樣就可以大大減少錯(cuò)誤的發(fā)生,降低了庫的引入難度损趋。
設(shè)計(jì)思路
XOrmlite的設(shè)計(jì)思路很簡單患久,就是基于享元模式做了一個(gè)數(shù)據(jù)庫連接池,然后對(duì)Ormlite數(shù)據(jù)庫進(jìn)行了二次封裝,然后通過APT技術(shù)分別生成數(shù)據(jù)庫框架構(gòu)建所需要的連接池和實(shí)現(xiàn)接口蒋失,并自動(dòng)收集項(xiàng)目中所使用到的所有數(shù)據(jù)庫實(shí)體信息類用于數(shù)據(jù)庫表的初始創(chuàng)建返帕。
解決痛點(diǎn)
- 支持自動(dòng)生成數(shù)據(jù)庫管理倉庫DataBaseRepository和自動(dòng)搜索所有的數(shù)據(jù)庫表類,并自動(dòng)創(chuàng)建數(shù)據(jù)庫表篙挽,簡化了數(shù)據(jù)庫框架的引入荆萤。
- 支持內(nèi)部存儲(chǔ)和外部存儲(chǔ)兩種數(shù)據(jù)庫,支持自定義數(shù)據(jù)庫存儲(chǔ)位置铣卡。
- 提供了常用的數(shù)據(jù)庫操作API链韭,簡化了數(shù)據(jù)庫的使用。
項(xiàng)目地址
https://github.com/xuexiangjys/XOrmlite
XTCP
一個(gè)便捷的TCP消息包拼裝和解析框架
XTCP是一套能夠自動(dòng)進(jìn)行TCP消息包拼包煮落、拆包和解析的框架敞峭,類似于Google的protobuf.
設(shè)計(jì)原由
相信做過Android嵌入式開發(fā)或者智能硬件的人都知道,設(shè)備間的通訊基本都是基于自定義TCP協(xié)議來實(shí)現(xiàn)的州邢。Http協(xié)議其實(shí)也是TCP協(xié)議的一種儡陨,但由于它攜帶的附帶信息過多,效率并不高量淌,因此在做嵌入式開發(fā)的時(shí)候一般的做法都是自定義TCP協(xié)議來實(shí)現(xiàn)通訊骗村。但是自定義協(xié)議這就需要牽涉到組包和拆包的工作。如果協(xié)議少的話呀枢,手動(dòng)拆解包還是可行的胚股。但是如果當(dāng)協(xié)議的數(shù)量達(dá)到百來?xiàng)l以上的話,這個(gè)時(shí)候再進(jìn)行手動(dòng)拆解包的話就相當(dāng)累了裙秋,而且如果協(xié)議發(fā)生變化的話琅拌,改起來不但非常痛苦,而且也容易出錯(cuò)摘刑,代碼的可讀性和可維護(hù)性都比較差进宝。
設(shè)計(jì)思路
通過APT(編譯時(shí)注解處理)技術(shù),對(duì)標(biāo)注了@Protocol和@ProtocolField類進(jìn)行自動(dòng)統(tǒng)計(jì)和建立映射關(guān)系枷恕,解析時(shí)借鑒了Gson的思路党晋,采用注解反射和遞歸的方式進(jìn)行拼包和解析。
解決痛點(diǎn)
- 簡單通過@Protocol和@ProtocolField的配置徐块,即可讓實(shí)體對(duì)象擁有自動(dòng)轉(zhuǎn)化為TCP傳輸?shù)腷yte數(shù)據(jù)和自動(dòng)byte數(shù)據(jù)解析未玻。
- 支持byte、short胡控、int扳剿、long、byte[]昼激、short[]庇绽、int[]锡搜、long[]、String等常用基礎(chǔ)類型瞧掺,支持類型的拓展余爆。
- 支持無符號(hào)數(shù)和有符號(hào)數(shù)兩種。
- 支持BCD編碼格式【時(shí)間夸盟、int、float像捶、double等】上陕。
- 支持大端和小端兩種存儲(chǔ)方式,支持設(shè)置全局默認(rèn)存儲(chǔ)方式和局部存儲(chǔ)方式拓春。
- 支持short释簿、int、long讀取長度的自定義硼莽。
- 支持對(duì)實(shí)體字段進(jìn)行排序庶溶,避免解析錯(cuò)亂。
- 支持自定義協(xié)議項(xiàng)和協(xié)議解析器懂鸵。
- 支持對(duì)不定長數(shù)組解析【需要注意的是偏螺,在一條協(xié)議中有且只能有一個(gè)不定長的數(shù)組,否則將無法解析成功】匆光。
- 支持自動(dòng)協(xié)議映射套像,自動(dòng)根據(jù)讀取的opcode識(shí)別出對(duì)應(yīng)的協(xié)議并進(jìn)行解析,并根據(jù)對(duì)應(yīng)注冊(cè)的協(xié)議信息判斷協(xié)議是否有響應(yīng)终息。
項(xiàng)目地址
https://github.com/xuexiangjys/XTCP
XUtil
一個(gè)方便實(shí)用的Android工具類庫
XUtil主要是我平時(shí)在開發(fā)過程中對(duì)一些實(shí)用工具類的整理夺巩。除此之外還包括一些常用的代碼混淆配置和Android Gradle腳本。
項(xiàng)目地址
https://github.com/xuexiangjys/XUtil
RxUtil2
一個(gè)實(shí)用的RxJava2工具類庫
RxUtil2主要包含了RxJava2常用操作符的相關(guān)應(yīng)用周崭。
解決痛點(diǎn)
- RxBus 支持多事件定義柳譬,支持?jǐn)?shù)據(jù)攜帶,支持全局和局部的事件訂閱和注銷续镇。
- 提供統(tǒng)一的訂閱池管理美澳。
- 支持非侵入式的訂閱生命周期綁定。
- 提供簡易的線程調(diào)度輔助工具磨取。
- RxBinding 和 RxJava 常用操作符使用工具人柿。
項(xiàng)目地址
https://github.com/xuexiangjys/RxUtil2
XIPC
一個(gè)Android通用的IPC(進(jìn)程通信)框架。該項(xiàng)目主要是模仿餓了么開源項(xiàng)目Hermes的設(shè)計(jì)進(jìn)行的自我理解改寫忙厌。
XIPC是一套非常方便的IPC(進(jìn)程通信)框架凫岖。它可以將進(jìn)程間通信的蹩腳方式(寫AIDL接口)簡化為像調(diào)用本地服務(wù)一樣方便。當(dāng)初也是因?yàn)橄朊錒ermes的實(shí)現(xiàn)原理逢净,于是從0開始跟著源碼自己手?jǐn)]了一個(gè)哥放。
設(shè)計(jì)原由
其實(shí)Android進(jìn)程間通訊的方式有很多種歼指,例如:Bundle、AIDL甥雕、Socket踩身、ContentProvider等,其中因AIDL方式提供的功能更強(qiáng)大社露,且支持實(shí)時(shí)通訊挟阻,因此成為很多人進(jìn)行進(jìn)程通訊的方式。但問題就是峭弟,使用AIDL方式來實(shí)現(xiàn)進(jìn)程通訊較為復(fù)雜附鸽,且需要處理好線程同步等問題,使用起來不是很方便瞒瘸。如果進(jìn)程通訊使用的場(chǎng)景不多的話坷备,姑且使用AIDL的方式還算湊合,但如果使用的地方非常多的話情臭,那就非常麻煩了省撑,因?yàn)榭赡苄枰x一堆接口和服務(wù),那用起來是真的很麻煩了俯在。
設(shè)計(jì)思路
XIPC主要借鑒了Retrofit的設(shè)計(jì)思路竟秫,采用動(dòng)態(tài)代理、注解反射跷乐、AIDL鸿摇、服務(wù)綁定和進(jìn)程間垃圾回收等技術(shù)實(shí)現(xiàn)。詳細(xì)實(shí)現(xiàn)原理請(qǐng)點(diǎn)擊查看.
解決痛點(diǎn)
- 支持自定義服務(wù)接口實(shí)現(xiàn)進(jìn)程通信劈猿,無需定義AIDL接口拙吉,所有IPC通信就像調(diào)用本地函數(shù)一樣簡單。
- 支持自定義接口服務(wù)(服務(wù)發(fā)現(xiàn))揪荣、獲取單例和獲取工具類方法筷黔。
- 支持進(jìn)程通信的接口回調(diào)。
- 支持接口回調(diào)的線程控制仗颈。
- 擁有垃圾回收機(jī)制佛舱,防止接口回調(diào)內(nèi)存泄漏。
- 支持跨進(jìn)程和跨應(yīng)用通信挨决。
項(xiàng)目地址
https://github.com/xuexiangjys/XIPC
XVideo
一個(gè)能自動(dòng)進(jìn)行壓縮的小視頻錄制庫
XVideo主要采用FFmpeg技術(shù)實(shí)現(xiàn)視頻錄制请祖。主要解決使用系統(tǒng)API視頻錄制文件過大的問題,支持在視頻錄制的過程中自動(dòng)進(jìn)行視頻壓縮脖祈。
解決痛點(diǎn)
- 支持自定義小視頻錄制時(shí)的視頻質(zhì)量肆捕。
- 支持自定義視頻錄制的界面。
- 支持自定義最大錄制時(shí)長和最小錄制時(shí)長盖高。
- 支持自定義屬性的視頻壓縮慎陵。
項(xiàng)目地址
https://github.com/xuexiangjys/XVideo
XFloatView
一個(gè)簡易的懸浮窗實(shí)現(xiàn)方案
解決痛點(diǎn)
- 支持自定義布局的懸浮窗眼虱。
- 支持自定義拖動(dòng)事件、點(diǎn)擊事件席纽。
- 支持懸浮窗自動(dòng)吸附效果捏悬。
- 支持初始化懸浮窗的位置。
- 支持懸浮窗翻轉(zhuǎn)吸附润梯。
- 支持各手機(jī)廠商Rom的懸浮窗權(quán)限申請(qǐng)过牙。
項(xiàng)目地址
https://github.com/xuexiangjys/XFloatView