通過(guò)Gradle自動(dòng)實(shí)現(xiàn)Android組件化模塊構(gòu)建

image

原文博客地址:Tangpj

不管全世界所有人怎么說(shuō),我都認(rèn)為自己的感受才是正確的管呵。無(wú)論別人怎么看梳毙,我絕不打亂自己的節(jié)奏。喜歡的事自然可以堅(jiān)持捐下,不喜歡的怎么也長(zhǎng)久不了账锹。
—— 村上春樹

背景

隨著App的不斷迭代,業(yè)務(wù)會(huì)變得越來(lái)越復(fù)雜坷襟,業(yè)務(wù)模塊會(huì)越來(lái)越多奸柬,且每個(gè)模塊的代碼也會(huì)變得越來(lái)越多。為了應(yīng)對(duì)這一場(chǎng)景婴程,我們需要把不同的業(yè)務(wù)模塊劃分成一個(gè)個(gè)組件廓奕,在修改業(yè)務(wù)代碼的時(shí)候只需要在對(duì)應(yīng)模塊修改就可以了。通過(guò)高內(nèi)聚档叔,低耦合的業(yè)務(wù)模塊來(lái)保證工程的健壯性和穩(wěn)定性∽婪郏現(xiàn)在問(wèn)題來(lái)了,當(dāng)組件的數(shù)量變得越來(lái)多的時(shí)候衙四,我們?nèi)绾喂芾順I(yè)務(wù)組件呢铃肯?

原創(chuàng)聲明: 該文章為原創(chuàng)文章,未經(jīng)博主同意嚴(yán)禁轉(zhuǎn)載届搁。

為什么我們要用Gradle管理組件呢缘薛?

先來(lái)看看Android組件化需要實(shí)現(xiàn)的目標(biāo)窍育。(什么是組件化構(gòu)建?)

  1. 按照業(yè)務(wù)邏輯劃分模塊
  2. 項(xiàng)目模塊能夠單獨(dú)啟動(dòng)測(cè)試
  3. 能夠根據(jù)需求引入或刪除某些業(yè)務(wù)模塊
  4. 通過(guò)不同模塊的組合宴胧,組成不同的App

對(duì)于第一點(diǎn):需要根據(jù)技術(shù)架構(gòu)和業(yè)務(wù)架構(gòu)來(lái)劃分模塊漱抓,這里需要根據(jù)實(shí)際情況來(lái)考慮。我們需要優(yōu)化的是第二恕齐、三乞娄、四點(diǎn)。

對(duì)于第二點(diǎn):Android是通過(guò)應(yīng)用com.android.application或com.android.library來(lái)決定該模塊是以App模式還是以Library模式構(gòu)建显歧。App模式和Library模式的最大區(qū)別就是仪或,App能夠啟動(dòng),而Library不可以士骤。所以如果我們的模塊能獨(dú)立啟動(dòng)的話范删,我們需要每次手動(dòng)去改動(dòng)模塊的build.gradle文件。好一點(diǎn)的做法定義一個(gè)布爾值來(lái)判斷是否處于debug模式拷肌,但是這里有個(gè)問(wèn)題是到旦,不是每個(gè)模塊都能獨(dú)立啟動(dòng)的。所以無(wú)論采用何種方案巨缘,都需要我們手動(dòng)管理添忘。

對(duì)于第三點(diǎn):當(dāng)我們開發(fā)好業(yè)務(wù)模塊后,可能我們需要頻繁的新增或刪除某些業(yè)務(wù)模塊若锁。如果是這樣的話搁骑,我們也是需要頻繁手動(dòng)修改App的build.gradle。

對(duì)于第四點(diǎn):有時(shí)候又固,我們可能會(huì)在不同的App中引用相同的組件(例如:滴滴的普通版和企業(yè)版仲器,普通版包含企業(yè)版的功能),這個(gè)時(shí)候口予,我們也不希望要頻繁手動(dòng)管理組件依賴娄周,特別是在組件還可以獨(dú)立運(yùn)行的時(shí)候末早。

所以诈闺,在我們實(shí)踐組件化的時(shí)候痴柔,最大的問(wèn)題就是,我們需要頻繁的手動(dòng)build.gradle文件來(lái)管理組件應(yīng)用的插件和App的依賴木张。

使用Gradle來(lái)管理組件

先安利下筆者寫的Gradle插件:Calces。如果覺得這個(gè)插件有用的話端三,可以star下舷礼,如果你有更好的想法的話,可以向我提交pull request郊闯。

廢話少說(shuō)妻献,一下是通過(guò)Calces快速實(shí)現(xiàn)Android組件化構(gòu)建的流程蛛株。

Demo地址:SimpleCalces

項(xiàng)目結(jié)構(gòu):

simple_calces_dir
  1. 引入依賴庫(kù)
    在Gradle 2.1及更高版本的插件構(gòu)建腳本代碼:
    在項(xiàng)目的build.gradle中

    buildscript {
        ...
    }
    plugins {
      id "calces.modules" version "1.0.11"
    }
    

在較舊版本的Gradle中或需要?jiǎng)討B(tài)配置的情況下的插件構(gòu)建腳本代碼:

   buildscript {
     repositories {
       maven {
         url "https://plugins.gradle.org/m2/"
       }
     }
     dependencies {
       classpath "gradle.plugin.com.tangpj.tools:calces:1.0.11"
     }
   }
   apply plugin: "calces.appConfig"
  1. 在項(xiàng)目build.gradle配置AppConfig

    appConfig {
        debugEnable false
    
        apps {
            app{
                modules ':library1', ':library2'
            }
        }
    
        modules{
            library1{
                mainActivity ".Library1Activity"
                applicationId "com.tangpj.library1"
                isRunAlone true
            }
            library2{
                mainActivity ".Library2Activity"
                applicationId "com.tangpj.library2"
                isRunAlone true
            }
        }
    
    }
    
  1. 在modules(子模塊)引入模塊自動(dòng)化構(gòu)建插件 (注意:不需要手動(dòng)配置com.android.library或com.android.application)

    apply plugin: 'calces.modules'
    

這樣我們就完成了組件化的構(gòu)建了,是的育拨,我們不再需要再手動(dòng)管理單個(gè)組件了與App的構(gòu)建了谨履,通過(guò)Calces,我們能實(shí)現(xiàn)快速的組件化構(gòu)建與多App同時(shí)構(gòu)建熬丧。

那么問(wèn)題來(lái)了笋粟,我們?nèi)绾螌?shí)現(xiàn)組件間的通信呢?在簡(jiǎn)單的項(xiàng)目中析蝴,推薦該Demo一樣害捕,通過(guò)使用Android隱式Intent來(lái)實(shí)現(xiàn)組件間通信。在中大型項(xiàng)目中闷畸,筆者推薦使用阿里的路由解決方案:ARouter尝盼。具體使用方法參考官方文檔就可以了,使用方法十分簡(jiǎn)單佑菩。

注意:在使用隱式Intent實(shí)現(xiàn)組件件通信的時(shí)候需要注意找不到相應(yīng)組件異常:java.lang.IllegalStateException: Could not execute method of the activity东涡。導(dǎo)致這個(gè)異常的原因是找不到目標(biāo)組件導(dǎo)致的,所以在實(shí)際開發(fā)的時(shí)候倘待,需要捕獲這一異常疮跑,并且根據(jù)項(xiàng)目實(shí)際情況來(lái)進(jìn)行實(shí)際的處理。使用ARouter框架則能通過(guò)設(shè)置降級(jí)策略來(lái)實(shí)現(xiàn)異常處理(查看ARouter文檔了解更多)凸舵。

如果只是實(shí)現(xiàn)項(xiàng)目的簡(jiǎn)單組件化祖娘,那么看到這里就可以了,如果希望實(shí)現(xiàn)更加靈活的組件化架構(gòu)的讀者可以繼續(xù)看下去啊奄,下面筆者將全面分析組件化的優(yōu)勢(shì)與筆者總結(jié)的組件化構(gòu)建思想渐苏。

組件化構(gòu)建簡(jiǎn)述

組件化構(gòu)建與其說(shuō)是一種技術(shù),不如說(shuō)是一種思想菇夸。組件化構(gòu)建是通過(guò)對(duì)項(xiàng)目重新劃分成一個(gè)個(gè)高內(nèi)聚琼富、低耦合的模塊來(lái)解決項(xiàng)目過(guò)于臃腫,代碼過(guò)于復(fù)雜的一種架構(gòu)思想庄新。

我們通過(guò)對(duì)Google官方的架構(gòu)演示Demo todo-mvp進(jìn)行拆分來(lái)對(duì)Android組件化進(jìn)行深入的分析鞠眉。

Demo地址:TodoCalces

todo系列app是Google android-architecture項(xiàng)目中為了演示Android架構(gòu)的最佳實(shí)現(xiàn)而編寫的一系列演示Demo。todo app的特點(diǎn)是择诈,它足夠簡(jiǎn)單械蹋,代碼量少,易于理解羞芍。但是又不會(huì)過(guò)于簡(jiǎn)單哗戈,因?yàn)樗且粋€(gè)包含完成功能的App。它實(shí)現(xiàn)了任務(wù)列表荷科、任務(wù)詳情唯咬、新建任務(wù)纱注、編輯任務(wù)、統(tǒng)計(jì)任務(wù)的功能胆胰。

todo-mvp實(shí)現(xiàn)的功能:

  • 任務(wù)列表
  • 任務(wù)詳情
  • 新增/編輯任務(wù)
  • 統(tǒng)計(jì)任務(wù)

我們將以todo-mvp的功能來(lái)劃分為4個(gè)業(yè)務(wù)模塊奈附,將底層劃分為2個(gè)模塊,分別是superLib(提供mvp架構(gòu)支持與其它的一些支持庫(kù)功能)與dataLib(數(shù)據(jù)支持模塊煮剧,Room提供底層數(shù)據(jù)庫(kù)支持功能)斥滤。對(duì)于大型項(xiàng)目還可以加入resLib支持模塊,用來(lái)存放公共圖片資源勉盅、字符穿資源佑颇、樣式等。

架構(gòu)劃分圖如下:

Todo Calces Architecture

從架構(gòu)圖可以看出草娜,所有的業(yè)務(wù)組件都依賴底層庫(kù)挑胸,而APP又依賴于業(yè)務(wù)組件,APP組件在這里是作為一個(gè)獨(dú)立組件存在的宰闰。在一般的組件化實(shí)踐中茬贵,都不包含APP這個(gè)組件的,APP組件的存在是有其意義的移袍。

首先解藻,我們的組件化除了實(shí)現(xiàn)組件的獨(dú)立管理和動(dòng)態(tài)配置APP所依賴的組件外,還有一個(gè)十分重要的目的就是葡盗,通過(guò)組合不同的組件螟左,打包多個(gè)不同的APP。例如觅够,QQ有分普通版和輕聊版胶背,輕聊版是功能簡(jiǎn)化版的QQ。如果我們使用組件化來(lái)管理工程的話喘先,我們只需要把不需要的模塊移除掉就可以了钳吟。而APP組件在這里的作用是充當(dāng)一個(gè)包裝盒,把需要的組件包裝進(jìn)來(lái)窘拯。并且我們可以通過(guò)控制包裝盒的樣式來(lái)配置不同的APP風(fēng)格红且。在這里我們可以通過(guò)Application中的Style來(lái)實(shí)現(xiàn)。

這里我們還是以todo-mvp為例树枫,例如我們需要實(shí)現(xiàn)一個(gè)不包含統(tǒng)計(jì)功能的todo APP直焙,按照我們的原理,我們只需要去掉statistics的依賴就可以了砂轻。

架構(gòu)劃分圖如下:

Todo No Statistic Architectur

如果nostatsitcs需要不同的配色的方案的話,只需要在AndroidManifest的application標(biāo)簽中配置對(duì)應(yīng)的theme就可以了斤吐。

使用Calces實(shí)現(xiàn)todo-mvp的組件化

通過(guò)上面的分析搔涝,我們來(lái)試下對(duì)todo-mvp項(xiàng)目按照業(yè)務(wù)功能來(lái)劃分組件厨喂。我們先來(lái)看看劃分后的目錄:

todo_calces_dir

好了,我們已經(jīng)對(duì)todo-mvp項(xiàng)目進(jìn)行初步的劃分了庄呈。根據(jù)上面分析的理論得知蜕煌,我們的業(yè)務(wù)模塊是可以單獨(dú)運(yùn)行的,并且我們能夠快速構(gòu)建一個(gè)不包含statistics模塊的APP诬留。

我們只需要使用Calces就能快速實(shí)現(xiàn)我們需要的功能斜纪。

按照Calces的教程,我們得知文兑,實(shí)現(xiàn)Calces只需要三個(gè)步驟:

  1. 引入依賴庫(kù)
  2. 在項(xiàng)目的build.gradle中配置AppConfig
  3. 在業(yè)務(wù)模塊中引入模塊自動(dòng)化構(gòu)c持續(xù)

第一點(diǎn)和第三點(diǎn)在其它所有項(xiàng)目中的配置都是一樣的盒刚,在這里不作論述,下面我們看看對(duì)于TodoCalces項(xiàng)目绿贞,我們要如何配置AppConfig 因块。

appConfig {

    debugEnable false

    apps {
        app {
            mainActivity "com.tangpj.tasks.TasksActivity"
            modules ':modules:addtask',
                    ':modules:taskdetail',
                    ':modules:tasks',
                    ':modules:statistics'
        }

        app2 {
            name 'nostatistic'
            applicationId 'com.tangpj.nostatistic'
            modules ':modules:addtask',
                    ':modules:taskdetail',
                    ':modules:tasks'
        }

    }

    modules {
        addtask {
            name ":modules:addtask"
            applicationId "com.tangpj.addtask"
            mainActivity ".AddEditTaskActivity"
            isRunAlone false
        }

        taskdetail {
            name ":modules:taskdetail"
            applicationId "com.tangpj.taskdetail"
            mainActivity ".TaskDetailActivity"
            isRunAlone true
        }


        task {
            name ":modules:tasks"
            applicationId "com.tangpj.tasks"
            mainActivity ".TasksActivity"
            isRunAlone true
        }

        statistics {
            name ":modules:statistics"
            applicationId "com.tangpj.statistics"
            mainActivity ".StatisticsActivity"
            isRunAlone true
        }


    }
}

根據(jù)AppConfig可以得出,我們分別配置了2個(gè)APP籍铁,分別是app1和app2涡上。并且app2中是沒(méi)有依賴statistics的。現(xiàn)在我們兩個(gè)APP運(yùn)行的對(duì)比圖拒名。

app1(帶statistics模塊):

todo_calces

app2(不帶statistics模塊):

nostatistic

從運(yùn)行圖可以看出吩愧,app1和app2的配色方案是不一樣的,并且app2中不帶statistics模塊增显,通過(guò)對(duì)項(xiàng)目實(shí)行合理的劃分和引入Calces就能夠快速實(shí)現(xiàn)組件化構(gòu)建了耻警。

結(jié)論:通過(guò)Calces能輕松實(shí)現(xiàn)業(yè)務(wù)組件的管理,多APP的快速構(gòu)建甸怕。當(dāng)我們的業(yè)務(wù)組件只有4個(gè)的時(shí)候甘穿,可能無(wú)法體現(xiàn)Calces的優(yōu)勢(shì),但是如果我們的業(yè)務(wù)組件有40個(gè)的時(shí)候梢杭,Calces給我們帶來(lái)的優(yōu)勢(shì)就非常明顯了温兼。我們可以通過(guò)靈活依賴不同的組件,實(shí)現(xiàn)快速構(gòu)建多個(gè)APP的目的武契。就像Calces的介紹圖案一樣募判,把組件當(dāng)成積木來(lái)使用。

如何測(cè)試

Android自動(dòng)化測(cè)試展開來(lái)說(shuō)是一個(gè)非常大并且不算簡(jiǎn)單的工程咒唆,在這里筆者不打算展開來(lái)說(shuō)届垫。只是簡(jiǎn)單的介紹組件化構(gòu)建如何讓我們更方便地去測(cè)試。

并不是所有的自動(dòng)化測(cè)試都一樣全释,它們通常在使用范圍装处、實(shí)現(xiàn)難度和執(zhí)行時(shí)間上存在不同。我們一般把自動(dòng)化測(cè)試劃分為三種分別是:

  1. 單元測(cè)試:目的是測(cè)試代碼的最小單元浸船。在基于Java的項(xiàng)目中妄迁,這個(gè)單元是一個(gè)方法寝蹈。單元測(cè)試容易編寫,快速執(zhí)行登淘,并在開發(fā)過(guò)程中針對(duì)代碼的正確性提供寶貴的反饋箫老。
  2. 集成測(cè)試:用來(lái)測(cè)試一個(gè)完成的組件或子系統(tǒng),確保多個(gè)類之間的交互是否按預(yù)期運(yùn)行黔州。集成測(cè)試需要比單元測(cè)試需要更長(zhǎng)的執(zhí)行時(shí)間耍鬓,而且更加難以維護(hù),失敗的原因難以診斷流妻。
  3. 功能測(cè)試:通常用于測(cè)試應(yīng)用程序端到端的功能牲蜀,包括從用戶的角度與所有外部系統(tǒng)的交互。當(dāng)我們討論用戶角度時(shí)合冀,通常是指用戶界面各薇。因?yàn)橛脩艚缑鏁?huì)隨著時(shí)間的推移發(fā)生變動(dòng),維護(hù)功能測(cè)試代碼會(huì)變得乏味而耗時(shí)君躺。

為了優(yōu)化投資回報(bào)率峭判,代碼庫(kù)應(yīng)該包含大量的單元測(cè)試、少量集成測(cè)試以及更少的功能測(cè)試棕叫。

占比如下圖所示:

[圖片上傳失敗...(image-f27759-1532391342632)]

從上文知道林螃,在我們的組件化分的時(shí)候,會(huì)劃分一個(gè)基礎(chǔ)依賴庫(kù)(superLib)俺泣×迫希基礎(chǔ)依賴庫(kù)為我們的項(xiàng)目提供了基本的支持,并且該庫(kù)在項(xiàng)目中是比較穩(wěn)定伏钠、并且不包含業(yè)務(wù)邏輯的横漏,所以在基礎(chǔ)依賴庫(kù)中,我們應(yīng)該大量應(yīng)用單元測(cè)試熟掂。而集成測(cè)試則適用于我們的數(shù)據(jù)依賴庫(kù)(dataLib)中缎浇,我們可以通過(guò)集成測(cè)試來(lái)驗(yàn)證產(chǎn)品代碼與數(shù)據(jù)模塊的交互。而我們的業(yè)務(wù)模塊中包含了大量的業(yè)務(wù)邏輯赴肚,這部分是經(jīng)常變動(dòng)的部分素跺,我們可以為我們的業(yè)務(wù)模塊編寫一些UI自動(dòng)化測(cè)試代碼,但是因?yàn)闃I(yè)務(wù)(界面)經(jīng)常變動(dòng)的原因誉券,所以這部分測(cè)試代碼是難以維護(hù)指厌,并且復(fù)用性十分低的。踊跟。

最后踩验,我們得出的結(jié)論是:應(yīng)該把主要精力放在單元測(cè)試上,所以如果當(dāng)你的精力不足以編寫所有測(cè)試代碼的時(shí)候,你應(yīng)該把主要的精力放在單元測(cè)試上晰甚,而不是放在收益最小的功能測(cè)試上衙传。

關(guān)于自動(dòng)化測(cè)試决帖,筆者給的建議就到這里了厕九,如果需要深入理解測(cè)試的話,可以自行查找資料地回,或者關(guān)注筆者的博客扁远。后續(xù)的博客中,有可能會(huì)寫關(guān)于自動(dòng)化測(cè)試相關(guān)的知識(shí)刻像。

小結(jié)

通過(guò)Calces插件畅买,我們?cè)趯?shí)現(xiàn)Android組件化時(shí)只需要關(guān)注如何合理劃分組件的架構(gòu)與如何實(shí)現(xiàn)組件間的通信就可以了。對(duì)于Android組件化來(lái)說(shuō)细睡,最主要問(wèn)題有兩個(gè):

  1. 大型項(xiàng)目如何合理劃分組件模塊
  2. 當(dāng)項(xiàng)目的組件數(shù)量非常多的時(shí)候如何管理

第二個(gè)問(wèn)題谷羞,可以通過(guò)Calces快速解決,至于第一個(gè)問(wèn)題溜徙,筆者給出的指導(dǎo)就是湃缎,業(yè)務(wù)模塊在合理的情況下要盡可能的小,因?yàn)樵叫〉哪K蠢壹,越容易達(dá)到高內(nèi)聚低耦合的目的嗓违。讀者不需要擔(dān)心項(xiàng)目模塊劃分得過(guò)于細(xì)不便于管理的問(wèn)題,因?yàn)?a target="_blank" rel="nofollow">Calces能夠輕松幫你管理好各個(gè)模塊图贸。

歷史精選

Android開發(fā)利器之Data Binding Compiler V2 —— 搭建Android MVVM完全體的基礎(chǔ)

關(guān)于我

如果這片文章對(duì)你有所啟發(fā)的話蹂季,可以關(guān)注下筆者的公眾號(hào)或GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疏日,一起剝皮案震驚了整個(gè)濱河市偿洁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟优,老刑警劉巖涕滋,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異净神,居然都是意外死亡何吝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹃唯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爱榕,“玉大人,你說(shuō)我怎么就攤上這事坡慌∏郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)跪者。 經(jīng)常有香客問(wèn)我棵帽,道長(zhǎng),這世上最難降的妖魔是什么渣玲? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任逗概,我火速辦了婚禮,結(jié)果婚禮上忘衍,老公的妹妹穿的比我還像新娘逾苫。我一直安慰自己,他們只是感情好枚钓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布铅搓。 她就那樣靜靜地躺著,像睡著了一般搀捷。 火紅的嫁衣襯著肌膚如雪星掰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天嫩舟,我揣著相機(jī)與錄音氢烘,去河邊找鬼。 笑死至壤,一個(gè)胖子當(dāng)著我的面吹牛威始,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播像街,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼黎棠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了镰绎?” 一聲冷哼從身側(cè)響起脓斩,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畴栖,沒(méi)想到半個(gè)月后随静,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吗讶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年燎猛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片照皆。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重绷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膜毁,到底是詐尸還是另有隱情昭卓,我是刑警寧澤愤钾,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站候醒,受9級(jí)特大地震影響能颁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倒淫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一伙菊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昌简,春花似錦占业、人聲如沸绒怨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)南蹂。三九已至犬金,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間六剥,已是汗流浹背晚顷。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疗疟,地道東北人该默。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像策彤,于是被迫代替她去往敵國(guó)和親栓袖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評(píng)論 25 707
  • Android組件化項(xiàng)目地址:Android組件化項(xiàng)目AndroidModulePattern Android組件...
    半灬邊灬天閱讀 2,921評(píng)論 4 37
  • 在Android SDK一文中店诗,我們談到模塊化和組件化裹刮,現(xiàn)在我們來(lái)聊聊組件化開發(fā)。 以下高能,請(qǐng)做好心理準(zhǔn)備,看不...
    涅槃1992閱讀 4,151評(píng)論 11 66
  • 我一個(gè)人挑著兩只竹籃子庞瘸,無(wú)奈的出了家門捧弃,經(jīng)過(guò)路邊稀稀拉拉的謝姓、莫姓人家擦囊,在往西走就是八仙嶺违霞,沿路就沒(méi)有人煙了。 ...
    鄉(xiāng)土辣媽閱讀 806評(píng)論 5 3
  • 前幾天瞬场,跟室友逛校園买鸽,我們邊逛邊聊天,聊著聊著就談起了未來(lái)泌类,談考研癞谒,談工作底燎。當(dāng)下的我們站在一個(gè)選擇的分岔路口,我們...
    白白的成長(zhǎng)日記閱讀 487評(píng)論 2 0