Android熱更新集成之Bugly

Bugly是鵝廠的一個(gè)集成異常上報(bào),運(yùn)營統(tǒng)計(jì)笙纤,在線升級(jí)耗溜,熱更新的框架;

與傳統(tǒng)的熱更新相比省容,這個(gè)不需要搭建后臺(tái)抖拴,不需要知道補(bǔ)丁是如何生成的,我只簡述使用Bugly熱更新成功的一種例子和我遇到的問題

集成

①工程根目錄下“build.gradle”文件中添加:
classpath "com.tencent.bugly:tinker-support:1.1.2"
②在app module的“build.gradle”文件中添加(示例配置):
android {
        defaultConfig {
          ndk {
            //設(shè)置支持的SO庫架構(gòu)
            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
          }
        }
      }
      dependencies {
          compile "com.android.support:multidex:1.0.1" // 多dex配置
          //注釋掉原有bugly的倉庫
          //compile 'com.tencent.bugly:crashreport:latest.release'//其中l(wèi)atest.release指代最新版本號(hào),也可以指定明確的版本號(hào),例如1.3.4
          compile 'com.tencent.bugly:crashreport_upgrade:1.3.5'
          // 指定tinker依賴版本(注:應(yīng)用升級(jí)1.3.5版本起残吩,不再內(nèi)置tinker)
          compile 'com.tencent.tinker:tinker-android-lib:1.9.6'
          compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中l(wèi)atest.release指代最新版本號(hào)驻龟,也可以指定明確的版本號(hào),例如2.2.0
      }
③在APP目錄下添加tinker-support.gradle文件
3

內(nèi)容如下:

apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/bakApk/")

/**
 * 此處填寫每次構(gòu)建生成的基準(zhǔn)包目錄
 */
def baseApkDir = "app-0719-16-37-01"

/**
 * 對(duì)于插件各參數(shù)的詳細(xì)解析請參考
 */
tinkerSupport {

    // 開啟tinker-support插件净当,默認(rèn)值true
    enable = true

    // 指定歸檔目錄,默認(rèn)值當(dāng)前module的子目錄tinker
    autoBackupApkDir = "${bakPath}"

    // 是否啟用覆蓋tinkerPatch配置功能,默認(rèn)值false
    // 開啟后tinkerPatch配置不生效往湿,即無需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 編譯補(bǔ)丁包時(shí),必需指定基線版本的apk惋戏,默認(rèn)值為空
    // 如果為空领追,則表示不是進(jìn)行補(bǔ)丁包的編譯
    // @{link tinkerPatch.oldApk }
    baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

    // 對(duì)應(yīng)tinker插件applyMapping
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 對(duì)應(yīng)tinker插件applyResourceMapping
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

    // 構(gòu)建基準(zhǔn)包和補(bǔ)丁包都要指定不同的tinkerId,并且必須保證唯一性
    tinkerId = "patch-1.0.1"

    // 構(gòu)建多渠道補(bǔ)丁時(shí)使用
    // buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否啟用加固模式响逢,默認(rèn)為false.(tinker-spport 1.0.7起支持)
    // isProtectedApp = true

    // 是否開啟反射Application模式
    enableProxyApplication = true

    // 是否支持新增非export的Activity(注意:設(shè)置為true才能修改AndroidManifest文件)
    supportHotplugComponent = true

}
④在app module的“build.gradle”文件中添加:
4
// 依賴插件腳本
apply from: 'tinker-support.gradle'
⑤AndroidManifest.xml配置

加入權(quán)限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

加入Activity:

<activity
    android:name="com.tencent.bugly.beta.ui.BetaActivity"
    android:configChanges="keyboardHidden|orientation|screenSize|locale"
    android:theme="@android:style/Theme.Translucent" />

加入配置FileProvider:

 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

假如你已經(jīng)使用了FileProvider,就加入此配置

<provider
    android:name=".util.BuglyFileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"
    tools:replace="name,authorities,exported,grantUriPermissions">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"
        tools:replace="name,resource"/>
</provider>
image.png
⑥在res文件夾下新增xml文件夾绒窑,新增provider_paths.xml文件,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
    <external-path name="beta_external_path" path="Download/"/>
    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
    <external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
⑦為了避免混淆SDK龄句,在Proguard混淆文件中增加以下配置:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# tinker混淆規(guī)則
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }

如果你使用了support-v4包回论,你還需要配置以下混淆規(guī)則:

-keep class android.support.**{*;}
⑧Application配置
package com.wocus.wine.application;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;

/**
 * Created by Administrator on 2018/7/5.
 */

public class BaseApplication extends Application{
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
        Beta.installTinker();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Bugly.init(this, "ce34683adf", true);
    }
}

到此已經(jīng)集成完畢

使用

①打包基準(zhǔn)包
image.png

注意加入keystore配置


image.png

注意一定要開啟混淆,不然打包沒有mapper文件

buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

打包成功之后,會(huì)在此目錄有3個(gè)文件


image.png

app-release.apk則為你的基準(zhǔn)包分歇,上線發(fā)布的包傀蓉,拿這個(gè)apk在手機(jī)上安裝上報(bào)聯(lián)網(wǎng)

打包補(bǔ)丁包

上線之后如果發(fā)現(xiàn)版本有Bug,可以打補(bǔ)丁包修復(fù)职抡,Bug修復(fù)好了葬燎,去更改tinker-support.gradle文件

/**
 * 此處填寫每次構(gòu)建生成的基準(zhǔn)包目錄
 */
def baseApkDir = "app-0719-16-37-01"
// 構(gòu)建基準(zhǔn)包和補(bǔ)丁包都要指定不同的tinkerId,并且必須保證唯一性
 tinkerId = "patch-1.0.1"

tinkerId 一定不能和打包基準(zhǔn)包的Id一樣
我是這樣定義的缚甩,基準(zhǔn)報(bào)的tinkerId 為:base-版本號(hào)谱净,補(bǔ)丁包為:patch-版本號(hào),版本號(hào)都一致對(duì)應(yīng)基準(zhǔn)包的版本

baseApkDir 則為基準(zhǔn)包發(fā)布的那個(gè)目錄擅威,上圖有自己可以去看看
然后編譯補(bǔ)丁包


image.png

編譯成功之后會(huì)在此目錄有3個(gè)文件壕探,這個(gè)文件就是你需要上傳的補(bǔ)丁包了


image.png

然后拿這個(gè)去Bugly平臺(tái)上傳,就OK了

遇到的問題

1.打包出來基準(zhǔn)包的是未簽名apk

A:需要在build.gradle配置簽名文件,舉個(gè)栗子:

signingConfigs {
        release {
            keyAlias 'wine'
            keyPassword '123456'
            storeFile file('C:/Project/Android Studio Project/wine/wine.jks')
            storePassword '123456'
        }
    }
2.打包出來的基準(zhǔn)包沒有mapper文件

A:需要在build.gradle開啟混肴

buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
3.開啟混肴之后郊丛,打包基準(zhǔn)報(bào)報(bào)錯(cuò)

A:假如你之前項(xiàng)目都沒有配置混肴文件李请,對(duì)此來說需要花費(fèi)不少時(shí)間瞧筛,你把下面文件拷貝去混肴文件就OK了


-keepclassmembers class fqcn.of.javascript.interface.for.webview {

   public *;

}

#webView js調(diào)用不混淆,否則取不到數(shù)據(jù)

-keepclassmembers class com.zyp.ui.WebActivity$* {

    <methods>;

}

 

#shrink导盅,測試后發(fā)現(xiàn)會(huì)將一些無效代碼給移除较幌,即沒有被顯示調(diào)用的代碼,該選項(xiàng) 表示 不啟用 shrink白翻。

#-dontshrink

#指定重新打包,所有包重命名,這個(gè)選項(xiàng)會(huì)進(jìn)一步模糊包名乍炉,將包里的類混淆成n個(gè)再重新打包到一個(gè)個(gè)的package中

#-flattenpackagehierarchy

#優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員

-allowaccessmodification

#不跳過(混淆) jars中的 非public classes   默認(rèn)選項(xiàng)

-dontskipnonpubliclibraryclassmembers

#忽略警告

-ignorewarnings

#指定代碼的壓縮級(jí)別

-optimizationpasses 5

#不使用大小寫混合類名

-dontusemixedcaseclassnames

#不去忽略非公共的庫類

-dontskipnonpubliclibraryclasses

#不啟用優(yōu)化  不優(yōu)化輸入的類文件

-dontoptimize

#不預(yù)校驗(yàn)

-dontpreverify

#混淆時(shí)是否記錄日志

-verbose

#混淆時(shí)所采用的算法

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#保護(hù)注解

-renamesourcefileattribute SourceFile

#保持源文件和行號(hào)的信息,用于混淆后定位錯(cuò)誤位置

-keepattributes SourceFile,LineNumberTable

#保持含有Annotation字符串的 attributes

-keepattributes *Annotation*

#過濾泛型

-keepattributes Signature

-keepattributes Exceptions,InnerClasses



-dontwarn org.apache.**

-dontwarn android.support.**



#基礎(chǔ)配置

# 保持哪些類不被混淆

# 系統(tǒng)組件

-keep public class * extends android.app.Fragment

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Application

-keep public class * extends android.app.Service

-keep public class * extends android.content.BroadcastReceiver

-keep public class * extends android.content.ContentProvider

-keep public class * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService

#如果有引用v4包可以添加下面這行

-keep public class * extends android.support.v4.app.Fragment

#自定義View

-keep public class * extends android.view.View

# V4,V7

-keep class android.support.constraint.**{ *; }

-keep class android.support.v4.**{ *; }

-keep class android.support.v7.**{ *; }

-keep class android.webkit.**{*;}

-keep interface android.support.v4.app.** { *; }

#保持 本化方法及其類聲明

-keepclasseswithmembers class * {

    native <methods>;

}

#保持view的子類成員: getter setter

-keepclassmembers public class * extends android.view.View {

   void set*(***);

   *** get*();

}

#保持Activity的子類成員:參數(shù)為一個(gè)View類型的方法   如setContentView(View v)

-keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);

}

#保持枚舉類的成員:values方法和valueOf  (每個(gè)enum 類都默認(rèn)有這兩個(gè)方法)

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

#保持Parcelable的實(shí)現(xiàn)類和它的成員:類型為android.os.Parcelable$Creator 名字任意的 屬性

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}

#保持 任意包名.R類的類成員屬性。  即保護(hù)R文件中的屬性名不變

-keepclassmembers class **.R$* {

    public static <fields>;

}

 

# 記錄生成的日志數(shù)據(jù)滤馍,在 proguard 目錄下

 

-dump class_files.txt



-printseeds seeds.txt



-printusage unused.txt



-printmapping mapping.txt



 

-keepclasseswithmembernames class * {

    native <methods>;

}

 

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

 

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

 

-keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);

}

 

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}

-keepnames class * implements android.os.Parcelable {

    public static final ** CREATOR;

}

 

-dontwarn java.util.**

-keep class java.util.** {*; }



-dontwarn org.apache.http.**

-keep class org.apache.http.** {*; }



-keepclassmembers class * implements java.io.Serializable {

    static final long serialVersionUID;

    private static final java.io.ObjectStreamField[] serialPersistentFields;

    private void writeObject(java.io.ObjectOutputStream);

    private void readObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

}

 

-keep public class * implements java.io.Serializable {*;}



-keepclassmembers class **.R$* {

    public static <fields>;

}

 

# ======================= 以上是混淆的基礎(chǔ)配置================================

# ======================= 以下是混淆的第三方包的配置================================

 

 

# ======================= Gson 混淆================================

-keepattributes *Annotation*

-keep class sun.misc.Unsafe { *; }

-keep class com.idea.fifaalarmclock.entity.***

-keep class com.google.gson.stream.** { *; }



# ======================= Umeng 混淆================================

-keepclassmembers class * {

   public <init> (org.json.JSONObject);

}

#這是由于SDK中的部分代碼使用反射來調(diào)用構(gòu)造函數(shù)岛琼, 如果被混淆掉, 在運(yùn)行時(shí)會(huì)提示"NoSuchMethod"錯(cuò)誤纪蜒。

#另外衷恭,由于SDK需要引用導(dǎo)入工程的資源文件,通過了反射機(jī)制得到資源引用文件R.java纯续,但是在開發(fā)者通過proguard等混淆/優(yōu)化工具處理apk時(shí)随珠,proguard可能會(huì)將R.java刪除,如果遇到這個(gè)問題猬错,請?jiān)趐roguard配置文件中添加keep命令如:

-keep public class com.zyp.R$*{

    public static final int *;

}

-keep class com.umeng.**

-keep public class com.idea.fifaalarmclock.app.R$*{

    public static final int *;

}

 

-keep public class com.umeng.fb.ui.ThreadView {

}

-dontwarn com.umeng.**

-dontwarn org.apache.commons.**

-keep public class * extends com.umeng.**

-keep class com.umeng.** {*; }



 

# ======================= pinying4j 混淆================================

-dontwarn com.hp.hpl.sparta.**

-keep class com.hp.hpl.sparta.**{*;}

-dontwarn net.sourceforge.pinyin4j.**

-keep class net.sourceforge.pinyin4j.**{*;}

-dontwarn demo.**

-keep class demo.**{*;}



# ======================= volley 混淆================================

-dontwarn com.android.volley.**

-keep class com.android.volley.**{*;}



# ======================= fastjson 混淆================================

-dontwarn com.alibaba.fastjson.**

-keep class com.alibaba.fastjson.** { *; }

# ======================= alipay 混淆================================

-keep class com.alipay.android.app.IAlixPay{*;}

-keep class com.alipay.android.app.IAlixPay$Stub{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}

-keep class com.alipay.sdk.app.PayTask{ public *;}

-keep class com.alipay.sdk.app.AuthTask{ public *;}

-keep class com.alipay.mobilesecuritysdk.*

-keep class com.ut.*



# ======================= weixin 混淆================================

-keep class com.tencent.mm.** { *; }



# ======================= okio ================================

-dontwarn okio.**

-keep class okio.**{*;}

-keep interface okio.**{*;}



 

# ======================= activation.jar ================================

-dontwarn javax.activation.**

-keep class javax.activation.**{*;}

-dontwarn com.sun.activation.registries.**

-keep class com.sun.activation.registries.**{*;}



# ======================= additionnal.jar ================================

-dontwarn myjava.awt.datatransfer.**

-keep class myjava.awt.datatransfer.**{*;}

-dontwarn org.apache.harmony.**

-keep class org.apache.harmony.**{*;}



 

# ======================= RxAndroid,RxJava ================================

-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {

   long producerIndex;

   long consumerIndex;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {

    rx.internal.util.atomic.LinkedQueueNode producerNode;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {

    rx.internal.util.atomic.LinkedQueueNode consumerNode;

}

 

#======================= httpmime =======================

-keep class org.apache.http.entity.mime.** {*;}

#======================= zxing =======================

-keep class com.google.zxing.** { *; }



#======================= simplelatlng =======================

-keep class com.javadocmd.simplelatlng.** {*;}



# =======================universal-image-loader ================================

-keep class com.nostra13.universalimageloader.** {*;}



# ======================= 百度地圖  ================================

-keep class com.baidu.** {*;}

-keep class vi.com.** {*;}

-dontwarn com.baidu.**



# ======================= 高德地圖  ================================

# 3D 地圖

-keep   class com.amap.api.maps.**{*;}

-keep   class com.autonavi.amap.mapcore.*{*;}

-keep   class com.amap.api.trace.**{*;}



# 定位

-keep class com.amap.api.location.**{*;}

-keep class com.amap.api.fence.**{*;}

-keep class com.autonavi.aps.amapapi.model.**{*;}



#搜索

-keep   class com.amap.api.services.**{*;}



#2D地圖

-keep class com.amap.api.maps2d.**{*;}

-keep class com.amap.api.mapcore2d.**{*;}



#導(dǎo)航

-keep class com.amap.api.navi.**{*;}

-keep class com.autonavi.**{*;}



#訊飛

-keep class com.iflytek.**{*;}



 

# ======================= app javabean 混淆================================

-keep class com.zyp.bean.**{*;}



 

##---------------Begin:retrofit+rxjava----------------------

-dontwarn javax.annotation.**

-dontwarn javax.inject.**

# OkHttp3

-dontwarn com.squareup.okhttp.**

-keep class com.squareup.okhttp.** { *;}

-keep interface okhttp3.**{*;}

-dontwarn okhttp3.logging.**

-keep class okhttp3.internal.**{*;}

-dontwarn okhttp3.**

-keep class okhttp3.** { *;}

-dontwarn okio.**

# Retrofit

-dontwarn retrofit2.**

-keep class retrofit2.** { *; }

-keepattributes Signature

-keepattributes Exceptions

# RxJava RxAndroid

-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {

    long producerIndex;

    long consumerIndex;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {

    rx.internal.util.atomic.LinkedQueueNode producerNode;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {

    rx.internal.util.atomic.LinkedQueueNode consumerNode;

}

 

 

-dontnote android.webkit.**

-dontnote java.util.**



##---------------Inmobi----------------------

 

-keepattributes SourceFile,LineNumberTable -keep class com.inmobi.** { *; }

-keep public class com.google.android.gms.**

-dontwarn com.google.android.gms.**

-dontwarn com.squareup.picasso.**

-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient{

public *;

}

# skip the Picasso library classes

-keep class com.squareup.picasso.** {*;}

-dontwarn com.squareup.picasso.**

-dontwarn com.squareup.okhttp.**

# skip Moat classes

-keep class com.moat.** {*;}

-dontwarn com.moat.**

混肴規(guī)則有個(gè)不錯(cuò)的博客:https://blog.csdn.net/guolipeng_network/article/details/74551968

如果集成中有什么問題窗看,歡迎聯(lián)系我QQ752422962

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倦炒,隨后出現(xiàn)的幾起案子显沈,更是在濱河造成了極大的恐慌,老刑警劉巖逢唤,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉讯,死亡現(xiàn)場離奇詭異,居然都是意外死亡鳖藕,警方通過查閱死者的電腦和手機(jī)魔慷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著恩,“玉大人院尔,你說我怎么就攤上這事『硖埽” “怎么了邀摆?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伍茄。 經(jīng)常有香客問我栋盹,道長,這世上最難降的妖魔是什么敷矫? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任贞盯,我火速辦了婚禮音念,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躏敢。我一直安慰自己,他們只是感情好整葡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布件余。 她就那樣靜靜地躺著,像睡著了一般遭居。 火紅的嫁衣襯著肌膚如雪啼器。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天俱萍,我揣著相機(jī)與錄音端壳,去河邊找鬼。 笑死枪蘑,一個(gè)胖子當(dāng)著我的面吹牛损谦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岳颇,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼照捡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了话侧?” 一聲冷哼從身側(cè)響起栗精,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻鹏,沒想到半個(gè)月后悲立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡新博,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年薪夕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叭披。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寥殖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涩蜘,到底是詐尸還是另有隱情嚼贡,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布同诫,位于F島的核電站粤策,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏误窖。R本人自食惡果不足惜叮盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一秩贰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柔吼,春花似錦毒费、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至培漏,卻和暖如春溪厘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牌柄。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工畸悬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人珊佣。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓蹋宦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彩扔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妆档,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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