X-Library系列Android應(yīng)用框架詳解

自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)目地址


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ì)思路來源于RxEasyHttpaxios诲侮。綜合使用了原型模式、構(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


聯(lián)系方式

在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纺铭,隨后出現(xiàn)的幾起案子抒和,更是在濱河造成了極大的恐慌,老刑警劉巖彤蔽,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庙洼,居然都是意外死亡顿痪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門油够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚁袭,“玉大人,你說我怎么就攤上這事石咬】模” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鬼悠,是天一觀的道長删性。 經(jīng)常有香客問我,道長焕窝,這世上最難降的妖魔是什么蹬挺? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮它掂,結(jié)果婚禮上巴帮,老公的妹妹穿的比我還像新娘。我一直安慰自己虐秋,他們只是感情好榕茧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著客给,像睡著了一般用押。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靶剑,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天只恨,我揣著相機(jī)與錄音译仗,去河邊找鬼。 笑死官觅,一個(gè)胖子當(dāng)著我的面吹牛纵菌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播休涤,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼咱圆,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了功氨?” 一聲冷哼從身側(cè)響起序苏,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捷凄,沒想到半個(gè)月后忱详,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跺涤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年匈睁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桶错。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡航唆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出院刁,到底是詐尸還是另有隱情糯钙,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布退腥,位于F島的核電站任岸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狡刘。R本人自食惡果不足惜演闭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颓帝。 院中可真熱鬧米碰,春花似錦、人聲如沸购城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘪板。三九已至吴趴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侮攀,已是汗流浹背锣枝。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工厢拭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撇叁。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓供鸠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陨闹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楞捂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 請(qǐng)?jiān)试S我借鑒前輩們的東西~~~~ 感激不盡~~~~~ 以下為Android 框架排行榜 么么噠~ Android...
    嗯_(tái)新閱讀 2,017評(píng)論 3 32
  • 自己總結(jié)的Android開源項(xiàng)目及庫。 github排名https://github.com/trending,g...
    passiontim閱讀 2,531評(píng)論 1 26
  • 昨晚微信視頻時(shí)看到10歲的表弟的小肚腩小了許多趋厉,于是我便和他約定:40天后誰瘦的的更多些寨闹。目前他75斤,我110斤...
    木大可大閱讀 189評(píng)論 0 0
  • 孫文娟 滄州 焦點(diǎn)解決第64期學(xué)員 堅(jiān)持分享第85天(20190406) 昨天晚上突然決定給二寶斷奶君账,告...
    娟兒_6859閱讀 93評(píng)論 0 0
  • 我沒有一顆靜的心繁堡,但我一定會(huì)努力使自己的心變?yōu)殪o的心我認(rèn)為靜有兩種:冷靜、平靜 冷靜 冷靜乡数,遇事要冷靜椭蹄。當(dāng)以一顆慌...
    王巍瑾_三月閱讀 63評(píng)論 0 1