悦跑圈 Android 单业务开发,提高编译效率 15 倍

Android · kkmike999 · Created at · Last by mm0089 Replied at · 6360 hits
96

关于标题

“15倍”是怎么算出来的呐?

配置:
Mac mini,双核 Intel Core i5 2.6GHz,8G内存,SSD(自行更换)

性能:

全量编译application平均需要5分钟,单业务application编译运行,平均仅需7~20秒. (300s/20s = 15)

(如果你用相同配置windows系统,基本是编译不过去的,至少要i7。)

什么是单业务编译

如果读者你看过笔者写的《App组件化与业务拆分那些事》《Android使用Provider做业务数据交互》,就能了解如何对工程划分业务了,此处不累赘。

那两篇文章,是为本文做铺垫。前两篇讲了开发思路、理念方面,说了那么多优点,貌似也没什么实质数据支撑。那么,本文让你见识一下分业务开发的力量。

常见的开发模式,是一个工程,一个application、多个module或无module。

单application,多module

这种模式不足够支撑日益庞大的工程。于是,我们提出:

一个工程,多个application、多个module。

多application,多module
(由于排版问题,此图省略了Base Library)

Main Application跟“单application”时的Application一样,就是我们打包的application. 那么,application A、application B...又是什么呢?

从图里面看出,Application A只依赖Module A,Application B只依赖Module B....每个application可独立编译、运行。

独立编译业务优势

1.编译快、单元测试快
2.简化调试流程
3.更专注业务
4.可嵌入不需要在Main Application执行的代码
5.隔离不必要的业务和组件

1.编译快

正如前文提到,悦跑圈从全量编译平均5分钟,降到单业务编译7~20秒。就这么一个优势,就有充足的理由让我们从单application改造成多application

单元测试快

说说单元测试吧,很多同学都冲着“单元测试快速反馈结果、能提高开发效率”。然而,自身工程臃肿不堪,跑一个单元测试gradle会全工程扫描(部分或全量编译),时间上压根谈不上快(尽管比运行app再手动debug要好很多),有error还报错。这种情况还是挺常见的,例如你在重构代码,改几个业务,必须所有业务代码都写好(至少没有error),才能跑单元测试。

当项目按业务分成若干module,跑单元测试时,gradle仅扫描该业务module,即使其他module有报错,也不影响本次单元测试。而且因为编译代码量少,单元测试就能跑快了。

我们目前跑一个junit单元测试,算上编译和运行时间,仅需几秒。如果用robolectric跑DAO测试,就比较慢了,这个跟robolectric框架机制有关。

2.简化调试流程

业务比较多的APP,不一定每个功能的入口都很明显,有可能依赖其他功能流程。单业务application运行很好地解决了这个问题。

例如,你要调试“查看某用户勋章”,那么你必须先进入该用户界面,再点击“他的勋章”,才能进入“勋章墙”界面。你要找到用户名叫“键盘男”(uid=4)的用户,必须先去“发现用户”界面,输入“键盘男”或“4”,点击搜索,从搜索结果列表,找到想要找的“键盘男”用户,再点进去......光想想就觉得蛋疼,更别说做代码调试。

发现用户 -> 搜索“键盘男” -> 进入用户详情界面 -> 进入uid=4勋章墙

全流程

由于单业务application不会编译进Main application,因此我们在单业务application做什么都可以。于是,我们可以在“勋章application”写一个页面,有个Button和EditText,EditText输入uid,点Button直接进入该uid的勋章墙界面。是不是很简单?

EditText输入4 -> 进入uid=4勋章墙

单业务流程

同学们回忆一下,自己是不是把很多调试时间浪费在繁琐的流程上?

3.更专注业务

这个话题在笔者前两篇文章提及很多次了。一个业务一个module,能让你更清晰地管理业务代码和资源;现在,一个业务一个application,能让你更清晰地梳理业务流程,单业务application仅依赖当前业务module,让开发人员隔离无关业务代码。

对于经验尚浅的同学,这点可能稍微难理解。说实话,“专注业务”听起来比较虚,但恰恰能无形地让程序员提高开发效率。

例如,单业务开发把业务之间代码隔离,一来不会让你的业务代码干扰其他开发人员,二来其他业务代码也不会干扰你的代码

再举个反例,如果你在业务A写了ImageUtils.getSize(),其实这个ImageUtils跟业务A相关,例如根据dpi获取A界面某图片显示大小;在没有分业务开发情况下,业务B也调用你的ImageUtils.getSize(),当业务A修改ImageUtils.getSize(),业务B就有bug了.....如果是分业务开发,业务A下的ImageUtils(应该命名为AImageUtils)不可能被业务B调用,那么开发业务B的同学,只能乖乖地自己写一个BImageUtils.getSize()

CodeReview时,审核人要review业务A代码,他只需要看A module下的代码即可,不需要关心其他module代码,那么review速度和质量,自然有所提高。

这些情况,在平常开发中经常碰到,分业务开发可以很大程度上避免上述低级错误。归根到底,分业务就是高内聚,低耦合的编程理念:单业务高内聚,业务之间低耦合。

4.可嵌入不需要在Main Application执行的代码

这主要针对调试时修改数据的场景。例如,调试“无本地缓存,重新请求数据”场景,如果每次调试都要清空整个app数据,很麻烦,而且可能引起流程上的问题。

单业务application为这种场景提供了解决方案:在单业务application某Activity,点击某个Button,执行清空某数据的代码。

调试场景:
1.断网 -> 勋章墙 -> 显示缓存勋章
2.断网 -> 清空勋章数据 -> 无勋章,并显示默认图

清空缓存

如果没有单业务application,怎么做?很可能在某个界面,写一个Button,点击清空数据勋章缓存。但这里有问题,Button是写在勋章业务module,Main Application会依赖,在打包时需要去掉这部分代码,或者加if(BuildConfig.DEBUG)等条件。笔者非常不支持这种会影响Main application的做法,有可能因为这个改动,引起不必要的bug。

单业务application还能实现很多场景,希望同学们能自己去发掘!

5.隔离不必要的业务和组件

在本文“3.更专注业务”已经探讨了“隔离业务”,这里继续补充一下更多场景。

隔离其他业务数据

悦跑圈Android 勋章业务 需要获取 跑步业务 中个人跑量数据。按常理,为了实现这个需求,勋章业务 要依赖 跑步业务。我们的《Android使用Provider做业务数据交互》方案,正好解决依赖问题。

使用Provider可以让勋章业务不需要依赖跑步业务,但问题来了,个人跑量数据谁提供?在单业务application中,我们可以声明一个MockRunProvider,跟跑步业务RunProvider实现同样的RunProtocol接口,并保持authority一致;或者修改服务中心路由配置,让原来指向RunProviderrun authority,改成指向MockRunProvidermock authority。当然,MockRunProvider返回的数据不是真实的,是写死的。

由于编译运行单业务application很快,你可以快速地修改MockRunProvider数据来调试,这让开发人员省去很多不必要的流程。例如,需求当跑量大于1000KM显示文案X:正常开发流程,服务器上必须有某用户信息跑量大于1000KM,跑步业务请求回本地,再调用RunProvider才返回个人跑量,又或者在debug模式动态修改变量;而单业务application+MockRunProvider只需要写死跑量1000+KM就可以走后面的流程了,根本不需要关心服务器数据和请求数据,也不需要debug模式修改数据,开发人员只需要关心勋章业务如何实现即可!

隔离、替换组件

悦跑圈Android使用各种开源库,在《国内Top500Android应用分析报告》就看到我们使用RxJava(logo还挺醒目的^_^)。不是每个业务都需要所有组件,那么单业务application,可以按需要引用开源库(当然rxjava无处不在),原理跟按需依赖业务module一样。

替换组件,目前我们还不需要做。之前去GMTC听天猫团队介绍,他们的日志组件、网络组件等,代码量都很大,而且做了很多事情,如果在业务开发时使用,一来加大编译压力,二来调试比较麻烦。他们业务、组件本身是接口隔离,在开发业务时,可以使用更简单的日志、网络组件,来替换笨重的原组件,可以缩短编译时间,而且调试方便。这一点跟上文提到“业务隔离”思路如出一辙。


遇到困难

上述侃侃而谈单业务开发那么多好处,事实上我们也是匍匐前进、连爬带滚地一路走过来。要做到业务高度隔离,并不是一件容易的事:

1.对框架熟悉
2.基础框架必须高度解耦
3.开发团队要有足够经验

1.对框架熟悉

对框架熟悉是重中之重。不像很多年轻APP,悦跑圈从第一行代码到今天,经历了不少年头,当年还是用httpClient啊!笔者有幸从悦跑圈第一行代码待到现在(居然还未被老板炒鱿鱼)。项目早期框架,也是各种耦合,有不少无注释隐晦的代码,笔者还是挺熟悉,毕竟不少烂代码出自笔者手,,这给后期重构带来很大帮助。

开发团队还会遇上人员变更的状况,写某个业务的程序员离职了,然后这个版本要对这个业务加需求。如果原业务代码很隐晦,注释又少,这就非常蛋疼了。笔者建议,如果原代码真的非常难懂,直接重构吧!(记得做单元测试)

2.基础框架必须高度解耦

原则上,基础框架是不能跟任何业务耦合的。要做到这点相当不容易,例如请求接口时,需要带上用户信息,用户信息需要依赖用户业务,怎么办?

目前的解决方案,把用户信息作为静态变量,用静态方法获取,如果获取不到,读取本地数据。因此,读取用户本地数据,作为基础框架一部分。用户业务还有很多功能,请求用户信息、用户界面等,这些跟基础框架是解耦的。

还有组件,日志、网络等组件,这些是不是应该互相解耦?目前我们还是有相互依赖,一并放在基础框架,日后我们会改善这一块。

总而言之,基础框架越轻量越好,保证必要的功能,不是经常使用的组件、业务,让单业务application分别依赖即可。

3.开发团队经验

不怕神一样的对手,只怕猪一样的队友。

(没特指我们团队,切忌自行脑补)

这年头,要找靠谱的程序员,十分不容易。遇到水平低的小伙伴,好比王者农药团灭时的痛苦。幸好笔者领导挑人的水平,还是不错的。

有靠谱的团队,是开发的原动力之一。团队在技术上一拍即合的概率,不比遇到一见钟情的伴侣高。如果萍水相逢的队友,在技术上有分歧是正常的,如果由于技术前瞻性不足,对前沿技术抱着抵触心理,麻烦就大了。之前有位2015年末离职的同事,工作经验比笔者要久,他在使用rxjava上存在分歧,认为需要更长时间观察rxjava。经过一番讨论,他选择离职(当然并不主要是rxjava的原因,更多的是对团队氛围的不适应)。现在,做Android的同学谁不知道rxjava?

本文所说的分业务开发、单业务application,基础框架解耦,实现起来并不简单,在笔者刚提出这种方案时,也不是所有队友都同意。有队友认为这样做太麻烦,还不如用Freeline来得直接。不过笔者不习惯使用Freeline,因为使用时遇到不少坑,还是老老实实把代码分业务,减少单次编译量这种做法才能从根本上解决编译慢的问题。目前Android项目是允许Freeline存在,毕竟分业务开发和Freeline是不冲突的,多尝试前沿技术,对团队来说好处多余坏处。

靠谱的团队,是你的backup。
靠谱的团队,在你遇到困难时共同面对;
靠谱的团队,在你尝试新技术掉坑时,及时给你提出适当的解决方案;
靠谱的团队,在你技术止步不前时,为你打几管鸡血;


小技巧

多个业务流程联调

笔者一直强调单业务application开发,其实可以不止单业务,可以是多业务application。当需要几个业务联调(功能测试),多业务application的价值就体现出来了。

例如,报名“广州线上马拉松”,立即获得“广州线上马勋章”,并需要弹窗提示。这里涉及两个业务:线上马业务勋章业务,线上马拉松报名页是 线上马业务,勋章弹窗是勋章业务。这时一个application依赖 线上马module勋章module,线上马报名完毕后,调用 勋章provider,请求后端数据,执行弹窗逻辑。

当需要多个业务联调,application可以依赖多个业务,但必须保证业务module之间是解耦的。

反向调用Main Application代码

在重构过程,不时会遇到某些代码互相耦合,一改就要改一大片。在有限的开发时间里,这样做是很危险的,因为你不知道遗留代码牵连到多少旧代码,太大的改动很可能引起各种bug不说,紧张的开发周期不允许你这么做。

本文不断提到provider做业务之间数据交互,不仅仅是平行的业务module之间能通过provider互相调用,业务module也可以用provider反向调用Main Application的代码。因此,遇到相互耦合代码,可以把已明确的某业务的代码放到该业务module,依赖交给provider去解耦。


不足

代码合并

我们开发使用git-flow工作流程,我相信很多同学也这么做。由于单业务application开发模式,也是把所有业务(不是所有组件)放在一个工程下,所以,单一工程git-flow合并代码时,同样有单一工程的诟病:所有代码都有可能merge和冲突

merge和解决冲突是合并时必不可少的环节,为什么笔者说成诟病?笔者强调的是“所有代码都有可能”,并不是指merge和冲突。

开发新功能到merge时,最怕就是别人改了的代码你也改了,需要解决冲突。单一工程merge分支时,对于代码审核人员来说,所有代码都可能被改动。当他Review时就非常蛋疼了,要不仔细查看每次commit的代码,要不只挑重要代码看,要不不审直接merge。当大量代码merge,审核人员根本没时间看每次commit的代码,基本只能先merge,再运行或者单元测试看有没问题。这样很容易隐藏的bug,只能相信测试工程师了.....

如果每个业务是一个工程,业务发布到maven仓库,主工程和业务之间通过gradle依赖,merge时就放心多了。因此一个业务一个工程,merge时只针对当前工程,因此代码有什么改动,审核人员一目了然,即使有bug也是该业务的bug,不会影响其他业务。

git-flow工作流程


总结

业务解耦手段有很多,本文提及的“provider解耦”仅仅是笔者习惯做法,对于文中描述需要解耦的地方,可以使用其他解耦方式。

一个工程多application并不是最好的开发方式,它不适合业务非常庞大的APP,例如支付宝、天猫、携程、链家等,超级APP必然是多project玩耍;也不适合业务量很少的APP,仅仅适合当前悦跑圈Android团队。

我们不会止步于现状,未来会做业务持续集成,有可能单个业务为一个工程,分多个工程开发(目前部分组件为单独工程,主工程通过maven仓库依赖)。

我相信有不少读者经验比我们要丰富,如果你有其他观点或疑问,欢迎吐槽本文。

(本文所有观点,仅代表笔者个人,不代表悦跑圈开发团队)

demo:https://coding.net/u/kkmike999/p/MultiApplication/git


关于作者

我是键盘男。
在广州生活,悦跑圈Android工程师,猥琐文艺码农。每天谋划砍死产品经理。喜欢科学、历史,玩玩投资,偶尔旅行。

本帖已被设为精华帖!
共收到 12 条回复
96
lrannn · #1 ·

受益匪浅!谢谢您的分享

96
alphahans · #2 ·

不知前辈的意思是不是相当于讲每一个业务都当作一个独立的App来写。(在工程上表现为独立的module) 他们之间通过provider来共享数据?

96

#2楼 @alphahans 不是,是每个业务写多一个application,依赖业务module,单业务application想怎么玩就怎么玩。

96
alphahans · #4 ·

#3楼 @kkmike999 大致了解思想,但是实际操作起来好像没有什么思路。 希望楼主有空的时候提供一个Demo参考一下。谢谢😄

96
kkmike999 · #5 ·

#4楼 @alphahans 在文章末尾已补充

96
brht37 · #6 ·

能请教下楼主 你们是怎么过滤gps点 避免飘移的

96
kkmike999 · #7 ·

#6楼 @brht37 这里涉及到具体算法,挺复杂的。我不负责gps方面,这个问题我不好回答。

96
hansion · #8 ·

请问楼主怎么像你一样在工程目录里又新建一个application的?new project和new module都不行啊

96
kkmike999 · #9 ·

#8楼 @hansion 你看demo吧

5733 1506307741

111

96
mm0089 · #12 ·

臺灣約妹找妓女做愛打炮賴mm0089 堅持讓你花得值得 讓你一次就滿意
薇薇外送茶優質正妹網站:http://www.kiss69lg.com/forum.php?forumlist=1&mobile=2
堅持讓你花得值得 讓你一次就滿意
保證咩咩 熟練多變的技巧 讓你三度回味
堅持誠信經營 絕不會說的天花亂墬 浪費彼此寶貴的時間
精心安排 保證約好的時間 20分鐘內火速到達
絕無強迫消費‧購買點數‧匯款‧ATM轉帳‧都是見到本人 滿意在消費
優咩咩都是經過篩選 絕無地雷 請放心光臨體驗享受
㊣平價錢又安心 熟客 新客都享有優惠
薇薇茶坊營業時間:中午12點-凌晨四點

外送地區:臺北新北林口龜山新竹臺中彰化南投高雄臺南
妹妹類型:學生 OL 巨乳 蘿莉 人妻 技術茶 空姐小模 AV女優 婚紗助理等
服務內容:全套服務
約妹流程:賴上先預約然後準時給房號在房間等妹到
約會地點:你自己選擇的旅館or熟客可送住家
消費方式:看到妹喜歡在當場現金交易 不喜歡可換三次

北部:一節6000內立減500送1000優惠券
一節7000 -8000第二節半價 買三節送一節
一節9000-10000 立減1000-2000送2次半價
一節11000-15000 立減3000-5000送3次半價
一節15000-30000 立減5000-8000 送一年半價

中南部:一節4000-5000 二節半價
一節6000-7000 買兩節送一節
一節7000-10000 買兩節送兩節
一節11000-15000 立減3000-5000送2次半價
一節15000-30000立減5000-8000送一年半價
約小姐部落格看照網址:https://www.cssanyu.org/bbs2/forum.php?mod=viewthread&tid=333726&extra=
約小姐部落格看照https://www.photostore.me/mm0089/?list=images&sort=date_desc&page=4&seek=ursjV
雙北桃園林口龜山新竹看照約妹網址:http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=143
臺中彰化南投看照約妹網址:http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=145
高雄臺南看照約妹網址:http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=147
安全旅館便宜經濟實惠旅館推薦:http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=182
色情圖片露點照片網址:http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=177
成人小說網址http://www.kiss69lg.com/forum.php?mod=forumdisplay&fid=163
台中台北外送茶莊、茶坊推薦|優質台北、高雄外約茶妹任你選南投外送茶/全套叫小姐彰化外送茶
草屯外送茶大台中外送茶,外約美女,薇薇外送茶賴mm0089外約服務網,台中一夜情 .台灣出差旅館叫小姐line:mm0089
台北外送茶/台中外送茶/高雄外送茶/台南外送茶/新竹外送茶/彰化外送茶/南投外送茶/薇薇外送茶賴mm0089大台灣台北台中高雄台南新竹地區喝茶服務外送茶薇薇外送茶賴mm0089/鼓山區看照約妹薇薇外送茶賴mm0089前鎮區美腿茶/三民區火辣茶/新興區惹火嫵媚茶/左營區MT外送... 外送/台北清涼茶莊/更多優質妹妹/台北外送茶莊/高雄外送茶/新竹外送茶/洗澡/愛愛薇薇外送茶賴mm0089/口交旅館酒店外送小姐/上門服務/薇薇外送茶賴mm0089茶魚分享/大台北外送茶坊/大台中外送茶坊/高雄外送茶/援交妹網站台灣叫小姐俱樂部,薇薇外送茶賴mm0089台北叫小姐,薇薇外送茶賴mm0089西門町外送服務 板橋外送茶高雄約妹外約茶莊薇薇外送茶賴mm0089/夜市附近叫小姐,85大樓叫小姐 高雄叫小姐按摩外送茶西?町找小姐薇薇外送茶賴mm0089林森北找茶喝/台北?正妹/台?援交找薇薇外送茶賴mm0089台北叫小姐台中旅館叫小姐高雄旅遊找妹兼職美女茶外送看照約妹好茶外送到家西?町找小姐|林森北找茶喝/台北?正妹/台?援交找薇薇外送茶賴mm0089
#台灣汽車旅館找小姐 #商旅找小姐薇薇外送茶賴mm0089 #星級酒店找小姐
#旅館找小姐 #商旅找小姐薇薇外送茶賴mm0089 #星級酒店找小姐 #旅館找小姐
#飯店找小姐 #住家找小姐薇薇外送茶賴mm0089 #賓館找小姐 #台灣出差旅遊外約 #台灣出差旅遊找小姐
#酒店外約叫茶 #台灣汽車旅館外約叫茶 薇薇外送茶賴mm0089#商旅外約叫茶 #星級酒店外約叫茶 #旅館外約叫茶 #飯店外約叫茶
#住家外約叫茶 #賓館外約叫茶 #台灣出差旅遊外約叫茶 薇薇外送茶賴mm0089#台灣出差旅遊外約叫茶 +薇薇外送茶賴mm0089#
台中外送茶 #台北外送茶 #新竹外送茶薇薇外送茶賴mm0089 #高雄外送茶 #台南外送茶 #彰化外送茶 #南投外送茶 #台中外約
#台北外約 #高雄外約薇薇外送茶賴mm0089 #新竹外約 #台南外約 #彰化外約 #南投外約 #台灣外送茶 #外送茶 #情愛全台外送茶看照約妹叫小姐
#外送茶不戴套 +薇薇外送茶賴mm0089#板橋外約 #三重外約 #永和外約 #中和外約 #汐止外約 #新莊外約 #土城外約
#新店外約 #蘆洲外約 #五股外約 #泰山外約 #淡水外約薇薇外送茶賴mm0089 #八里外約 #林口外約 #龜山外約 #台中外約 #高雄外約
#台北外約薇薇外送茶賴mm0089 #本土外約 #外約台妹 #中正外約 #大同外約 #松山外約+薇薇外送茶賴mm0089 #板橋外送茶 #板橋外約
#大安外約 #萬華外約 #信義外約薇薇外送茶賴mm0089 #士林外約 #北投外約 #內湖外約 #南港外約 #文山外約 #新竹外約 #台南外約
#西屯外約 #南屯外約 薇薇外送茶賴mm0089#北屯外約 #逢甲外約 #大里外約 #大雅外約 #七其外約 #東海外約 #烏日外約 #太平外約
#豐原外約薇薇外送茶賴mm0089 #沙鹿外約 薇薇外送茶賴mm0089#逢甲茶莊 #逢甲全套
#薇薇外送茶賴mm0089逢甲外約 #逢甲外送茶 #逢甲叫小姐 #逢甲打砲 屏東汽車旅館叫小姐.薇薇外送茶賴mm0089屏東找茶,屏東外送舒壓按摩.屏東護膚全套外約.屏東找妹薇薇外送茶賴mm0089.屏東找小姐.屏東汽車旅館叫妹妹服務薇薇外送茶賴mm0089.屏東叫小姐.妹妹服務找歡樂.薇薇外送茶賴mm0089屏東優質外送茶莊.屏東出差旅遊約妹 .薇薇外送茶賴mm0089屏東正妹論壇.屏東約情人.薇薇外送茶賴mm0089屏東找女人兼職妹.推薦屏東茶莊##屏東外約妹妹價位#屏東找小姐.薇薇外送茶賴mm0089屏東全套外送.屏東辣妹薇薇外送茶賴mm0089.屏東找學生妹.人妻
#逢甲茶訊 #逢甲援交 #逢甲找女人薇薇外送茶賴mm0089 #逢甲魚訊 #逢甲炮神器 #逢甲紓壓 #逢甲性愛服務 #逢甲鐘點情人 #
太平全套 #薇薇外送茶賴mm0089大里全套 #沙鹿全套 #豐原全套 #大雅全套 #烏日全套薇薇外送茶賴mm0089 #台中車站應召 #台中南屯約妹
#台中西屯叫小姐 #台中逢甲外送 #台中勤美約妹薇薇外送茶賴mm0089 #台中車站叫小姐 #台中北屯應召 #台中南屯叫雞 #台中車站叫妹
#台中北區叫小姐薇薇外送茶賴mm0089 #台中應召 #台中車站叫雞 #台中車站茶莊 #台中西屯外送薇薇外送茶賴mm0089 #台中逢甲約砲 #台中北屯叫妹 #台中市區應召桃園半套店薇薇外送茶賴mm0089 ,#桃園半套價錢 #桃園找援,#桃園聯天室找援,#桃園西門找援桃園半套店薇薇外送茶賴mm0089 ,#桃園半套價錢 台中一夜情,台中??,台中全套基隆叫小姐電話 #基隆叫小姐 #基隆飯店叫小姐 #基隆旅館叫小姐薇薇外送茶賴mm0089 #基隆找女人 #基隆找妹 #基隆出差叫小姐 #基隆打炮薇薇外送茶賴mm0089 #基隆看照約妹#桃園茶莊心得,#桃園茶莊ptt,#桃園桑拿薇薇外送茶賴mm0089 ,#桃園桑拿浴,#桃園桑拿網
#桃園桑拿論壇薇薇外送茶賴mm0089 ,#桃園桑拿澳門,#桃園桑拿168,#桃園半套店薇薇外送茶賴mm0089 ,#桃園半套價錢
台北外送茶/高雄鐘點情人外約,台北旅館叫小姐,台北鐘點情人,台灣一夜情,高雄一夜情,台中一夜情,台北一夜情,台北美女外約,台中美女外約,高雄美女外約,高雄茶莊,台中茶莊,台北茶莊,台北叫小姐,台中叫小姐,高雄叫小姐,高雄外約/外約/援交妹,吃魚喝茶論壇,大家來找茶,PLUS,伊利,微克成人網/女優GoGoGo/淘A片/一刀未剪/免費成人影音薇薇外送茶賴mm0089 /交換網站/交友網站/性愛成人網/一葉晴成人貼片/成人極品情色站/癡漢線上免費A片/台灣明星淫片流出露比線上免費A片/伊莉成人論壇/◆免費線上A片◆/寶貝一夜情聊天室/免費A片頻道/無名成人網/成人網/台北情色聯盟/天天幹貼圖/洪爺色情網/台灣噴精成人網/十八小妹自拍美少女自拍貼圖老婆自拍貼圖/色色女孩情色總站/A圖情色交流/666人氣貼圖/插插穴排行/69Kiss電影排行/薇薇外送茶賴mm0089 彩虹頻道/后宮電影院/中文搜性網/酷站排行入口/上我人妻/成人龍虎豹/干爹情色排行/十七歲少女/台灣1歲/104寫真銀行/插插穴排行/熱酷美眉網/台灣性樂園/只有貼圖/波波美女網/交換連結eyny,玩美情人,男人幫,高雄女外約,高雄外送,高雄賓館叫小姐,高雄飯店叫小姐,高雄鐘點情人外約,台北旅館叫小姐,彰化外送茶,台灣兼職美女外送,薇薇外送茶賴mm0089 台北兼職美女外約,台中外送茶坊,高雄外送茶坊,台北外送茶坊陸妹價格,檳榔西施清涼秀,台功援學生兼差 msn,援交妹,24h 台北私兼,CLUB,台南指壓 3k,高雄酒店經紀,台中學生兼差msn,台北 夜店 舞廳 酒吧 制服便服,中年夫妻聯誼,高雄媛交,台南茶妹,台北指油壓留言板,情趣精品,大台南一夜情人外約\俱樂部,台北賓館叫小姐,高雄原味貼身衣物買賣,夢時代購物中心,台北推拿中醫,0204一夜崤◆隆f聊天室,熟女圖,討論區,台南喝茶的店哪好,網路購物,台中理容按摩,台南陪唱,台北下\午茶 blog,高雄 砲友,台中好茶討論區,高雄茶店news,高雄按摩個人工作室,旅遊,台南24h台南24h餐廳,台北茶訊交流msn,卡債,台中旅館外叫服務,台中 spa油壓男按摩小姐服務/漁會玩美情人遊戲成人論壇 台北吃魚喝茶留言板外送/台北一夜情重點情/台北旅館飯店找服務叫小姐/找女人全套服務加按摩指油壓成人夜遊魚訊交流論壇區/台北應召站/伊莉喝茶/第一手論壇/外約愛愛/外約電話/外約高檔茶到府服務/伊莉plus28/成人性愛慾茶園 性交易/正妹外送服務/找茶論壇薇薇外送茶賴mm0089 /找茶討論區/台灣外送GTO/台灣樂緣外送茶/兩性論妹板橋外送酒店 北投泡溫泉三溫暖趙小姐/援交妹網站論壇/FB交友網站/UT天室交友一夜情炮友/台北喝茶買三送一接多買多送純情動感兼職妹/華僑台北旅遊出差消伴遊找女人茶/薇薇外送茶賴mm0089 極品俱樂部嚴選絕色經典,第一手娛樂論壇/卡提諾/玩美情人/吃魚喝茶網 薇薇外送茶賴mm0089 伊漁網/Plus論壇/台灣樂緣/小女人論壇/台灣論壇/微風論壇/伊莉論壇/禁地論壇/維克斯論壇/捷克論/男人幫論壇/大眾論壇/竹北旅館飯店找女人按摩舒壓叫小姐3p服務 愛情公寓論壇 交友/ 愛情/戀愛/貓都論壇/賽斯論壇/104論壇/九州娛樂論壇/櫻雪論壇/2B級/台灣、送茶坊台北外送茶坊,台中外送茶,高雄外送茶,美女外約服務/台中/高雄/新竹/彰化/莊極品俱樂部嚴選絕色經典,成人性愛慾茶園,找茶討論區,催情藥,唯美貼圖,成人論壇,網絡報稅,線上遊戲,高檔平價好茶,淫照聊天是尋夢園美女外送,情趣用品八大行業指油壓全套,暑假打工,網站設計,中國合夥人,鋼鐵俠3,HTC,蝴蝶機,變裝遊戲,茶,motel,hotel,性感絲襪,A片下載,AV女優,第一手論壇,貓都,卡提諾,喝茶,完美情人,BJ論壇,小女人論壇,卡提諾論壇,台灣論壇三溫暖中陪酒ktv,台北全套護膚個人工作室,尋找台南援交auty 美容美體 SPA沙龍,台北外約茶棧,台中越南餐廳,台南應召站,台北外送 3k,高雄下午茶外,台中三溫暖全套,台南全套油壓泰國,台南半套店1600元,高雄推拿指壓,小姐,台北夜生活 pub,台北單身聯誼,兼差,台北交換伴侶,台北一夜情,高雄聊天網,高雄美女兼職,台南車站美食,8000mile,台北一夜情緣俱樂部,高雄應徵\酒店酒店上班,高雄成人視訊聊天室,台南兼職找利菁,高雄24h到府指油壓,女兼職,酒店兼職\,壽山,台南茶訊茶資薇薇外送茶賴mm0089 ,台南陪酒小姐,高雄絲襪美腿高跟鞋,夫妻聯誼部落格,薇薇外送茶賴mm0089 台南小野貓檳榔西施外送時被下藥拍照,自拍女老師,找台中援妹地點,台北大陸妹價格,檳榔西施清涼秀,台功援學生兼差 msn,援交妹,24h 台北私兼,CLUB,台南指壓 3k,高雄酒店經紀,台中學生兼差msn,台北 夜店 舞廳 酒吧 制服便服,中年夫妻聯誼,高雄媛交,台南茶妹,台北指油壓留言板,情趣精品,大台南一夜情人外約\俱樂部,台北賓館叫小姐,高雄原味貼身衣物買賣,夢時代購物中心,台北推拿中醫,0204一夜崤◆隆f聊天室,熟女圖,討論區,台南喝茶的店哪好,網福祿猴林千又 吳宗憲 2015 黑豹旗 王大陸 徐太宇 登革熱 波多野結衣 金鐘獎 蔡英文 洪秀柱 蛇精男 靈異 鬼故事 柯文哲 柯P 大家來說鬼 綜藝玩很大 時尚脈動 賈靜雯 陳佩琪 氣象 反課綱 2015星光大賞 宅男女神 愛爾麗 泛舟哥 張吉吟 ET看電影 八仙 塵爆 楊子晴 范冰冰 安心亞 陳泱瑾 Grace ISIS 林書豪

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up