聊聊女娲
更新日期:
开源一个月,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,所以现在的情况是低于预期的,我总结了一下原因,是因为代码家没有转发我的微博,嗯,是的。
就这样吧,也好。