Trace解析

今天在讀關(guān)于圖片解析的源碼,看到這樣的代碼:

/**
     * Decode an input stream into a bitmap. If the input stream is null, or
     * cannot be used to decode a bitmap, the function returns null.
     * The stream's position will be where ever it was after the encoded data
     * was read.
     *
     * @param is The input stream that holds the raw data to be decoded into a
     *           bitmap.
     * @param outPadding If not null, return the padding rect for the bitmap if
     *                   it exists, otherwise set padding to [-1,-1,-1,-1]. If
     *                   no bitmap is returned (null) then padding is
     *                   unchanged.
     * @param opts null-ok; Options that control downsampling and whether the
     *             image should be completely decoded, or just is size returned.
     * @return The decoded bitmap, or null if the image data could not be
     *         decoded, or, if opts is non-null, if opts requested only the
     *         size be returned (in opts.outWidth and opts.outHeight)
     *
     * <p class="note">Prior to {@link android.os.Build.VERSION_CODES#KITKAT},
     * if {@link InputStream#markSupported is.markSupported()} returns true,
     * <code>is.mark(1024)</code> would be called. As of
     * {@link android.os.Build.VERSION_CODES#KITKAT}, this is no longer the case.</p>
     */
    public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {
        // we don't throw in this case, thus allowing the caller to only check
        // the cache, and not force the image to be decoded.
        if (is == null) {
            return null;
        }

        Bitmap bm = null;

        Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");
        try {
            if (is instanceof AssetManager.AssetInputStream) {
                final long asset = ((AssetManager.AssetInputStream) is).getNativeAsset();
                bm = nativeDecodeAsset(asset, outPadding, opts);
            } else {
                bm = decodeStreamInternal(is, outPadding, opts);
            }

            if (bm == null && opts != null && opts.inBitmap != null) {
                throw new IllegalArgumentException("Problem decoding into existing bitmap");
            }

            setDensityFromOptions(bm, opts);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
        }

        return bm;
    }

其中有兩句代碼:

 Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");
 
 Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);

很好奇拗军,這個(gè)Trace是干嘛的?之前接觸到有一個(gè)TraceView!TraceView 是 Android 平臺(tái)配備一個(gè)很好的性能分析的工具再扭。它可以通過圖形化的方式讓我們了解我們要跟蹤的程序的性能,并且能具體到 method夜矗!

跟進(jìn)源碼瞧個(gè)究竟泛范,看到這個(gè)代碼的文件注釋:


/**
 * Writes trace events to the system trace buffer.  These trace events can be
 * collected and visualized using the Systrace tool.
 *
 * <p>This tracing mechanism is independent of the method tracing mechanism
 * offered by {@link Debug#startMethodTracing}.  In particular, it enables
 * tracing of events that occur across multiple processes.
 * <p>For information about using the Systrace tool, read <a
 * href="{@docRoot}tools/debugging/systrace.html">Analyzing Display and Performance
 * with Systrace</a>.
 */

翻譯過來就是:

將跟蹤事件寫入系統(tǒng)跟蹤緩沖區(qū)。 可以使用Systrace工具收集和可視化這些跟蹤事件紊撕。

此跟蹤機(jī)制獨(dú)立于startMethodTracing()提供的方法跟蹤機(jī)制罢荡。 特別地,它使得能夠跟蹤跨多個(gè)進(jìn)程發(fā)生的事件对扶。

有關(guān)使用Systrace工具的信息区赵,請(qǐng)參閱使用Systrace分析顯示和性能。

哈哈浪南,出來一個(gè)東西—— Systrace惧笛。等我完了研究下這個(gè)Systrace.

接下來看著兩個(gè)方法:

Trace.traceBegin

    /**
     * Writes a trace message to indicate that a given section of code has
     * begun. Must be followed by a call to {@link #traceEnd} using the same
     * tag.
     *
     * @param traceTag The trace tag.
     * @param methodName The method name to appear in the trace.
     *
     * @hide
     */
    public static void traceBegin(long traceTag, String methodName) {
        if (isTagEnabled(traceTag)) {
            nativeTraceBegin(traceTag, methodName);
        }
    }

寫入跟蹤信息這標(biāo)志著要追蹤的代碼已經(jīng)開始運(yùn)行。必須在后面調(diào)用traceEnd逞泄,并且使用相同的tag.

參數(shù)一:根據(jù)的標(biāo)記tag;
參數(shù)二:在追蹤路徑中顯示的方法名患整。

Trace.traceEnd

 /**
     * Writes a trace message to indicate that the current method has ended.
     * Must be called exactly once for each call to {@link #traceBegin} using the same tag.
     *
     * @param traceTag The trace tag.
     *
     * @hide
     */
    public static void traceEnd(long traceTag) {
        if (isTagEnabled(traceTag)) {
            nativeTraceEnd(traceTag);
        }
    }

寫入追蹤信息標(biāo)志著當(dāng)前方法已經(jīng)結(jié)束拜效。必須和traceBegin成對(duì)的調(diào)用并且使用同一個(gè)tag.

參數(shù):追蹤tag和traceBegin傳入的要一致。

至此為止各谚,明白了圖片解析里的這兩句代碼是干嘛的:

/* * Writes trace events to the kernel trace buffer. These trace events can be * collected using the "atrace" program for offline analysis. */

將這些追蹤時(shí)間寫入內(nèi)部追蹤緩存中紧憾。這些追蹤事件可以被“atrace”程序收集起來,進(jìn)行離線分析昌渤。

但是赴穗,再往里面走的話,發(fā)現(xiàn)了這東西竟然也走到了Native層:

private static native void nativeTraceBegin(long tag, String name);
private static native void nativeTraceEnd(long tag);

這兩個(gè)方法是在哪兒呢膀息?仔細(xì)看看了文件發(fā)現(xiàn)了有在各種tag上有兩句注釋:

// These tags must be kept in sync with system/core/include/cutils/trace.h.
// They should also be added to frameworks/native/cmds/atrace/atrace.cpp.

好吧般眉,原來這東西到最后也給C++去做了!

那么問題了潜支,我有什么理由不去好好學(xué)下C++,NDK 呢甸赃?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冗酿,隨后出現(xiàn)的幾起案子埠对,更是在濱河造成了極大的恐慌,老刑警劉巖裁替,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项玛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弱判,警方通過查閱死者的電腦和手機(jī)襟沮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌腰,“玉大人臣嚣,你說我怎么就攤上這事“疲” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵淹父,是天一觀的道長株婴。 經(jīng)常有香客問我,道長暑认,這世上最難降的妖魔是什么困介? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蘸际,結(jié)果婚禮上座哩,老公的妹妹穿的比我還像新娘。我一直安慰自己粮彤,他們只是感情好根穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布姜骡。 她就那樣靜靜地躺著,像睡著了一般屿良。 火紅的嫁衣襯著肌膚如雪圈澈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天尘惧,我揣著相機(jī)與錄音康栈,去河邊找鬼。 笑死喷橙,一個(gè)胖子當(dāng)著我的面吹牛啥么,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贰逾,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼悬荣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了似踱?” 一聲冷哼從身側(cè)響起隅熙,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎核芽,沒想到半個(gè)月后囚戚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧简,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年驰坊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮独。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拳芙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皮璧,到底是詐尸還是另有隱情舟扎,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布悴务,位于F島的核電站睹限,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讯檐。R本人自食惡果不足惜羡疗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望别洪。 院中可真熱鬧叨恨,春花似錦、人聲如沸挖垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至午乓,卻和暖如春站宗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背益愈。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工梢灭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒸其。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓敏释,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摸袁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥顽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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