Android8.1源碼解析(一)Android與Activity啟動(dòng)

閑來沒事看看源碼蓝晒,于是寫了這篇腮出,本文主要介紹Android以及Activity的主要?jiǎng)?chuàng)建流程,所有流程基于Android8.1的代碼芝薇,在部分流程尤其是activity與之前版本存在較大差異胚嘲,供大家參考。

一洛二、Android啟動(dòng)流程

我們直接進(jìn)到app_main.cpp進(jìn)行查看了

int main(int argc, char* const argv[]){
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}

AndroidRuntime.cpp

void AndroidRuntime::start(const char* className, 
                  const Vector<String8>& options, bool zygote){
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);
}

int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote){
    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
}

/*static*/ int AndroidRuntime::startReg(JNIEnv* env){
    /*
     * Every "register" function calls one or more things that return
     * a local reference (e.g. FindClass).  Because we haven't really
     * started the VM yet, they're all getting stored in the base frame
     * and never released.  Use Push/Pop to manage the storage.
     */
    env->PushLocalFrame(200);

    if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
        env->PopLocalFrame(NULL);
        return -1;
    }
    env->PopLocalFrame(NULL);
}

gRegJNI注冊(cè)了很多的函數(shù):

static const RegJNIRec gRegJNI[] = {
    REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
//...
}

register_com_android_internal_os_ZygoteInit_nativeZygoteInit定義為:

int register_com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env)
{
    const JNINativeMethod methods[] = {
        { "nativeZygoteInit", "()V",
            (void*) com_android_internal_os_ZygoteInit_nativeZygoteInit },
    };
    return jniRegisterNativeMethods(env, "com/android/internal/os/ZygoteInit",
        methods, NELEM(methods));
}

終于看到ZygoteInit馋劈。進(jìn)入看看:ZygoteInit.java

    public static void main(String argv[]) {
            zygoteServer.registerServerSocket(socketName);
            Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
            r.run();
            // The select loop returns early in the child process after a fork and
            // loops forever in the zygote.
            caller = zygoteServer.runSelectLoop(abiList);
}

可知一共做了三件事:1)創(chuàng)建了一個(gè)socket接口,用來和ActivityManagerService通訊灭红。
2)啟動(dòng)SystemServer組件侣滩。3)創(chuàng)建一個(gè)loop用來接聽socket接口上ActivityManagerService的請(qǐng)求,來創(chuàng)建新的應(yīng)用進(jìn)程变擒。

接著我們主要看一下SystemServer的流程:SystemServer.java

     /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }
private void run() {
    // Ensure binder calls into the system always run at foreground priority.
            BinderInternal.disableBackgroundScheduling(true);

            // Increase the number of binder threads in system_server
            BinderInternal.setMaxThreads(sMaxBinderThreads);//31

            // Prepare the main looper thread (this thread).
            android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);//-2
            android.os.Process.setCanSelfBackground(false);
            Looper.prepareMainLooper();

            // Initialize native services.
            System.loadLibrary("android_servers");

            // Check whether we failed to shut down last time we tried.
            // This call may not return.
            performPendingShutdown();

            // Initialize the system context.
            createSystemContext();

            // Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();

            // Start services.
            startBootstrapServices();
    /**
     * Starts some essential services that are not tangled up in the bootstrap process.
        */
            startCoreServices();
                /**
         * Starts a miscellaneous grab bag of stuff that has yet to be refactored
      * and organized.
         */
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
      
}

這里其實(shí)主要做了兩件事情:1)createSystemContext進(jìn)行了一些activity相關(guān)的配置君珠。2)創(chuàng)建了很多service。下面先看第一個(gè):

private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
    }
    public static ActivityThread systemMain() {
//...
        ActivityThread thread = new ActivityThread();
        thread.attach(true);
        return thread;
    }

    private void attach(boolean system) {//true
        mInstrumentation = new Instrumentation();//新建Instrumentation
        ContextImpl context = ContextImpl.createAppContext(
                this, getSystemContext().mPackageInfo);
        mInitialApplication = context.mPackageInfo.makeApplication(true, null);//啟動(dòng)application
        mInitialApplication.onCreate();
    }

可見娇斑,在此創(chuàng)建了Instrumentation策添、ContextImpl等工作材部。

接著看一下上面的service創(chuàng)建。從上面可見唯竹,SystemServer創(chuàng)建了SystemServiceManager乐导,直接進(jìn)行了初始化了很多service:

    startBootstrapServices();
    startCoreServices();
    startOtherServices();

startBootstrapServices就是啟動(dòng)了最著名的ActivityManagerService(AMS),其中還有PowerManagerService浸颓、PackageManagerService:

private void startBootstrapServices() {
// Activity manager runs the show.
        traceBeginAndSlog("StartActivityManager");
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        traceEnd();

        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
}

可能也都看到了他們都是通過mSystemServiceManager創(chuàng)建的物臂,為什么呢?其實(shí)是因?yàn)檫@些所有的service都是要注冊(cè)在SystemServiceManager之中進(jìn)行同意管理的产上。

public class SystemServiceManager {
    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();

    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
        // Start it.
        service.onStart();
//...
}

上面的SystemServer.run()還有幾個(gè)點(diǎn)需要關(guān)注一下:

    // maximum number of binder threads used for system_server
    // will be higher than the system default
    private static final int sMaxBinderThreads = 31;
            // Ensure binder calls into the system always run at foreground priority.
            BinderInternal.disableBackgroundScheduling(true);

            // Increase the number of binder threads in system_server
            BinderInternal.setMaxThreads(sMaxBinderThreads);

binder進(jìn)程的請(qǐng)求數(shù)量是在這里設(shè)置的默認(rèn)為31棵磷,并且運(yùn)行在foreground priority,同樣SystemService進(jìn)程優(yōu)先級(jí)也是foreground priority且不可置為后臺(tái):

 android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);//-2
            android.os.Process.setCanSelfBackground(false);

foreground priority在所有優(yōu)先級(jí)中的位置:

public static final int THREAD_PRIORITY_AUDIO = -16;
public static final int THREAD_PRIORITY_BACKGROUND = 10;
public static final int THREAD_PRIORITY_DEFAULT = 0;
public static final int THREAD_PRIORITY_DISPLAY = -4;
public static final int THREAD_PRIORITY_FOREGROUND = -2;
public static final int THREAD_PRIORITY_LESS_FAVORABLE = 1;
public static final int THREAD_PRIORITY_LOWEST = 19;
public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;

平時(shí)我們使用的Activity在THREAD_PRIORITY_DEFAULT晋涣,Async在THREAD_PRIORITY_BACKGROUND仪媒。

OK,現(xiàn)在為止啟動(dòng)流程基本介紹完了谢鹊。

二算吩、Activity啟動(dòng)流程

讓我們看一下activity啟動(dòng)流程,假設(shè)由桌面點(diǎn)擊應(yīng)用圖標(biāo)來啟動(dòng):

Launcher.java

public void onClick(View v)
boolean startActivitySafely(View v, Intent intent, Object tag)
boolean startActivity(View v, Intent intent, Object tag)
startActivity(intent);

Activity.java

public void startActivity(Intent intent)
public void startActivity(Intent intent, @Nullable Bundle options)
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options)

Instrumentation.java

public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options){
    ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
}

這里最終調(diào)用了ActivityManager的getService方法佃扼,從返回值IActivityManager就可以看出來應(yīng)該是進(jìn)行了跨進(jìn)程通訊偎巢。

//ActivityManager.java
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }
    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

很明顯這里是AIDL客戶端調(diào)用,他的接口定義為:

//IActivityManager.aidl
int startActivity(in IApplicationThread caller, in String callingPackage, in Intent intent,
            in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
            int flags, in ProfilerInfo profilerInfo, in Bundle options);

想要繼續(xù)根據(jù)我們的找到服務(wù)端的代碼松嘶,這個(gè)服務(wù)端的代碼其實(shí)并不是很好找的艘狭,這里我使用了全局搜索,最終中油一個(gè)調(diào)用點(diǎn):ActivityManagerService.java(如果大家有好的查找方法翠订,懇請(qǐng)告知巢音,謝謝),找到了服務(wù)端代碼下面的跟進(jìn)就很方便了:

public class ActivityManagerService extends IActivityManager.Stub

public final int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions)

frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId)

final int startActivityMayWait(IApplicationThread caller, int callingUid,
            String callingPackage, Intent intent, String resolvedType,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
            ProfilerInfo profilerInfo, WaitResult outResult,
            Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            TaskRecord inTask, String reason)

int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, TaskRecord inTask, String reason)

private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, TaskRecord inTask)

    private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity)

    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity)

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

    boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {

frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options)

    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options)

    final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
            ActivityRecord resuming, boolean pauseImmediately) {
                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                        userLeaving, prev.configChangeFlags, pauseImmediately);
    }

跨進(jìn)程通信
frameworks/base/core/java/android/app/ActivityThread.java

        public final void schedulePauseActivity(IBinder token, boolean finished,
                boolean userLeaving, int configChanges, boolean dontReport)

        public void handleMessage(Message msg) {
                case PAUSE_ACTIVITY: {
                    handlePauseActivity((IBinder) args.arg1, false,
                            (args.argi1 & USER_LEAVING) != 0, args.argi2,
                            (args.argi1 & DONT_REPORT) != 0, args.argi3);
                } break;
         }

    private void handlePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges, boolean dontReport, int seq)

跨進(jìn)程通信
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public final void activityPaused(IBinder token)

frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

final void activityPausedLocked(IBinder token, boolean timeout) 

final void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
            boolean newTask, boolean keepCurTransition, ActivityOptions options)

frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

    private void completePauseLocked(boolean resumeNext, ActivityRecord resuming)

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

    boolean resumeFocusedStackTopActivityLocked(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {

frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) 

    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options)

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

    void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig)

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

    final ProcessRecord startProcessLocked(String processName,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            String hostingType, ComponentName hostingName, boolean allowWhileBooting,
            boolean isolated, boolean keepIfLarge)

    final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
            boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,
            boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,
            String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler)

    private final void startProcessLocked(ProcessRecord app, String hostingType,
            String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
                startResult = Process.start(entryPoint,
                        app.processName, uid, uid, gids, debugFlags, mountExternal,
                        app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                        app.info.dataDir, invokeWith, entryPointArgs);
    }

frameworks/base/core/java/android/os/Process.java

zygoteProcess.start(processClass, niceName, uid, gid, gids,
                    debugFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, zygoteArgs);

產(chǎn)生了新的ActivityThread進(jìn)程尽超,然后執(zhí)行進(jìn)程的main方法官撼。
frameworks/base/core/java/android/app/ActivityThread.java

 public static void main(String[] args) {
        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        Looper.loop();
}
private void attach(boolean system) {//false
            final IActivityManager mgr = ActivityManager.getService();
            mgr.attachApplication(mAppThread);
}

跨進(jìn)程
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

    public final void attachApplication(IApplicationThread thread) 

    private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) 

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException 

    final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
                app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                        System.identityHashCode(r), r.info,
                        mergedConfiguration.getGlobalConfiguration(),
                        mergedConfiguration.getOverrideConfiguration(), r.compat,
                        r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                        r.persistentState, results, newIntents, !andResume,
                        mService.isNextTransitionForward(), profilerInfo);
    }

frameworks/base/core/java/android/app/ActivityThread.java$ApplicationThread

       public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) 

        private void sendMessage(int what, Object obj) 

        public void handleMessage(Message msg) {
                case LAUNCH_ACTIVITY: {
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                } break;
        }

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) 

    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent){
        ContextImpl appContext = createBaseContextForActivity(r);
        activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent)
       Application app = r.packageInfo.makeApplication(false, mInstrumentation);

       activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);
        mInstrumentation.callActivityOnCreate(activity, r.state);
    }

    public void callActivityOnCreate(Activity activity, Bundle icicle) {
        prePerformCreate(activity);
        activity.performCreate(icicle);
        postPerformCreate(activity);
    }

frameworks/base/core/java/android/app/Activity.java

    final void performCreate(Bundle icicle, PersistableBundle persistentState) 

    protected void onCreate(@Nullable Bundle savedInstanceState) 

最后,時(shí)序圖先補(bǔ)一張以前版本的似谁,最近補(bǔ)上傲绣。


activity啟動(dòng)流程圖old.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巩踏,隨后出現(xiàn)的幾起案子秃诵,更是在濱河造成了極大的恐慌,老刑警劉巖塞琼,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠净,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毅往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門牵咙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攀唯,你說我怎么就攤上這事洁桌。” “怎么了侯嘀?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵另凌,是天一觀的道長。 經(jīng)常有香客問我残拐,道長途茫,這世上最難降的妖魔是什么碟嘴? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任溪食,我火速辦了婚禮,結(jié)果婚禮上娜扇,老公的妹妹穿的比我還像新娘错沃。我一直安慰自己,他們只是感情好雀瓢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布枢析。 她就那樣靜靜地躺著,像睡著了一般刃麸。 火紅的嫁衣襯著肌膚如雪醒叁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天泊业,我揣著相機(jī)與錄音把沼,去河邊找鬼。 笑死吁伺,一個(gè)胖子當(dāng)著我的面吹牛饮睬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篮奄,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捆愁,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了窟却?” 一聲冷哼從身側(cè)響起昼丑,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夸赫,沒想到半個(gè)月后菩帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年胁附,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酒繁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡控妻,死狀恐怖州袒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弓候,我是刑警寧澤郎哭,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站菇存,受9級(jí)特大地震影響夸研,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜依鸥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一亥至、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贱迟,春花似錦姐扮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缚俏,卻和暖如春惊搏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忧换。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工恬惯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人包雀。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓宿崭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親才写。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葡兑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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