Android移動開發 - 聊聊女媧

jopen 8年前發布 | 28K 次閱讀 Android
 

開源一個月, Nuwa 收獲了1000個star,雖然不是很理想,但也算是個不錯的成績吧。之前考慮到Github上外國人的傳播能力,Nuwa的readme采用英文書寫,結果證明這并沒有什么卵用,有些人說要看中文的介紹,你看他們多么懶。中文介紹不寫了,這篇文章我打算聊聊女媧,聊聊開源。

背景

2014年,代碼家寫了很多自定義控件,成了Github榜上非常有名的男人。

人們開始意識到,自定義控件是個好東西啊,簡單且受歡迎,從某種角度來說,很適合做成開源項目。

于是,Android的圈子里炸裂了,一個又一個的自定義控件出現了,人們在微博上求轉發求擴散求星星,直到今天,這種現象仍在繼續。

你看,大頭鬼和我現在是很好的朋友。認識他,也是看到了他寫的一個控件,后來把他挖到了點評。半年的時間,他已經成了RxJava教父,工資也是漲得飛起,真是開源改變人生。

程序員都想有自己的作品,都希望Github上有能拿出手的東西。本來也有寫自定義控件的打算,但我這個人追求B格,又苦于沒有好的idea,所以遲遲未曾動手。

我想,我是在等待一個女孩,哦不,一個機會。

機會

當Bugly的那篇 文章 出來的時候,我想我的機會來了。

首先,熱修復這事有B格啊,偷天換日,偷梁換柱。市場有需求,又不是件很容易做的事情,人們已經嗷嗷待哺,饑渴難耐。

另外,國內還有人比我了解Android Gradle嗎?當然有,嘿嘿。但如果你讀過構建神器Gradle這篇文章的話,就知道使用Gradle更改構建流程,我已經非常得心應手。另外,更改字節碼這塊,我對ASM也比較了解。總之,我可以用Gradle穩穩地搞定熱修復。

我想,我又被歷史選中了。

戰斗

很快,在公司的項目上做了一個實驗,添加Gradle任務修改字節碼,dx生成補丁文件,替換成功了,呵呵,這么簡單。

然后打算寫成開源項目,打算寫一個插件用來修改字節碼和生成補丁文件,然后寫一個SDK用來操作dex文件。

寫庫的過程中,遇到了各種問題。

首先是新建了一個項目,不用插件,直接在build.gradle中添加任務,熱修復竟然不成功了,為什么?這究竟是為什么?百思不得其解。那晚,月黑風高,在加班回家的住租車上,我終于想明白了,manifest中沒有加SD卡讀權限,關鍵是整個過程中沒有error沒有warning。我只想說,what the fuck。

然后,另一個問題來了,需要修改Class文件,那怎么找到全部Class呢?

公司的項目使用了MultiDex,并且沒有混淆,這種情況很簡單,dex任務之前會生成一個jar文件,包含了所有的class,所以做起來很容易。但是如果添加了混淆怎么辦?試了一下,也是proguard后也是生成了一個jar包,也沒啥問題。

世界是這么簡單的嗎?當然不是,AS默認新建的工程沒有開啟MultiDex和Proguard,沒有找到我想要的那個包含所有類的jar包。查看任務輸入輸出,發現這種情況下,會有一個preDex的任務。查看dex任務的輸入,了解到preDex會在dex任務之前把所有的庫工程和第三方 jar包提前打成dex,下次運行只需重新dex被修改的庫,以此節省時間。dex任務會把preDex生成的dex文件和主工程中的class文件一起生成class.dex,這樣就需要針對有無preDex,做不同的修改字節碼策略。看了下gradle plugin的源代碼,主要是這兩種情況吧,那時候gradle還是1.3版本,后來略過1.4出了1.5,添加了transform接口,正好解決了操縱class文件時機的問題。

還有一個問題,gradle腳本常寫,但插件沒寫過啊,比著葫蘆畫瓢,中間也走了不少彎路,當時愚蠢的沒有用本地倉庫,每次調試代碼,上傳到jcenter,jcenter本來就卡,還經常遇到上傳錯誤,總之寫的很是糾結。

發布

熬了好幾次夜,大約兩周的時候,這個庫基本成型了。疲憊的我,意外發現Github上已經出了一個類似的庫HotFix,看了一下基本上屬于一個Demo,沒有考慮各種情況,Gradle支持的也不是很完美,我的地盤怎么能由你做主,于是我還是決定即刻發布這個項目。

做事追求B格的我,給這個庫取了個高大上的名字,叫女媧,英文名是Nuwa,不要愚蠢地問我為啥不叫Nvwa。阿里有個熱修復的庫叫 andFix,360有個插件叫droidPlugin,搞android的庫不是and就是droid,本來我也有這想法的,但感覺還是太low了,當然在我發布女媧那段時間,我看到DroidFix,AndPatch,DroidPatch等等。你看,很多人想到了一個idea,然后四五個做出來,然后有一個做的最好,然后他得到了1000顆星。

B格不能停止,當初看LayoutCast的readme,流利的英文讓我不能忘懷,所以Nuwa必須用英文寫,那天晚上我就急急忙忙的寫了英文文檔,本來也想照顧一下國際友人,結果發現然并卵,并沒有幾個老外star我的項目。

凌晨的時候,發布了這個項目,當然不忘在微博上@一下各位老友,我能預料當我一覺醒來,這個江湖注定又是一片沸沸揚揚。

結果

一切都沒有懸念,第二天,微博上人們轉發著,Github上星星增長著,但到200多顆星的時候,Nuwa還沒有上trending榜,看了下 trending的介紹說,說一天會刷新8次數據的,那為啥我還沒上榜,Github上的今天到底是什么時候開始,我想我能做的只有等待,然后第三天的時候,才上了榜,我只想說,trending你不懂愛。

后來,大頭鬼強迫我去天天動聽做了一次分享,我又梳理了一下知識點,PDF在 這里 ,這可能是僅有的關于Nuwa的中文介紹。PDF里也提到了Nuwa存在的一些問題,本來打算后面慢慢優化的,但也不知道會不會搞了,如果公司要上熱修復的話再說吧。

第一天200多個star,一個月才到1000,所以現在的情況是低于預期的,我總結了一下原因,是因為代碼家沒有轉發我的微博,嗯,是的。

就這樣吧,也好。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!