锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产另类精品专区,在线精品视频一区二区三四,女女同性女同一区二区三区91http://m.shnenglu.com/finehai/category/19061.html褰撴椂鍙亾鏄甯竳zh-cnSat, 05 May 2012 00:47:27 GMTSat, 05 May 2012 00:47:27 GMT60WebKit涔嬪竷灞(layout)http://m.shnenglu.com/finehai/archive/2012/04/23/172479.htmlBlueseaBlueseaMon, 23 Apr 2012 09:35:00 GMThttp://m.shnenglu.com/finehai/archive/2012/04/23/172479.htmlhttp://m.shnenglu.com/finehai/comments/172479.htmlhttp://m.shnenglu.com/finehai/archive/2012/04/23/172479.html#Feedback0http://m.shnenglu.com/finehai/comments/commentRss/172479.htmlhttp://m.shnenglu.com/finehai/services/trackbacks/172479.html
WebKit 鍦ㄦ覆鏌撻〉闈箣鍓嶏紝闇瑕佺‘瀹氬悇涓厓绱犵殑浣嶇疆銆佸ぇ灝忥紝鑰岃繖涓繃紼嬪氨鏄痩ayout(甯冨眬)銆備笅闈紝鎴戜滑瀵筶ayout鐨勪富瑕佽繃紼嬭繘琛屼竴鐣鏄庛?

涓銆丗rameView::layout鏂規硶

FrameView浣滀負涓嶸iew鐩稿叧鐨勭被錛屽叾涓昏娑夊強涓庢樉紺虹浉鍏崇殑鍐呭錛岃屽叾涓欏甸潰鍏冪礌鐨勫竷灞鑷沖叧閲嶈錛岃繖涔熸槸嫻忚鍣ㄧ殑鏍稿績澶勭悊閮ㄥ垎銆?

鎴戜滑閮界煡閬撴祻瑙堝櫒浠嶹eb鏈嶅姟鍣ㄨ幏寰楁暟鎹悗錛岀粡瑙f瀽浼氭瀯寤篋OM鏍戙丷ender鏍戯紝鐒跺悗榪涜甯冨眬澶勭悊錛岃繘鑰屼負娓叉煋欏甸潰浣滃ソ鍑嗗錛屽叾涓殑甯冨眬澶勭悊寰寰鐢盕rameView::layout鏂規硶鍙戣搗錛岃鎴戜滑鏉ュ叿浣撶湅鐪嬪叾瀹炵幇錛屼竴紿ュ叾涓昏瀹炵幇榪囩▼銆?

void FrameView::layout(bool allowSubtree)
{
    if (m_midLayout)
      return;

    // Always ensure our style info is up-to-date. This can happen in situations where the layout beats any sort of style recalc update that needs to occur.

    // 榪涜CSSStyleSelector鐨勬洿鏂板鐞嗭紝鍥犱負涓鏃SS鍙戠敓鍙樺寲錛屽竷灞鐨勭粨鏋滀篃鍙兘 鍙戠敓鐩稿叧鍙樺寲錛屾墍浠ュ湪寮濮嬪竷灞涔嬪墠錛岄渶瑕佹鏌SS鏄惁鍙戠敓鍙樺寲錛屽鏋滄湁鍒欓渶瑕佷綔鐩稿簲璋冩暣錛岃繘鑰屽彲鑳藉獎鍝峈ender鏍戠瓑銆?

    if (m_frame->needsReapplyStyles())
       m_frame->reapplyStyles();
    else if (document->childNeedsStyleRecalc())
       document->recalcStyle();

    bool subtree = m_layoutRoot;
    RenderObject* root = subtree ? m_layoutRoot : document->renderer();
    if (!root) {
        // FIXME: Do we need to set m_size here?
        m_layoutSchedulingEnabled = true;
        return;
    }

    //甯冨眬鐨勫鐞嗗彲鑳界浉浜掑祵濂楋紝榪欎笌鍙戣搗甯冨眬澶勭悊鐨勬椂鏈虹浉鍏熾?
    //璁劇疆婊氬姩鏉$浉鍏?
    if (m_canHaveScrollbars) {
        hMode = ScrollbarAuto;
        vMode = ScrollbarAuto;
    } else {
        hMode = ScrollbarAlwaysOff;
        vMode = ScrollbarAlwaysOff;
    }

    if (!subtree) {
        // Now set our scrollbar state for the layout.

        if (body->hasTagName(framesetTag) && !m_frame->settings()->frameFlatteningEnabled()) {
            // frameset 鑰屼笖璁劇疆浜唂rameFlatteningEnabled錛屽垯鍏抽棴婊氬姩鏉?
                body->renderer()->setChildNeedsLayout(true);
                vMode = ScrollbarAlwaysOff;
                hMode = ScrollbarAlwaysOff;
            } else if (body->hasTagName(bodyTag)) {
                // 璁劇疆婊氬姩鏉?
                applyOverflowToViewport(o, hMode, vMode);
            }
    }

    //root寰寰涓篟enderView瀵硅薄
    RenderLayer* layer = root->enclosingLayer();

    m_midLayout = true;
    beginDeferredRepaints();
    root->layout();
    endDeferredRepaints();
    m_midLayout = false;

    m_layoutSchedulingEnabled = true;

    if (!subtree && !static_cast(root)->printing())
        adjustViewSize();

    // Now update the positions of all layers.
    //瀵瑰綋鍓峈ender鏍戝竷灞瀹屽悗錛岃緗甊enderLayer鏍戠殑甯冨眬淇℃伅錛屽叾涓璵_doFullRepaint鎻忚堪鏄惁闇瑕佸彂璧鋒覆鏌撳鐞嗐?

   beginDeferredRepaints();
   layer->updateLayerPositions(...);
   endDeferredRepaints();

    // 璁劇疆蹇焍lit
    setCanBlitOnScroll(!useSlowRepaints());

    //鍥犱負鍦ㄥ竷灞鐨勮繃紼嬩腑錛屽彲鑳借繘涓姝ヨ幏寰楃綉欏墊暟鎹紝鍒欓渶瑕佺戶緇竷灞澶勭悊銆?
    if (!m_postLayoutTasksTimer.isActive()) {
        // Calls resumeScheduledEvents()
        performPostLayoutTasks();

        if (!m_postLayoutTasksTimer.isActive() && needsLayout()) {
            // Post-layout widget updates or an event handler made us need layout again. Lay out again, but this time defer widget updates and event dispatch until after we return.
            m_postLayoutTasksTimer.startOneShot(0);
            pauseScheduledEvents();
            layout();
        }
    } else {
        resumeScheduledEvents();
    }
}


FrameView::layout鏂規硶錛岀畝鍗曠殑璇存潵灝辨槸鍙戣搗瀵筊ender鏍戜腑鐨勬瘡涓涓妭鐐規寜鐓т粠鐖惰妭鐐瑰埌瀛愯妭鐐圭殑鏂瑰紡榪涜x銆亂銆亀idth銆乭eight璁$畻錛屽綋姣忎竴涓爲鑺傜偣鐨勪綅緗強澶у皬紜畾涔嬪悗灝卞彲浠ヨ繘琛屽悗闈㈢殑娓叉煋銆?

FrameView::layout寰寰浼氳皟鐢≧ender鏍戞牴鐨刲ayout鏂規硶鍗砇enderView::layout銆?


浜屻丷enderView::layout鏂規硶

void RenderView::layout()
{
     if (printing())
         m_minPrefWidth = m_maxPrefWidth = m_width;

     // Use calcWidth/Height to get the new width/height, since this will take the full page zoom factor into account.
     bool relayoutChildren = !printing() && (!m_frameView || m_width != viewWidth() || m_height != viewHeight());
     if (relayoutChildren) {

        setChildNeedsLayout(true, false);
        for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
            if (child->style()->height().isPercent() || child->style()->minHeight().isPercent() || child->style()->maxHeight().isPercent())
                child->setChildNeedsLayout(true, false);
        }


     }

     ASSERT(!m_layoutState);
     LayoutState state;
     // FIXME: May be better to push a clip and avoid issuing offscreen repaints.
     state.m_clipped = false;
     m_layoutState = &state;

     if (needsLayout())
         RenderBlock::layout();//綾葷戶鎵跨殑濂藉錛岀洿鎺ヨ皟鐢ㄧ埗綾葷殑layout

    // Reset overflow and then replace it with docWidth and docHeight.
    m_overflow.clear();
    addLayoutOverflow(IntRect(0, 0, docWidth(), docHeight()));

     ASSERT(m_layoutStateDisableCount == 0);
     ASSERT(m_layoutState == &state);
     m_layoutState = 0;
     setNeedsLayout(false);
}

void RenderBlock::layout()
{
     // Update our first letter info now.
     updateFirstLetter();
     // Table cells call layoutBlock directly, so don't add any logic here. Put code into layoutBlock().
     layoutBlock(false);

     // It's safe to check for control clip here, since controls can never be table cells. If we have a lightweight clip, there can never be any overflow from children.
    if (hasControlClip() && m_overflow)
        clearLayoutOverflow();
}



涓夈丷enderBlock::layoutBlock鏂規硶

layoutBlock 浼氬垎鎴愪袱涓垎鏀細layoutInlineChildren 鍜?layoutBlockChildren

void RenderBlock::layoutBlock(bool relayoutChildren)
{
    ...
    calcWidth();//鍏堣綆楀搴?
    calcColumnWidth();
   


    m_overflow.clear();   


    if (oldWidth != width() || oldColumnWidth != desiredColumnWidth())
        relayoutChildren = true;
    clearFloats();

    int previousHeight = height();
    setHeight(0);

     //榪欏氨鏄湪甯冨眬鍩烘湰姒傚康涓彁鍒扮殑Block-level鍏冪礌鐨勫瓙鑺傜偣瑕佷箞鏄疊lock-level鍏冪礌瑕佷箞涓篒nline-level鍏冪礌銆?
     if (childrenInline())
         layoutInlineChildren(relayoutChildren, repaintTop, repaintBottom);
     else
         layoutBlockChildren(relayoutChildren, maxFloatBottom);

     // Expand our intrinsic height to encompass floats.
     int toAdd = borderBottom() + paddingBottom() + horizontalScrollbarHeight();
     if (floatBottom() > (m_height - toAdd) && (isInlineBlockOrInlineTable() || isFloatingOrPositioned() || hasOverflowClip() ||
(parent() && parent()->isFlexibleBox() || m_hasColumns)))
     setHeight(floatBottom() + toAdd);

     // Now lay out our columns within this intrinsic height, since they can slightly affect the intrinsic height as we adjust for clean column breaks.
     int singleColumnBottom = layoutColumns();

     // Calculate our new height.//甯冨眬瀹屽瓙鑺傜偣鍚庣‘瀹氱埗鑺傜偣楂樺害
     int oldHeight = height();
     calcHeight();

     if (previousHeight != height())
         relayoutChildren = true;




     //鍙﹀甯冨眬灞炴т負Fixed鍜宎bsolute鐨勫厓绱?
     layoutPositionedObjects(relayoutChildren || isRoot());


     // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if we overflow or not.
    updateScrollInfoAfterLayout();


    // Repaint with our new bounds if they are different from our old bounds.
    bool didFullRepaint = repainter.repaintAfterLayout();
    if (!didFullRepaint && repaintTop != repaintBottom && (style()->visibility() == VISIBLE || enclosingLayer()->hasVisibleContent())) {
        // 璁劇疆repaintRect


       // Make sure the rect is still non-empty after intersecting for overflow above
        if (!repaintRect.isEmpty()) {
            repaintRectangle(repaintRect); // We need to do a partial repaint of our content.
            if (hasReflection())
                repaintRectangle(reflectedRect(repaintRect));
        }
    }
    setNeedsLayout(false);
}


鍥涖丷enderBlock::layoutBlockChildren鏂規硶


void RenderBlock::layoutBlockChildren(bool relayoutChildren, int& maxFloatBottom)
{
int top = borderTop() + paddingTop();
int bottom = borderBottom() + paddingBottom() + horizontalScrollbarHeight();





    // Fieldsets need to find their legend and position it inside the border of the object.
    // The legend then gets skipped during normal layout.
    RenderObject* legend = layoutLegend(relayoutChildren);



//閬嶅巻瀛愯妭鐐?

RenderBox* next = firstChildBox();
    while (next) {
        RenderBox* child = next;
        next = child->nextSiblingBox();

        if (legend == child)
            continue; // Skip the legend, since it has already been positioned up in the fieldset's border.
       // Make sure we layout children if they need it.
        // FIXME: Technically percentage height objects only need a relayout if their percentage isn't going to be turned into
        // an auto value.  Add a method to determine this, so that we can avoid the relayout.
        if (relayoutChildren || ((child->style()->height().isPercent() || child->style()->minHeight().isPercent() || child->style()->maxHeight().isPercent()) && !isRenderView()))
            child->setChildNeedsLayout(true, false);

        // If relayoutChildren is set and we have percentage padding, we also need to invalidate the child's pref widths.
        if (relayoutChildren && (child->style()->paddingLeft().isPercent() || child->style()->paddingRight().isPercent()))
            child->setPrefWidthsDirty(true, false);

        // Handle the four types of special elements first.  These include positioned content, floating content, compacts and
        // run-ins.  When we encounter these four types of objects, we don't actually lay them out as normal flow blocks.
        if (handleSpecialChild(child, marginInfo))
            continue;

        // Lay out the child.
        layoutBlockChild(child, marginInfo, previousFloatBottom, maxFloatBottom);
    }

    // Now do the handling of the bottom of the block, adding in our bottom border/padding and
    // determining the correct collapsed bottom margin information.
    handleBottomOfBlock(top, bottom, marginInfo);
}

layoutBlockChild 鏂規硶灝辨瘮杈冨鏉備簡錛屽叿浣撳彲浠ヨ嚜宸辯湅浠g爜銆?


浜斻丷enderBlock::layoutInlineChildren鏂規硶

榪欎釜鏂規硶鐩稿綋澶嶆潅錛屽叾浣滅敤灝辨槸甯冨眬鏂囧瓧銆佸浘鍍忕瓑錛屽鏂囧瓧琛岄珮紜畾銆佹柇琛岀瓑澶勭悊錛屽悓鏃惰繕鍖呮嫭 鏂囧瓧浠庡乏鍒板彸鎴栦粠鍙沖埌宸︾殑甯冨眬澶勭悊銆傚叿浣撳彲浠ュ弬鑰僢idi.cpp涓殑婧愮爜瀹炵幇銆?


鍏佽皟鐢‵rameView::layout鏂規硶鐨勬椂鏈?

鐢變簬浠嶹eb鏈嶅姟鍣ㄨ幏鍙栫殑緗戦〉鏁版嵁涓嶅彲鑳戒竴嬈℃у畬鎴愶紝寰寰闇瑕佽竟鑾峰彇鏁版嵁錛岃竟甯冨眬錛岀劧鍚庢覆鏌擄紝榪欐牱鎵嶅彲鑳借幏寰楄壇濂界殑鐢ㄦ埛鎰熷彈銆?

鎵浠ヤ竴鏃﹁幏寰椾富瑕佹暟鎹css鏁版嵁鍙奲ody絳夋爣絳懼悗錛屽氨鍙互寮濮嬪竷灞錛屽竷灞瀹屽悗浼氭牴鎹綋鍓嶆潯浠跺喅瀹氭槸鍚﹀皢甯冨眬鐨勬暟鎹覆鏌撳嚭鏉ワ紝鎴栬呯戶緇竷灞澶勭悊鍚庢潵鑾峰彇鐨勬暟鎹紝榪欐牱涔熷鍔犱簡甯冨眬澶勭悊榪囩▼鐨勫鏉傚害銆?

鑰岃皟鐢╨ayout鏂規硶鐨勬椂鏈轟篃鑷沖叧閲嶈錛屽洜涓簂ayout鏈韓灝卞彲鑳介渶瑕佽姳璐瑰ぇ閲忕殑鏃墮棿濡俵ayoutBlockChildren銆?layoutInlineChildren絳夊鐞嗭紝鍏跺線寰涓庣綉欏電殑鍐呭鏈夊叧錛岃岀綉欏電殑鍐呭鍗寸敱緗戦〉寮鍙戣呮潵紜畾錛屽嫻忚鍣ㄦ潵璁叉槸鍗冨彉涓囧寲鐨勶紝榪欏氨瀵?layout鏂規硶鐨勫疄鐜板強璋冪敤鏃舵満鎻愬嚭鏇撮珮鐨勮姹傦紝鍚屾椂紜畾浜嗗叾澶嶆潅鎬с?

璋冪敤layout鐨勬椂鏈轟富瑕佹湁鑾峰緱涓瀹欴OM鏂囨。鏁版嵁鍚庤皟鐢―ocument::updateLayout()銆侀渶瑕侀噸鏂頒嬌鐢–SS鏁版嵁鏃惰皟鐢―ocument::recalcStyle()銆佹敼鍙樼獥鍙eぇ灝忓悗璋冪敤Frame::forceLayout()絳夋潵瀹炵幇銆傘傘?


涓冦佹葷粨

鍏跺疄WebKit娑夊強緗戦〉甯冨眬鏂歸潰鐨刲ayout鏂規硶铔鏉傜殑錛屽鍏朵粬RenderObject瀛愮被涔熶細鏍規嵁鑷韓鎯呭喌閲嶈澆瀹炵幇layout錛岃繕鏈夊float銆乫ixed銆乤bsolute銆乮nline鍏冪礌絳夌殑澶勭悊錛屼絾鍏朵富瑕侀昏緫灝辮薄涓婇潰鎵鎻愶紝榪欓噷鍙槸姹囨諱竴涓嬩富瑕佹祦紼嬪強姒傚康錛岄拡瀵規瘡涓涓叿浣撴爣絳炬垨RenderObject鐨勫竷灞瀹炵幇鍒欓渶瑕佹洿娣變竴姝ョ殑浜嗚В錛屽笇鏈涘ぇ瀹惰兘瀵逛簡瑙ebKit鐨勭綉欏靛竷灞榪囩▼鏈変竴涓竻鏅拌屽噯紜殑璁よ瘑銆傘?


Bluesea 2012-04-23 17:35 鍙戣〃璇勮
]]>
Android涔媤ebkit鍐呮牳JNI灞備笌Java灞?鍑芥暟浜掔浉璋冪敤鏂規硶 http://m.shnenglu.com/finehai/archive/2012/04/17/171757.htmlBlueseaBlueseaTue, 17 Apr 2012 07:58:00 GMThttp://m.shnenglu.com/finehai/archive/2012/04/17/171757.htmlhttp://m.shnenglu.com/finehai/comments/171757.htmlhttp://m.shnenglu.com/finehai/archive/2012/04/17/171757.html#Feedback0http://m.shnenglu.com/finehai/comments/commentRss/171757.htmlhttp://m.shnenglu.com/finehai/services/trackbacks/171757.html

Java灞傝皟鐢?/span>JNI灞傚嚱鏁幫細

渚嬪瓙錛?/span>

Java灞?/span>: BrowserFrame::loadurl( ) 

       - 璋冪敤JNI鍒悕: Nativeloadurl() ;

JNI 灞傦細WebFrame::loadurl( ) ;

 

1銆佸皢java灞備腑鐨勫嚱鏁板搴?/span>JNI灞備腑鐨勫嚱鏁幫紝浠ユ柟渚胯皟鐢ㄤ箣銆?/span>


鍦↗NI灞傚畾涔夐渶瑕佺敤鐨勫嚱鏁?/span>WebFrame::loadurl( )


      static void LoadUrl(JNIEnv *env, jobject obj, jstring url)


-----------------------------------------------------------------------------------------

  jniRegisterNativeMethods(JNIEnv* env, const char* className,

const JNINativeMethodgMethods, int numMethods)

// className 錛?span style="font-family: Times New Roman;">java灞傜殑綾誨悕銆?/span>

// gMethods 錛氬搴?/span>JNINativeMethod鐨勬暟緇勩?/span>

------------------------------------------------------------------------------------------

typedef struct { 

    const char* name; //鍑芥暟鍚?/span>(java灞備腑澹版槑)

    const char* signature; // 鍑芥暟鍙傛暟

          void* fnPtr; // 鍑芥暟鎸囬拡錛堟寚鍚?/span>JNI灞?nbsp;-> WebFrame::loadurl( ) )

JNINativeMethod;

------------------------------------------------------------------------------------------

Eg.  灝嗗涓?span style="font-family: Times New Roman;">JNI鍑芥暟浣跨敤鍒悕錛?/span>Nativeloadurl( ) (java灞備腑澹版槑)錛屽瓨浜庢敞鍐屾暟緇勪腑銆?/span>

JNINativeMethod gMethods[]={

{ "nativeLoadUrl", "(Ljava/lang/String;)V", (void*) LoadUrl }

...

}

------------------------------------------------------------------------------------------


2. 鍦?span style="font-family: Times New Roman; color: #ff0000;">Java灞備腑澹版槑騫惰皟鐢ㄥ嚱鏁幫細nativeLoadUrl(String url)


    澹版槑錛?/span>

private native void nativeLoadUrl(String url);

    璋冪敤錛?/span>

      nativeLoadUrl(url);

JNI灞傝皟鐢?/span>Java鍑芥暟錛?/span>

    void Download::transportUrl(WebCore::FrameView* view, WebCore::String url)

    {

        WebViewCore* viewcore = WebViewCore::getWebViewCore(view);

        JNIEnv* env = JSC::Bindings::getJNIEnv();

        jstring jUrl =  env->NewString(url.characters(), url.length());

// 1. 鑾峰緱Java璇ョ被鐨?nbsp;jclass瀵硅薄

        jclass mODP = env->FindClass("archermind/webkit/Observor/ODP");

// 2. 閫氳繃璇ュ璞★紝鍙栧緱鐩稿簲java鍑芥暟鍙婂弬鏁板埌 -> jmethodID涓?/span>

        jmethodID msendDownloadRequest = env->GetStaticMethodID(

mODP, "sendDownloadRequest",                                          "(Larchermind/webkit/core/WebView;Ljava/lang/String;)V");

// 3. 鍦↗NI灞備腑錛岄氳繃鍑芥暟璋冪敤CallStaticVoidMethod鏉ヨ皟鐢╦ava鍑芥暟銆?/span>

        env->CallStaticVoidMethod(mODP, msendDownloadRequestviewcore->getWebViewJavaObject(),jUrl);

// viewcore->getWebViewJavaObject() 涓?nbsp;arg1 .

// jURL 涓篴rg2 .

        env->DeleteLocalRef(jUrl);

    }
杞嚜錛歨ttp://blog.csdn.net/weiyouyin/article/details/5739659

Bluesea 2012-04-17 15:58 鍙戣〃璇勮
]]>
銆愯漿銆慦ebKit 鍒嗘瀽鈥揻or androidhttp://m.shnenglu.com/finehai/archive/2012/04/11/170868.htmlBlueseaBlueseaWed, 11 Apr 2012 02:38:00 GMThttp://m.shnenglu.com/finehai/archive/2012/04/11/170868.htmlhttp://m.shnenglu.com/finehai/comments/170868.htmlhttp://m.shnenglu.com/finehai/archive/2012/04/11/170868.html#Feedback0http://m.shnenglu.com/finehai/comments/commentRss/170868.htmlhttp://m.shnenglu.com/finehai/services/trackbacks/170868.html

涓銆乄ebKit綆浠?/strong>


WebKit 鏄竴涓紑婧愮殑嫻忚鍣ㄧ綉欏墊帓鐗堝紩鎿庯紝鍖呭惈WebCore鎺掔増寮曟搸鍜孞SCore寮曟搸銆俉ebCore鍜孞SCore寮曟搸鏉ヨ嚜浜嶬DE欏圭洰鐨凨HTML鍜? KJS寮婧愰」鐩侫ndroid騫沖彴鐨刉eb寮曟搸妗嗘灦閲囩敤浜哤ebKit欏圭洰涓殑WebCore鍜孞SCore閮ㄥ垎錛屼笂灞傜敱Java璇█灝佽錛屽茍涓斾綔涓? API鎻愪緵緇橝ndroid搴旂敤寮鍙戣咃紝鑰屽簳灞備嬌鐢╓ebKit鏍稿績搴擄紙WebCore鍜孞SCore錛夎繘琛岀綉欏墊帓鐗堛?


浜屻乄ebKit鐩綍緇撴瀯


Android騫沖彴鐨刉ebKit妯″潡鍒嗘垚Java鍜學ebKit搴撲袱涓儴鍒嗭紝鍏剁洰褰曠粨鏋勫涓嬭〃鎵紺猴細

Webkit 鏌愬潡鐩綍緇撴瀯
Java灞傦紙鏍圭洰褰昫evice\java\android\android\webkit錛?/strong>
BrowserFrame.java BrowserFrame瀵硅薄鏄WebCore搴撲腑鐨凢rame瀵硅薄鐨刯ava灞傚皝瑁咃紝鐢ㄤ簬鍒涘緩WebCore涓畾涔夌殑Frame錛屼互鍙婁負璇rame瀵硅薄鎻愪緵Java灞傚洖璋冩柟娉曘?/span>
ByteArrayBuilder.java ByteArrayBuilder杈呭姪瀵硅薄錛岀敤浜巄yte鍧楅摼琛ㄧ殑澶勭悊銆?/span>
CacheLoader.java URL Cache杞藉叆鍣ㄥ璞★紝璇ュ璞″疄鐜癝teadLoader鎶借薄鍩虹被錛岀敤浜庨氳繃CacheResult瀵硅薄杞藉叆鍐呭鏁版嵁銆?/span>
CacheManager.java Cache綆$悊瀵硅薄錛岀敤浜巎ava灞俢ache瀵硅薄綆$悊銆?/span>
CacheSyncManger.java Cache鍚屾綆$悊瀵硅薄錛岃礋璐e悓姝AM鍜孎LASH涔嬮棿鐨勬祻瑙堝櫒Cache鏁版嵁銆傚疄闄呯殑鐗╃悊鏁版嵁鎿嶄綔鍦╓ebSyncManager瀵硅薄涓畬鎴愩?/span>
CallbackProxy.java 璇ュ璞$敤浜庡鐞哤ebCore涓嶶I綰跨▼娑堟伅浠g悊綾匯傚綋鏈塛eb浜嬩歡浜х敓鏃禬ebCore綰跨▼浼氳皟鐢ㄨ鍥炶皟浠g悊綾伙紝浠g悊綾婚氳繃娑堟伅鏂瑰紡閫氱煡UI綰跨▼錛屽茍涓旇皟鐢ㄨ緗殑瀹㈡埛瀵硅薄鐨勫洖璋冨嚱鏁般?/span>
CellList.java CellList瀹氫箟鍥劇墖闆嗗悎涓殑Cell錛岀鐞咰ell鍥劇墖鐨勭粯鍒訛紝鐘舵佹敼鍙樹互鍙婄儲寮曘?/span>
CookieManager.java 鏍規嵁RFC2109瑙勮寖錛岀鐞哻ookies.
DataLoader.java 鏁版嵁杞藉叆鍣ㄥ璞★紝鐢ㄤ簬杞藉叆緗戦〉鏁版嵁銆?/span>
DataSorter.java 灝氭湭浣跨敤銆?/span>
DownloadListener.java 涓嬭澆渚﹀惉鍣ㄦ帴鍙c?/span>
DownloadManagerCore.java 涓嬭澆綆$悊鍣ㄥ璞★紝綆$悊涓嬭澆鍒楄〃銆傝瀵硅薄榪愯浜嶹ebKit鐨勭嚎紼嬩腑錛岄氳繃CallbackProxy瀵硅薄涓嶶I綰跨▼浜や簰銆?/span>
FileLoader.java 鏂囦歡杞藉叆鍣紝鐢ㄤ簬灝嗘枃浠惰澆鍏ュ埌Frame涓?/span>
FrameLoader.java Frame杞藉叆鍣紝鐢ㄤ簬杞藉叆緗戦〉Frame鏁版嵁銆?/span>
HttpAuthHandler.java Http璁よ瘉澶勭悊瀵硅薄錛岃瀵硅薄浼氫綔涓哄弬鏁頒紶閫掔粰BrowserCallback.displayHttpAuthDialog鏂規硶錛屼笌鐢ㄦ埛浜や簰銆?/span>
HttpDataTime.java 璇ュ璞℃槸澶勭悊HTTP鏃ユ湡鐨勮緟鍔╁璞°?/span>
JsConfirmResult.java Js紜璇鋒眰瀵硅薄銆?/span>
JsPromptResult.java Js緇撴灉鎻愮ず瀵硅薄錛岀敤浜庡悜鐢ㄦ埛鎻愮ずJavascript榪愯緇撴灉銆?/span>
JsResult.java Js緇撴灉瀵硅薄錛岀敤浜庣敤鎴蜂氦浜掋?/span>
JWebCoreJavaBridge.java 鐢↗ava涓嶹ebCore搴撲腑鐨凾imer鍜孋ookies瀵硅薄浜や簰鐨勬ˉ鎺ヤ唬鐮併?/span>
LoaderListener.java 杞藉叆渚﹀惉鍣紝鐢ㄤ簬澶勭悊杞藉叆鍣ㄤ睛鍚秷鎭?/span>
NetWork.java 璇ュ璞″皝瑁呯綉緇滆繛鎺ラ昏緫錛屼負璋冪敤鑰呮彁渚涙洿楂樼駭鐨勭綉緇滆繛鎺ユ帴鍙c?/span>
PanZoom.java 鐢ㄤ簬澶勭悊鍥劇墖緙╂斁銆佺Щ鍔ㄧ瓑鎿嶄綔銆?/span>
PanZoomCellList.java 鐢ㄤ簬淇濆瓨銆佺緝鏀懼浘鐗囩殑Cell銆?/span>
PerfChecker.java 鐢ㄤ簬鏁堢巼嫻嬭瘯鐨勫姛鑳藉璞★紵錛燂紵錛?/span>
SslErrorHandler.java 鐢ㄤ簬澶勭悊SSL閿欒娑堟伅銆?/span>
StreamLoader.java StreamLoader鎶借薄綾繪槸鎵鏈夊唴瀹硅澆鍏ュ櫒瀵硅薄鐨勫熀綾匯傝綾繪槸閫氳繃娑堟伅鏂瑰紡鎺у埗鐨勭姸鎬佹満錛岀敤浜庡皢鏁版嵁杞藉叆鍒癋rame涓?/span>
TextDialog.java 鐢ㄤ簬澶勭悊html涓枃鏈尯鍩熷彔鍔犳儏鍐碉紝鍙互浣跨敤鏍囧噯鐨勬枃鏈紪杈戣屽畾涔夌殑鐗規畩鐨凟ditText鎺т歡銆?/span>
URLUtil.java URL澶勭悊鍔熻兘鍑芥暟錛岀敤浜庣紪鐮併佽В鐮乁RL瀛楃涓詫紝浠ュ強鎻愪緵闄勫姞鐨刄RL綾誨瀷鍒嗘瀽鍔熻兘銆?/span>
WebBackForwardList.java 璇ュ璞″寘鍚玏ebView瀵硅薄涓樉紺虹殑鍘嗗彶鏁版嵁銆?/span>
WebBackForwardListClient.java 嫻忚鍘嗗彶澶勭悊鐨勫鎴鋒帴鍙g被錛屾墍鏈夐渶瑕佹帴鏀舵祻瑙堝巻鍙叉敼鍙樼殑綾婚兘闇瑕佸疄鐜拌鎺ュ彛銆?/span>
WebChromeClient.java Chrome瀹㈡埛鍩虹被錛孋hrome瀹㈡埛瀵硅薄鍦ㄦ祻瑙堝櫒鏂囨。鏍囬銆佽繘搴︽潯銆佸浘鏍囨敼鍙樻椂浼氬緱鍒伴氱煡銆?/span>
WebHistoryItem.java 璇ュ璞$敤浜庝繚瀛樹竴鏉$綉欏靛巻鍙叉暟鎹?/span>
WebIconDataBase.java 鍥炬爣鏁版嵁搴撶鐞嗗璞★紝鎵鏈夌殑WebView鍧囪姹傜浉鍚岀殑鍥炬爣鏁版嵁搴撳璞°?/span>
WebSettings.java WebView鐨勭鐞嗚緗暟鎹紝璇ュ璞℃暟鎹槸閫氳繃JNI鎺ュ彛浠庡簳灞傝幏鍙栥?/span>
WebSyncManager.java 鏁版嵁鍚屾瀵硅薄錛岀敤浜嶳AM鏁版嵁鍜孎lash鏁版嵁鐨勫悓姝ャ?/span>
WebView.java Web瑙嗗浘瀵硅薄錛岀敤浜庡熀鏈殑緗戦〉鏁版嵁杞藉叆銆佹樉紺虹瓑UI鎿嶄綔銆?/span>
WebViewClient.java Web瑙嗗浘瀹㈡埛瀵硅薄錛屽湪Web瑙嗗浘涓湁浜嬩歡浜х敓鏃訛紝璇ュ璞″彲浠ヨ幏寰楅氱煡銆?/span>
WebViewCore.java 璇ュ璞″WebCore搴撹繘琛屼簡灝佽錛屽皢UI綰跨▼涓殑鏁版嵁璇鋒眰鍙戦佺粰WebCore澶勭悊錛屽茍涓旈氳繃CallbackProxy鐨勬柟寮忥紝閫氳繃娑堟伅閫氱煡UI綰跨▼鏁版嵁澶勭悊緇撴灉銆?/span>
WebViewDatabase.java 璇ュ璞′嬌鐢⊿QLiteDatabase涓篧ebCore妯″潡鎻愪緵鏁版嵁瀛樺彇鎿嶄綔銆?/span>

 


涓夈乄ebKit妯″潡妗嗘灦


Android騫沖彴鐨刉ebkit鏈塲ava灞傚拰webkit搴撲袱閮ㄥ垎緇勬垚錛宩ava灞傝礋璐d笌android搴旂敤灞傝繘琛岄氫俊錛岃寃ebkit綾誨簱璐熻矗瀹為檯鐨勭綉欏墊帓鐗堝鐞嗐侸ava灞傚拰C搴撲箣闂撮氳繃JNI鍜孊ridge鐩鎬簰璋冪敤錛屽涓嬪浘鎵紺猴細

java-webkit

 

3.1 java灞傛鏋?/strong>

3.1.1 涓昏綾誨叧緋?/strong>

      WebKit妯″潡鐨刯ava灞備竴鍏辯敱41涓枃浠剁粍鎴愶紝鍏朵腑涓昏鐨勭被鍏崇郴濡備笅鍥炬墍紺猴細

class-relation

 

1. WebView

    WebView綾繪槸WebKit妯″潡Java灞傜殑瑙嗗浘綾伙紝鎵鏈夐渶瑕佷嬌鐢╓eb嫻忚鍣ㄥ姛鑳界殑Android閮介渶瑕佸垱寤鴻瑙嗙被瀵硅薄鏄劇ず鍜屽鐞嗚姹傜殑緗戠粶璧勬簮銆? 鐩墠WebKit妯″潡鏀寔HTTP銆丠TTPS銆丗TP浠ュ強javascript璇鋒眰銆俉ebView浣滀負搴旂敤紼嬪簭鐨刄I鎺ュ彛錛屼負鐢ㄦ埛鎻愪緵涓緋誨垪鐨勭綉欏墊祻 瑙堛佺敤鎴蜂氦浜掓帴鍙o紝瀹㈡埛紼嬪簭閫氳繃榪欎簺鎺ュ彛璁塊棶WebKit鏍稿績浠g爜銆?/span>

2. WebViewDatabase

    WebViewDatabase鏄疻ebKit妯″潡閽堝SQLiteDatabase瀵硅薄鐨勫皝瑁咃紝鐢ㄤ簬瀛樺偍鍜岃幏鍙栬繍琛屾椂嫻忚鍣ㄤ繚瀛樼殑緙撳啿鏁版嵁銆佸巻鍙茶闂暟 鎹佹祻瑙堝櫒閰嶇疆鏁版嵁絳夈傝瀵硅薄鏄釜鍗曞疄渚嬪璞★紝閫氳繃getInstance鏂規硶鑾峰彇WebViewDatabase鐨勫疄渚嬨? WebViewDatabase鏄疻ebKit妯″潡涓殑鍐呴儴瀵硅薄錛屼粎渚沇ebKit妗嗘灦鍐呴儴浣跨敤銆?/span>

3. WebViewCore

    WebViewCore綾繪槸java灞傚拰C灞俉ebKit鏍稿績搴撶殑浜や簰綾伙紝瀹㈡埛紼嬪簭璋冪敤WebView鐨勭綉欏墊祻瑙堢浉鍏蟲搷浣滀細杞彂緇? BrowserFrame瀵硅薄銆傚綋WebKit鏍稿績搴撳畬鎴愬疄闄呯殑鏁版嵁鍒嗘瀽鍜屽鐞嗗悗浼氬洖璋僕ebViewCore涓畾涔夌殑涓緋誨垪JNI鎺ュ彛錛岃繖浜涙帴鍙d細閫氳繃 CallbackProxy灝嗙浉鍏充簨浠墮氱煡鐩稿簲鐨刄I瀵硅薄銆?/span>

4. CallbackProxy

     CallbackProxy鏄竴涓唬鐞嗙被錛岀敤浜嶶I綰跨▼鍜學ebCore綰跨▼浜や簰銆傝綾誨畾涔変簡涓緋誨垪涓庣敤鎴風浉鍏崇殑閫氱煡鏂規硶錛屽綋WebCore瀹屾垚鐩稿簲鐨勬暟 鎹鐞嗭紝鍒欎細璋冪敤CallbackProxy綾諱腑瀵瑰簲鐨勬柟娉曪紝榪欎簺鏂規硶閫氳繃娑堟伅鏂瑰紡闂存帴璋冪敤鐩稿簲鐨勫鐞嗗璞$殑澶勭悊鏂規硶銆傝緇嗙殑澶勭悊嫻佺▼鍦ㄤ笅鏂囦腑浼氬叿浣撳垎 鏋愩?/span>

5. BrowserFrame

     BrowserFrame綾昏礋璐RL璧勬簮鐨勮澆鍏ャ佽闂巻鍙茬殑緇存姢銆佹暟鎹紦瀛樼瓑鎿嶄綔錛岃綾婚氳繃JNI鎺ュ彛鐩存帴涓嶹ebKit鐨凜搴撲氦浜掋?/span>

6. JWebCoreJavaBridge

      璇ョ被涓簀ava灞俉ebkit浠g爜鎻愪緵涓嶤灞俉ebKit鏍稿績閮ㄥ垎鐨凾imer鍜孋ookies鎿嶄綔鐩稿叧鐨勬柟娉曘?/span>

7. DownloadManagerCore

    涓嬭澆綆$悊鏍稿績綾伙紝璇ョ被璐熻矗綆$悊緗戠粶璧勬簮涓嬭澆錛屾墍鏈塛eb涓嬭澆鎿嶄綔鍧囩敱璇ョ被緇熶竴綆$悊銆傝綾誨疄渚嬭繍琛屽湪WebKit綰跨▼褰撲腑錛屼笌UI綰跨▼鐨勪氦浜掓槸閫氳繃璋冪敤CallbackProxy瀵硅薄涓浉搴旂殑鏂規硶瀹屾垚銆?/span>

8. WebSettings

    WEB嫻忚鍣ㄩ氳繃璇ュ璞¤闂浉鍏崇殑鐢ㄦ埛閰嶇疆淇℃伅銆?/span>

9. DownloadListener

    涓嬭澆渚﹀惉鎺ュ彛錛屽鏋滅敤鎴蜂唬鐮佸疄鐜拌鎺ュ彛錛屽垯鍦ㄤ笅杞藉紑濮嬨佸け璐ャ佹寕璧楓佸畬鎴愮瓑鎯呭喌涓嬶紝DownloadManagerCore瀵硅薄浼氳皟鐢ㄥ鎴蜂唬鐮佷腑瀹炵幇鐨凞ownloadListener鏂規硶銆?/span>

10. WebBackForwardList

    WebBackForwardList 瀵硅薄緇存姢鐢ㄦ埛璁塊棶鍘嗗彶璁板綍錛岃綾諱負瀹㈡埛紼嬪簭鎻愪緵鎿嶄綔璁塊棶嫻忚鍣ㄥ巻鍙叉暟鎹殑鐩稿叧鏂規硶銆?/span>

11. WebViewClient

    WebViewClient綾誨畾涔変簡涓緋誨垪浜嬩歡鏂規硶錛屽鏋渁ndroid搴旂敤紼嬪簭璁劇疆浜哤ebVieClient媧劇敓瀵硅薄錛屽垯鍦ㄧ綉欏佃澆鍏ャ佽祫婧愯澆鍏ャ侀〉闈㈣闂敊璇瓑鎯呭喌鍙戠敓鏃訛紝璇ユ淳鐢熷璞$殑鐩稿簲鏂規硶浼氳璋冪敤銆?/span>

12. WebBackForwardListClient

    WebBackForwardListClient瀵硅薄瀹氫箟浜嗗璁塊棶鍘嗗彶鎿嶄綔鏃跺彲鑳戒駭鐢熺殑浜嬩歡鎺ュ彛錛屽綋鐢ㄦ埛瀹炵幇璇ユ帴鍙o紝鍒欏湪鎿嶄綔璁塊棶鍘嗗彶鏃訛紙璁塊棶鍘嗗彶縐婚櫎銆佽闂巻鍙?娓呯┖絳夛級鐢ㄦ埛浼氬緱鍒伴氱煡銆?/span>

13. WebChromeClient

    WebChromeClient綾誨畾涔変簡涓庢祻瑙堝櫒紿楀彛淇グ鐩稿叧鐨勪簨浠躲備緥濡傛帴鏀跺埌Title銆佹帴鏀跺埌Icon銆佽繘搴﹀彉鍖栨椂錛學ebChromeClient鐨勭浉搴旀柟娉曚細琚皟鐢ㄣ?/span>

 

3.1.2 涓昏綾葷殑璁捐

3.1.2.1 鏁版嵁杞藉叆鍣ㄧ殑璁捐

    WebKit妯″潡鐨刯ava閮ㄥ垎妗嗘灦涓嬌鐢ㄦ暟鎹澆鍏ュ櫒鏉ュ姞杞界浉搴旂被鍨嬬殑鏁版嵁錛岀洰鍓嶆湁CacheLoader銆丏ataLoader浠ュ強 FileLoader涓夌被杞藉叆鍣紝浠栦滑鍒嗗埆鐢ㄤ簬緙撳瓨鏁版嵁銆佸唴瀛樻暟鎹佸拰鏂囦歡鏁版嵁鐨勮澆鍏ユ搷浣溿俲ava灞傦紙WebKit妯″潡錛夋墍鏈夌殑杞藉叆鍣ㄩ兘浠? StreamLoader緇ф壙錛堝叾鐖剁被涓篐andler錛夛紝鐢變簬SteamLoader 綾葷殑鍩虹被涓篐andler綾伙紝鍥犳鍦ㄦ瀯寤鴻澆鍏ュ櫒鏃訛紝浼氬紑鍚竴涓簨浠跺鐞嗙嚎紼嬶紝璇ョ嚎紼嬭礋璐e疄闄呯殑鏁版嵁杞藉叆鎿嶄綔錛岃岃姹傜嚎紼嬮氳繃娑堟伅鐨勬柟寮忛┍鍔ㄦ暟鎹殑杞藉叆銆備笅 鍥炬槸鏁版嵁杞藉叆鍣ㄧ浉鍏崇被鐨勭被鍥劇粨鏋勶細

loader

    StreamLoader綾誨畾涔変簡4涓笉鍚岀殑娑堟伅錛?/span>

MSG_STATUS銆丮SG_HEADERS銆丮SG_DATA銆丮SG_END

    鍒嗗埆琛ㄧず鍙戦佺姸鎬佷俊鎭佸彂閫佹秷鎭ご娑堟伅銆佸彂閫佹暟鎹秷鎭互鍙婃暟鎹彂閫佸畬姣曟秷鎭傝綾繪彁渚涗簡2涓娊璞′繚鎶ゆ柟娉曚互鍙婁竴涓叕鏈夋柟 娉曪細setupStreamAndSendStatus 淇濇姢鏂規硶涓昏鏄敤浜庢瀯寤轟笌閫氫俊鍗忚鐩稿叧鐨勬暟鎹祦錛屼互鍙婂悜LoadListener鍙戦佺姸鎬併? buildHeaders鏂規硶鏄悜瀛愮被鎻愪緵鏋勯犵壒瀹氬崗璁秷鎭ご鍔熻兘銆傛墍鏈夎澆鍏ュ櫒鍙湁涓涓叕鏈夋柟娉曪紙load錛夛紝鍥犳褰撻渶瑕佽澆鍏ユ暟鎹椂錛岃皟鐢ㄨ鏂規硶鍗沖彲銆備笌 鏁版嵁杞藉叆嫻佺▼鐩稿叧鐨勭被榪樻湁LoaderListener浠ュ強BrowserFrame錛屽綋鏁版嵁杞藉叆浜嬩歡鍙戠敓鏃訛紝WebKit鐨凜搴撲細鏇存柊杞藉叆榪涘害錛屽茍涓斾細 閫氱煡BrwoserFrame錛孊rowserFrame鎺ユ敹鍒拌繘搴︽潯鍙樻洿浜嬩歡鍚庨氳繃CallbackProxy瀵硅薄錛岄氱煡View綾昏繘搴︽潯鏁版嵁鍙樻洿銆備笅 涔頒綘浠ataLoader綾諱負渚嬪瓙錛岃鏄庢暟鎹澆鍏ヤ互鍙婁笌UI浜や簰榪囩▼錛堣漿杞借呮敞錛氫笅鍥劇湅涓嶆竻錛岀瓑鎴戞悶娓呮榪欎釜嫻佺▼涔嬪悗鎴戝啀鐢諱竴涓崲涓娿傦級錛?/span>

dataLoader

    涓婂浘涓豢鑹查儴鍒嗘槸BrowserFrame澶勭悊榪涘害鍙樻洿浜嬩歡鏃訛紝璋冪敤CallbackProxy瀵硅薄閫氱煡瑙嗗浘鍙樻洿鐘舵佺殑鎿嶄綔錛屽湪榪欓噷鐪佺暐銆傚浘涓伆鑹查儴鍒嗚〃紺篊灞備唬鐮侊紝鑰岀櫧鑹查儴鍒嗚〃紺篔ava灞備唬鐮併?/span>

 

3.2 C灞傛鏋?/strong>

3.2.1 C綾諱笌Java綾葷殑鍏崇郴

1. BrowserFrame

    涓嶣rowserFrame Java綾葷浉瀵瑰簲鐨凜++綾諱負FrameBridge錛岃綾誨Dalvik铏氭嫙鏈哄洖璋傿rowserFrame綾諱腑瀹氫箟鐨勬湰鍦版柟娉曡繘琛屼簡灝佽銆備笌BrowserFrame涓洖璋冨嚱鏁幫紙java灞傦級鐩稿搴旂殑C灞傜粨鏋勫畾涔夊涓嬶細

struct FrameBridge::JavaBrowserFrame
{
JavaVM* mJVM;
jobject mObj;
jmethodID mStartLoadingResource;
jmethodID mLoadStarted;
jmethodID mUpdateHistoryForCommit;
jmethodID mUpdateCurrentHistoryData;
jmethodID mReportError;
jmethodID setTitle;
jmethodID mWindowObjectCleared;
jmethodID mDidReceiveIcon;
jmethodID mUpdateVisiteHistory;
jmethodID mHandleUrl;
jmethodID mCreateWindow;
jmethodID mCloseWindow;
jmethodID mDecidePolicyForFormResubmission;
};
    璇ョ粨鏋勪綔涓篎rameBridge錛圕 灞傦級鐨勪竴涓垚鍛樺彉閲忥紙mJavaFrame錛夛紝鍦‵rameBridge鏋勯犲嚱鏁頒腑錛岀敤BrowserFrame錛坖ava 灞傦級綾葷殑鍥炶皟鏂規硶鐨勫亸縐婚噺鍒濆鍖朖avaBrowserFrame緇撴瀯鐨勫悇涓煙銆傚垵濮嬪悗錛屽綋WebCore錛圕灞傦級鍦ㄥ墫鏋愮綉欏墊暟鎹椂錛屾湁Frame鐩稿叧鐨? 璧勬簮鏀瑰彉錛屾瘮濡俉EB欏甸潰鐨勪富棰樺彉鍖栵紝鍒欎細閫氳繃mJavaFrame緇撴瀯錛岃皟鐢ㄦ寚瀹欱rowserFrame瀵硅薄鐨勭浉搴旀柟娉曪紝閫氱煡Java灞傚鐞嗐?/span>
2. JWebCoreJavaBridge
    涓庤瀵硅薄鐩稿搴旂殑C灞傚璞′負JavaBridge錛宩avaBridge瀵硅薄緇ф壙浜員imerClient鍜孋ookieClient綾伙紝璐熻矗 WebCore涓殑瀹氭椂鍣ㄥ拰Cookie綆$悊銆備笌Java灞侸WebCoreJavaBridge綾諱腑鏂規硶鍋忕Щ閲忕浉鍏崇殑鏄疛avaBridge涓嚑涓垚鍛? 鍙橀噺錛屽湪鏋勯燡avaBridge瀵硅薄鏃訛紝浼氬垵濮嬪寲榪欎簺鎴愬憳鍙橀噺錛屼箣鍚庢湁Timer鎴栬匔ookies浜嬩歡浜х敓鏃訛紝WebCore浼氶氳繃榪欎簺ID鍊鹼紝鍥炶皟 瀵瑰簲JWebCoreJavaBridge鐨勭浉搴旀柟娉曘?/span>
3. LoadListener
    涓庤瀵硅薄鐩稿叧鐨凜灞傜粨鏋勬槸 struct resourceloader_t, 璇ョ粨鏋勪繚瀛樹簡LoadListener瀵硅薄ID銆丆ancelMethod ID浠ュ強DownloadFileMethod ID鍊箋傚綋鏈塁ancel鎴栬匘ownload浜嬩歡浜х敓錛學ebCore浼氬洖璋僉oadListener綾諱腑鐨凜ancelMethod鎴栬? DownloadFileMethod銆?/span>
4. WebViewCore
    涓嶹ebViewCore鐩稿叧鐨凜綾繪槸WebCoreViewImpl錛? WebViewCoreImpl綾繪湁涓狫avaGlue瀵硅薄浣滀負鎴愬憳鍙橀噺錛屽湪鏋勫緩WebCoreViewImpl瀵硅薄鏃訛紝鐢? WebViewCore錛坖ava灞傦級涓殑鏂規硶ID鍊煎垵濮嬪寲璇ユ垚鍛樺彉閲忋傚茍涓斿皢鏋勫緩鐨刉ebCoreViewImpl瀵硅薄鎸囬拡璧嬪肩粰 WebViewCore錛坖ava灞傦級鐨刴NativeClass,榪欐牱灝哤ebViewCore錛坖ava灞傦級鍜學ebViewCoreImpl錛圕 灞傦級鍏寵仈璧鋒潵銆?/span>
5. WebSettings
    涓嶹ebSettings鐩稿叧鐨凜灞傜粨鏋勬槸struct FieldIds錛岃緇撴瀯淇濆瓨浜哤ebSettings綾諱腑瀹氫箟鐨勫睘鎬D浠ュ強鏂規硶ID錛屽湪WebCore鍒濆鍖栨椂錛圵ebViewCore鐨勯潤鎬佹柟娉曚腑 浣跨敤System.loadLibrary杞藉叆錛変細璁劇疆榪欎簺鏂規硶鍜屽睘鎬х殑ID鍊箋?/span>
6. WebView
    涓嶹ebView鐩稿叧鐨凜灞傜被鏄疻ebViewNative錛岃綾諱腑鐨刴JavaGlue涓繚瀛樹簡WebView涓畾涔夌殑灞炴у拰鏂規硶ID錛屽湪 WebViewNative鏋勯犳柟娉曚腑鍒濆鍖栵紝騫朵笖灝嗘瀯閫犵殑WebViewNative瀵硅薄鐨勬寚閽堬紝璧嬪肩粰WebView綾葷殑mNativeClass鍙? 閲忥紝榪欐牱WebView鍜學ebViewNative瀵硅薄灝卞緩绔嬩簡鍏崇郴銆?/span>
 
3.2.2 涓昏綾誨叧緋?/span>
    涓巎ava灞傜浉鍏崇殑C灞傜被濡備笅琛ㄦ墍紺猴細
ChromeClientAndroid 璇?綾諱富瑕佸鐞哤ebCore涓笌Frame瑁呴グ鐩稿叧鐨勬搷浣溿備緥濡傝緗姸鎬佹爮銆佹粴鍔ㄦ潯銆? Javascript鑴氭湰鎻愮ず妗嗙瓑銆傚綋嫻忚鍣ㄤ腑鏈夊叧浜嬩歡浜х敓鏃訛紝ChromeClientAndroid綾葷殑鐩稿簲鏂規硶浼氳璋冪敤錛岃綾諱細灝嗙浉鍏崇殑UI浜嬩歡閫? 榪嘊ridge浼犻掔粰Java灞傦紝鐢盝ava灞傝礋璐g粯鍒朵互鍙婄敤鎴蜂氦浜掓柟闈㈢殑澶勭悊銆?/span>
EditorClientAndroid 璇ョ被璐熻矗澶勭悊欏甸潰涓枃鏈浉鍏崇殑澶勭悊錛屾瘮濡傛枃鏈緭鍏ャ佸彇娑堛佽緭鍏ユ硶鏁版嵁澶勭悊銆佹枃鏈矘璐淬佹枃鏈紪杈戠瓑鎿嶄綔銆備笉榪囩洰鍓嶈綾誨彧瀵規寜閿浉鍏崇殑浜嬩歡榪涜浜嗗鐞嗭紝鍏朵粬鎿嶄綔鍧囨湭鏀寔銆?/span>
ContextMenuClient 璇ョ被鎻愪緵欏甸潰鐩稿叧鐨勫姛鑳借彍鍗曘傛瘮濡傚浘鐗囨嫹璐濄佹湕璇匯佹煡鎵劇瓑鍔熻兘銆備絾鏄紝鐩墠欏圭洰涓湭瀹炵幇鍏蜂綋鍔熻兘銆?/span>
DragClient 璇ョ被瀹氫箟浜嗕笌欏甸潰鎷栨嫿鐩稿叧鐨勫鐞嗭紝浣嗘槸鐩墠璇ョ被娌℃湁瀹炵幇鍏蜂綋鍔熻兘銆?/span>
FrameLoaderClientAndroid 璇ョ被鎻愪緵涓嶧rame鍔犺澆鐩稿叧鐨勬搷浣滐紝褰撶敤鎴瘋姹傚姞杞戒竴涓〉闈㈡椂錛學ebCore鍒嗘瀽瀹岀綉欏墊暟鎹悗錛屼細閫氳繃璇ョ被璋冪敤Java灞傜殑鍥炶皟鏂規硶錛岄氱煡UI鐩稿叧鐨勭粍浠跺鐞嗐?/span>
InspectorClientAndroid 璇ョ被鎻愪緵涓庣獥鍙g浉鍏崇殑鎿嶄綔錛屾瘮濡傜獥鍙f樉紺恒佸叧闂獥鍙c侀檮鍔犵獥鍙g瓑銆備笉榪囩洰鍓嶈綾葷殑鍚勪釜鏂規硶鍧囦負絀哄疄鐜般?/span>
Page 璇ョ被鎻愪緵涓庨〉闈㈢浉鍏崇殑鎿嶄綔錛屾瘮濡傜綉欏甸〉闈㈢殑鍓嶈繘銆佸悗閫絳夋搷浣溿?/span>
FrameBridge 璇ョ被瀵笷rame鐩稿叧鐨凧ava灞傛柟娉曡繘琛屼簡灝佽錛屽綋鏈塅rame浜嬩歡浜х敓鏃訛紝WebCore閫氳繃FrameBridge鍥炶皟Java鐨勫洖璋冨嚱鏁幫紝瀹屾垚鐢ㄦ埛浜や簰榪囩▼銆?/span>
AssetManager 璇ョ被涓烘祻瑙堝櫒鎻愪緵鏈湴璧勬簮璁塊棶鍔熻兘銆?/span>
RenderSkinAndroid 璇ョ被涓庢帶浠剁粯鍒剁浉鍏籌紝鎵鏈夌殑緇樺埗鎺т歡綾婚兘闇瑕佷粠璇ョ被媧劇敓錛岀洰鍓峎ebKit妯″潡涓湁Button銆丆ombo銆丷adio涓夌被鎺т歡銆?/span>

浠ヤ笂鍑犱釜綾諱細鍦↗ava灞傝姹傚垱寤篧ebFrame鐨勬椂鍊欒寤虹珛錛屼粬浠殑鍏崇郴濡備笅鍥炬墍紺猴細

webFrame

涓?鍥句腑鏍囨敞涓烘繁緇胯壊鐨凢rameAndroid鏄祻瑙堝櫒Frame錛屼竴涓狟rowserFrame瀵硅薄瀵瑰簲鐫涓涓狥rameAndroid瀵硅薄銆傝? 鍏朵粬8涓爣娉ㄤ負娣$豢鑹茬殑綾伙紝鏄笌璇rame鏄劇ず銆佸竷灞絳夌浉鍏崇殑綾匯俉ebKit妯″潡涓墍鏈塛ebCore鏍稿績浠g爜涓庣敤鎴蜂氦浜掔殑鎿嶄綔浣跨敤 FrameAndroid瀵硅薄涓殑Briedge澶勭悊錛堝洖璋冪浉搴旂殑Java鏂規硶錛夈?/span>

 


鍥涖佸熀鏈搷浣滃垎鏋?/strong>


4.1 WebKit妯″潡鍒濆鍖?/strong>

    Android SDK涓彁渚涗簡WebView綾伙紝璇ョ被涓哄鎴鋒彁渚涘鎴峰寲嫻忚鏄劇ず鐨勫姛鑳斤紝濡傛灉瀹㈡埛闇瑕佸姞鍏ユ祻瑙堝櫒鏀寔錛屽彲灝嗚綾葷殑瀹炰緥鎴栬呮淳鐢熺被鐨勫疄渚嬩綔涓鴻鍥撅紝璋冪敤 Activity綾葷殑SetContentView鏄劇ず緇欑敤鎴楓傚綋瀹㈡埛浠g爜涓涓嬈$敓鎴怶ebView瀵硅薄鏃訛紝浼氬垵濮嬪寲WebKit搴擄紙鍖呮嫭Java灞傚拰 C灞備袱涓儴鍒嗭級錛屼箣鍚庣敤鎴峰彲浠ユ搷浣淲ebView瀵硅薄瀹屾垚緗戠粶鎴栬呮湰鍦拌祫婧愮殑璁塊棶銆?/span>

    WebView瀵硅薄鐨勭敓鎴愪富瑕佹秹鍙?涓被CallbackProxy銆乄ebViewCore浠ュ強WebViewDatabase銆傚叾涓? CallbackProxy瀵硅薄涓篧ebKit妯″潡涓璘I綰跨▼鍜學ebKit綾誨簱鎻愪緵浜や簰鍔熻兘錛學ebViewCore鏄疻ebKit鐨勬牳蹇冨眰錛岃礋璐d笌C 灞備氦浜掍互鍙奧ebKit妯″潡C灞傜被搴撳垵濮嬪寲錛岃學ebViewDatabase涓篧ebKit妯″潡榪愯鏃剁紦瀛樸佹暟鎹瓨鍌ㄦ彁渚涙敮鎸併俉ebKit妯″潡鍒濆鍖? 嫻佺▼濡備笅錛?/span>

 

WebView

      • +- 鍒涘緩CallbackProxy瀵硅薄
      • +- 鍒涘緩WebViewCore瀵硅薄
          1. 璋冪敤System.loadLibrary杞藉叆webcore綾葷浉鍏沖簱錛圕灞傦級
          2. 濡傛灉鏄涓嬈″垵濮嬪寲WebViewCore瀵硅薄錛屽垱寤篧ebCoreThread綰跨▼
          3. 鍒涘緩EventHub瀵硅薄錛屽鐞哤ebViewCore浜嬩歡
          4. 鑾峰彇WebIconDatabase瀵硅薄瀹炰緥
          5. 鍚慦ebCoreThread鍙戦佸垵濮嬪寲娑堟伅
      • +- 鑾峰彇WebViewDatabase瀹炰緥

    濡備笂鎵榪幫紝絎竴姝ヨ皟鐢⊿ystem.loadLIbrary鏂規硶杞藉叆webcore鐩稿叧綾誨簱錛岃榪囩▼鐢盌alvik铏氭嫙鏈哄畬鎴愶紝瀹冧細鍔ㄦ佷粠閾炬帴搴撶洰褰曚腑瀵? 鎵緇ibWebCore.so綾誨簱錛岃澆鍏ュ唴瀛樹腑錛屽茍涓旇皟鐢╓ebKit鍒濆鍖栨ā鍧楃殑JNI_OnLoad鏂規硶銆俉ebKit妯″潡鐨凧NI_OnLoad鏂? 娉曚腑瀹屾垚濡備笅鍒濆鍖栨搷浣滐細

a) 鍒濆鍖杅ramebridge[register_android_webcore_framebridge]

鍒濆鍖杇FrameAndroidField闈欐佸彉閲忥紝浠ュ強娉ㄥ唽BrowserFrame綾諱腑鐨勬湰鍦版柟娉曡〃銆?

b) 鍒濆鍖杍avabridge[register_android_webcore_javabridge]

鍒濆鍖杇JavaBridge.mObject瀵硅薄錛屼互鍙婃敞鍐孞WebCoreJavaBridge綾諱腑鐨勬湰鍦版柟娉?

c) 鍒濆鍖栬祫婧恖oader[register_android_webcore_resource_loader]

鍒濆鍖杇ResourceLoader闈欐佸彉閲忥紝浠ュ強娉ㄥ唽LoadListener綾葷殑鏈湴鏂規硶

d) 鍒濆鍖杦ebviewcore[register_android_webkit_webviewcore]

鍒濆鍖杇WebCoreViewImplField闈欐佸彉閲忥紝浠ュ強娉ㄥ唽WebViewCore綾葷殑鏈湴鏂規硶

e) 鍒濆鍖杦ebhistory[register_android_webkit_webhistory]

鍒濆鍖杇WebHistoryItem緇撴瀯錛屼互鍙婃敞鍐學ebBackForwardList鍜學ebHistoryItem綾葷殑鏈湴鏂規硶

f) 鍒濆鍖杦ebicondatabase[register_android_webkit_webicondatabase]

娉ㄥ唽WebIconDatabase綾葷殑鏈湴鏂規硶

g) 鍒濆鍖杦ebsettings[register_android_webkit_websettings]

鍒濆鍖杇FieldIds闈欐佸彉閲忥紝浠ュ強娉ㄥ唽WebSettings綾葷殑鏈湴鏂規硶

h) 鍒濆鍖杦ebview[register_android_webkit_webview]

鍒濆鍖杇WebViewNativeField闈欐佸彉閲忥紝浠ュ強娉ㄥ唽WebView綾葷殑鏈湴鏂規硶

    絎簩姝ユ槸WebCoreThread鍒濆鍖栵紝璇ュ垵濮嬪寲鍙湪絎竴嬈″垱寤篧ebViewCore瀵硅薄鏃跺畬鎴愶紝褰撶敤鎴蜂唬鐮佺涓嬈$敓鎴怶ebView瀵硅薄錛屼細鍦ㄥ垵 濮嬪寲WebViewCore綾繪椂鍒涘緩WebCoreThread綰跨▼錛岃綰跨▼璐熻矗澶勭悊WebCore鍒濆鍖栦簨浠躲傛鏃禬ebViewCore鏋勯犲嚱鏁頒細琚? 闃誨錛岀洿鍒頒竴涓猈ebView鍒濆鍖栬姹傚畬姣曟椂錛屼細鍦╓ebCoreThread綰跨▼涓敜閱掋?

    絎笁姝ュ垱寤篍ventStub瀵硅薄錛岃瀵硅薄澶勭悊WebView綾葷殑浜嬩歡錛屽綋WebCore鍒濆鍖栧畬鎴愬悗浼氬悜WebView瀵硅薄鍙戦佷簨浠訛紝WebView綾葷殑EventStub瀵硅薄澶勭悊璇ヤ簨浠訛紝騫朵笖瀹屾垚鍚庣畫鍒濆鍖栧伐浣溿?

    絎洓姝ヨ幏鍙朩ebIconDatabase瀵硅薄瀹炰緥銆?

    絎簲姝ュ悜WebViewCore鍙戦両NITIALIZE浜嬩歡錛屽茍涓斿皢this鎸囬拡浣滀負娑堟伅鍐呭浼犻掋俉ebView綾諱富瑕佽礋璐e鐞哢I鐩稿叧鐨勪簨浠訛紝鑰? WebViewCore涓昏璐熻矗涓嶹ebCore搴撲氦浜掋傚湪榪愯鏃舵湡錛孶I綰跨▼鍜學ebCore鏁版嵁澶勭悊綰跨▼鏄繍琛屽湪涓や釜鐙珛鐨勭嚎紼嬪綋涓? WebCoreThread綰跨▼鎺ユ敹鍒癐NITIALIZE綰跨▼鍚庯紝浼氳皟鐢ㄦ秷鎭璞″弬鏁扮殑initialize鏂規硶錛岃屽悗鍞ら啋闃誨鐨? WebViewCore Java綰跨▼錛堣綰跨▼鍦╓ebViewCore鐨勬瀯閫犲嚱鏁頒腑琚樆濉烇級銆備笉鍚岀殑WebView瀵硅薄瀹炰緥鏈変笉鍚岀殑WebViewCore瀵硅薄瀹炰緥錛屽洜姝ら氳繃娑? 鎭殑鏂瑰紡鍙互浣垮緱UI綰跨▼鍜學ebViewCore綰跨▼瑙h﹀悎銆俉ebCoreThread鐨勪簨浠跺鐞嗗嚱鏁幫紝澶勭悊INITIALIZE娑堟伅鏃訛紝璋冪敤鐨勬槸涓? 鍚學ebView涓璚ebViewCore瀹炰緥鐨刬nitialize鏂規硶銆俉ebViewCore綾諱腑鐨刬nitialize鏂規硶涓細鍒涘緩 BrowserFrame瀵硅薄錛堣瀵硅薄綆$悊鏁翠釜WEB紿椾綋錛屼互frame鐩稿叧浜嬩歡錛夛紝騫朵笖鍚慦ebView瀵硅薄鍙戦? WEBCORE_INITIALIZED_MSG_ID娑堟伅銆俉ebView娑堟伅澶勭悊鍑芥暟錛屼細鏍規嵁娑堟伅鍙傛暟1鍒濆鍖栨寚瀹氱殑WebViewCore瀵硅薄錛屽茍 涓旀洿鏂癢ebViewCore鐨凢rame緙撳啿銆?

    鍒濆鍖栬繃紼嬬殑搴忓垪鍥懼涓嬪浘鎵紺猴細

webcore

    鍒濆鍖栧畬鎴愬悗Java灞傚拰C灞傜被鍥懼叧緋誨涓嬪浘鎵紺?

WebView_c

涓婂浘涓貳緇胯壊鐨勭被琛ㄧずJava灞傦紝鑰岀伆鑹茬被琛ㄧずC灞傘?/span>

 

4.2 鏁版嵁杞藉叆

4.2.1 杞藉叆緗戣礬鏁版嵁

    瀹㈡埛浠g爜涓彲浠ヤ嬌鐢╓ebView綾葷殑loadUrl鏂規硶錛岃姹傝闂寚瀹氱殑URL緗戦〉鏁版嵁銆俉ebView瀵硅薄涓繚瀛樼潃WebViewCore鐨勫紩鐢紝鐢? 浜嶹ebView灞炰簬UI綰跨▼錛岃學ebViewCore灞炰簬鍚庡彴綰跨▼錛屽洜姝ebView瀵硅薄鐨刲oadUrl琚皟鐢ㄦ椂錛屼細閫氳繃娑堟伅鐨勬柟寮忓皢URL淇℃伅 浼犻掔粰WebViewCore瀵硅薄錛岃瀵硅薄浼氳皟鐢ㄦ垚鍛樺彉閲弇BrowserFrame鐨刲oadUrl鏂規硶錛岃繘鑰岃皟鐢╓ebKit搴撳畬鎴愭暟鎹殑杞藉叆銆傚叾璋? 鐢ㄥ嚱鏁板簭鍒楀涓嬫墍紺猴細

loadurl

    緗戠粶鏁版嵁鐨勮澆鍏ュ垎鍒敱Java灞傚拰C灞傚叡鍚屽畬鎴愶紝Java灞傚畬鎴愮敤鎴蜂氦浜掋佽祫婧愪笅杞界瓑鎿嶄綔錛岃孋灞備富瑕佸畬鎴愭暟鎹垎鏋愶紙寤虹珛DOM鏍戙佸垎鏋愰〉闈㈠厓绱犵瓑錛夋搷 浣溿傜敱浜嶶I綰跨▼鍜學ebCore綰跨▼榪愯鍦ㄤ笉鍚岀殑涓や釜綰跨▼涓紝鍥犳褰撶敤鎴瘋姹傝闂綉緇滆祫婧愭椂錛岄氳繃娑堟伅鐨勬柟寮忓悜WebViewCore瀵硅薄鍙戦佽澆鍏ヨ祫婧? 璇鋒眰銆傚湪Java灞傜殑WebKit妯″潡涓紝鎵鏈変笌璧勬簮杞藉叆鐩稿叧鐨勬搷浣滈兘鏄敱BrowserFrame綾諱腑瀵瑰簲鐨勬柟娉曞畬鎴愶紝榪欎簺鏂規硶鏄湰鍦版柟娉曪紝浼氱洿鎺ヨ皟鐢? WebCore搴撶殑C灞傚嚱鏁板畬鎴愭暟鎹澆鍏ヨ姹傦紝浠ュ強璧勬簮鍒嗘瀽絳夋搷浣溿傚涓婂浘鎵紺猴紝C灞傜殑FrameLoader綾繪槸嫻忚妗嗘灦鐨勮祫婧愯澆鍏ュ櫒錛岃綾昏礋璐f鏌ヨ 闂瓥鐣ヤ互鍙婂悜Java灞傚彂閫佷笅杞借祫婧愯姹傜瓑鍔熻兘銆傚湪FrameLoader涓紝褰撶敤鎴瘋姹傜綉緇滆祫婧愭椂錛岀粡榪囦竴緋誨垪鐨勭瓥鐣ユ鏌ュ悗浼氳皟鐢? FrameBridge鐨剆tartLoadingResource鏂規硶錛岃鏂規硶浼氬洖璋傿rowserFrame錛圝ava錛夌被鐨? startLoadingResource鏂規硶錛屽畬鎴愮綉緇滄暟鎹殑涓嬭澆錛岃屽悗BrowserFrame錛圝ava錛夌被鐨? startLoadingResource鏂規硶浼氳繑鍥炰竴涓狶oadListener鐨勫璞★紝FrameLoader浼氬垹闄ゅ師鏈夌殑FrameLoader瀵? 璞★紝灝哃oadListener瀵硅薄灝佽鎴怰esourceLoadHandler瀵硅薄錛屽茍涓斿皢鍏惰緗負鏂扮殑FrameLoader銆傚埌姝ゅ畬鎴愪簡涓嬈¤祫婧? 璁塊棶璇鋒眰錛屾帴涓嬫潵鐨勪換鍔″嵆鏄疻ebCore搴撲細鏍規嵁璧勬簮鏁版嵁榪涜鍒嗘瀽鍜屾瀯寤篋OM錛屼互鍙婄浉鍏崇殑鏁版嵁緇撴瀯銆?/span>

 

4.2.2 杞藉叆鏈湴鏁版嵁

鏈?鍦版暟鎹槸浠ata://寮澶寸殑URL琛ㄧず錛岃澆鍏ヨ繃紼嬪拰緗戠粶鏁版嵁涓鏍鳳紝鍙笉榪囧湪鎵цFrameLoader綾葷殑executeLoad鏂規硶鏃訛紝浼? 鏍規嵁URL鐨凷CHEME綾誨瀷鍖哄垎錛岃皟鐢―ataLoader鐨剅equestUrl鏂規硶錛堝弬鐪?.1.2.1鑺傚杞藉叆鍣ㄧ殑鍒嗘瀽錛夛紝鑰屼笉鏄皟鐢? handleHTTPLoad寤虹珛瀹為檯鐨勭綉緇滈氫俊榪炴帴銆?

 

4.2.3 杞藉叆鏂囦歡鏁版嵁

鏂?浠舵暟鎹槸浠ile://寮澶寸殑URL錛岃澆鍏ョ殑鍩烘湰嫻佺▼涓庣綉緇滄暟鎹澆鍏ユ祦紼嬪熀鏈竴鑷達紝涓嶅悓鐨勬槸鍦ㄨ繍琛孎rameLoader綾葷殑 executeLoad鏂規硶鏃訛紝鏍規嵁SCHEME綾誨瀷錛岃皟鐢‵ileLoader鐨剅equestUrl鏂規硶錛屽畬鎴愭暟鎹姞杞斤紙鍙傜湅3.1.2.1鑺傚杞藉叆 鍣ㄧ殑鍒嗘瀽錛夈?

 

4.3 鍒鋒柊緇樺埗

    褰撶敤鎴鋒嫋鍔ㄦ粴鍔ㄦ潯銆佹湁紿楀彛閬洊銆佹垨鑰呮湁欏甸潰浜嬩歡瑙﹀彂閮戒細鍚慦ebViewCore錛圝ava灞傦級瀵硅薄鍙戦佽儗鏅噸緇樻秷鎭紝璇ユ秷鎭細寮曡搗緗戦〉鏁版嵁鐨勭粯鍒舵搷浣溿? WebKit鐨勬暟鎹粯鍒跺彲鑳藉嚭浜庢晥鐜囦笂鐨勮冭檻錛屾病鏈夐氳繃Java灞傦紝鑰屾槸鐩存帴鍦–灞備嬌鐢⊿GL搴撳畬鎴愩備笌Java灞傚浘褰㈢粯鍒剁浉鍏崇殑Java瀵硅薄鏈夊涓嬪嚑 涓細

    1. Picture綾?

璇ョ被瀵筍GL灝佽錛屽叾涓彉閲弇NativePicture瀹為檯涓婃槸淇濆瓨鐫SkPicture瀵硅薄鐨勬寚閽堛俉ebViewCore涓畾涔変簡涓や釜Picture瀵硅薄錛屽綋浣滃弻緙撳啿澶勭悊錛屽湪璋冪敤webKitDraw鏂規硶鏃訛紝浼氫氦鎹袱涓紦鍐插尯錛屽姞閫熷埛鏂伴熷害銆?

    2. WebView綾?

璇?綾繪帴鍙楃敤鎴蜂氦浜掔浉鍏崇殑鎿嶄綔錛屽綋鏈夋粴灞忋佺獥鍙i伄鐩栥佺敤鎴風偣鍑婚〉闈㈡寜閽瓑鐩稿叧鎿嶄綔鏃訛紝WebView瀵硅薄浼氫笌涔嬬浉鍏崇殑WebViewCore 瀵硅薄鍙戦乂IEW_SIZE_CHANGED娑堟伅銆傚綋WebViewCore瀵硅薄鎺ユ敹鍒拌娑堟伅鍚庯紝灝嗘瀯寤烘椂寤虹珛鐨刴ContentPictureB鍒鋒柊鍒? 灞忓箷涓婏紝鐒跺悗灝唌ContentPictureA涓庝箣浜ゆ崲銆?

    3. WebViewCore綾?

璇ョ被灝佽浜哤ebKit C灞備唬鐮侊紝涓鴻鍥劇被鎻愪緵瀵筗ebKit鐨勬搷浣滄帴鍙o紝鎵鏈夊WebKit搴撶殑鐢ㄦ埛璇鋒眰鍧囩敱璇ョ被澶勭悊錛屽茍涓旇綾昏繕涓鴻鍥劇被鎻愪緵浜嗕袱涓狿icture瀵硅薄錛岀敤浜庡浘褰㈡暟鎹埛鏂般?

    涓嬮潰浠eb欏甸潰琚紶鏍囨嫋鎷界殑鎯呭喌涓轟緥瀛愶紝鍒嗘瀽緗戦〉鏁版嵁鍒鋒柊榪囩▼銆?

    褰撶敤鎴蜂嬌鐢ㄦ墜鎸囩偣鍑昏Е鎽稿睆錛屽茍涓旂Щ鍔ㄦ墜鎸囷紝鍒欎細寮曞彂touch浜嬩歡鐨勪駭鐢燂紝Android騫沖彴浼氬皢touch浜嬩歡浼犻掔粰鏈鍓嶇鐨勮鍥劇浉搴? 錛坉ispatchTouchEvent鏂規硶澶勭悊錛夈傚湪WebView綾諱腑瀹氫箟浜?縐峵ouch妯″紡錛屽湪鎵嬫寚鎷栧姩Web欏甸潰鐨勬儏鍐典笅錛屼細瑙﹀彂 mMotionDragMode錛屽茍涓斾細璋冪敤View綾葷殑scrollBy鏂規硶錛岃Е鍙戞粴灞忎簨浠朵互鍙婁嬌瑙嗗浘鏃犳晥錛堥噸緇橈紝浼氳皟鐢╒iew鐨刼nDraw鏂? 娉曪級銆俉ebView瑙嗗浘涓殑婊氬睆浜嬩歡鐢眔nScrollChanged鏂規硶鍝嶅簲錛岃鏂規硶鍚慦ebViewCore瀵硅薄鍙戦? SET_VISIBLE_RECT浜嬩歡銆?

    WebViewCore瀵硅薄鎺ユ敹鍒癝ET_VISIBLE_RECT浜嬩歡鍚庯紝灝嗘秷鎭弬鏁頒腑淇濆瓨鐨勬柊瑙嗗浘鐨勭煩褰㈠尯鍩熷ぇ灝忎紶閫掔粰 nativeSetVisibleRect鏂規硶錛岄氱煡WebCoreViewImpl瀵硅薄錛圕灞傦級瑙嗗浘鐭╁艦鍙樻洿 錛圵ebCoreViewImpl::setVisibleRect鏂規硶錛夈傚湪setVisibleRect鏂規硶涓紝浼氶氳繃铏氭嫙鏈鴻皟鐢? WebViewCore鐨刢ontentInvalidate鏂規硶錛岃鏂規硶浼氬紩鍙憌ebkitDraw鏂規硶鐨勮皟鐢紙閫氳繃WEBKIT_DRAW娑堟伅錛夈傚湪 webkitDraw鏂規硶閲岋紝棣栧厛浼氬皢mContentPictureB瀵硅薄浼犻掔粰鏈湴鏂規硶nativeDraw緇樺埗錛岃屽悗灝? mContentPictureB鐨勫唴瀹逛笌mContentPictureA鐨勫唴瀹瑰璋冦傚湪榪欓噷mContentPictureA 緙撳啿鍖烘槸渚涚粰WebViewCore鐨刣raw鏂規硶浣跨敤錛屽鏋滅敤鎴烽夋嫨鏌愪釜鎺т歡錛岀粯鍒剁劍鐐規鏃跺橶ebViewCore瀵硅薄鐨刣raw鏂規硶浼氳皟鐢紝緇樺埗鐨? 鍐呭淇濆瓨鍦╩ContentPictureA涓紝涔嬪悗浼氶氳繃Canvas瀵硅薄錛圝ava灞傦級鐨刣rawPicture鏂規硶灝嗗叾緇樺埗鍒板睆騫曚笂錛岃? mContentPictureB緙撳啿鍖烘槸鐢ㄤ簬built鎿嶄綔鐨勶紝nativeDraw鏂規硶涓鍏堜細灝嗕紶閫掔殑mContentPictureB瀵硅薄鏁版嵁閲? 緗紝鑰屽悗鍦ㄩ噸鏂版瀯寤虹殑mContentPictureB鐢誨竷涓婏紝灝嗗眰涓婄浉鍏崇殑鍏冪礌緇樺埗鍒拌鐢誨竷涓娿備笂闈㈡彁鍒幫紝涔嬪悗浼氬皢mContentPictureB鍜? mContentPictureA鐨勫唴瀹瑰璋冿紝榪欐牱涓嬈¢噸緇樹簨浠朵駭鐢熸椂錛堜細璋冪敤WebView.onDraw鏂規硶錛変細灝唌ContentPictureA 鐨勬暟鎹嬌鐢–anvas綾葷殑drawPicture緇樺埗鍒板睆騫曚笂銆傚綋webkitDraw鏂規硶灝唌ContentPictureA涓? mContentPictureB鎸囬拡瀵硅皟鍚庯紝浼氬悜WebView瀵硅薄鍙戦丯EW_PICTURE_MSG_ID娑堟伅錛岃娑堟伅浼氬紩鍙? WebViewCore鐨刅IEW_SIZE_CHANGED娑堟伅鐨勪駭鐢燂紝騫朵笖浼氫嬌褰撳墠瑙嗗浘鏃犳晥浜х敓閲嶇粯浜嬩歡(invalidate())錛屽紩鍙? onDraw鏂規硶鐨勮皟鐢紝瀹屾垚涓嬈$綉欏墊暟鎹殑緇樺埗榪囩▼銆?

~~~ END ~~~

鏈枃杞嚜: http://www.jjos.org/android/2010/05/10/312_webkit-webkit-for-android.html



Bluesea 2012-04-11 10:38 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲乱码精品一二三四区日韩在线 | 欧美在线观看视频一区二区| 欧美激情国产日韩精品一区18| 性欧美18~19sex高清播放| 亚洲美女黄色| 久久久91精品| 欧美在线播放视频| 欧美中文在线免费| 久久九九全国免费精品观看| 久久精品亚洲精品| 免费成人av| 欧美激情中文不卡| 欧美国产欧美综合 | 久久婷婷国产麻豆91天堂| 久久亚洲欧美国产精品乐播| 免费久久99精品国产自| 欧美日韩国产欧美日美国产精品| 欧美小视频在线观看| 国产农村妇女毛片精品久久莱园子| 国产真实乱偷精品视频免| 亚洲电影观看| 亚洲在线中文字幕| 久久一综合视频| 亚洲精品影院在线观看| 翔田千里一区二区| 美女诱惑黄网站一区| 欧美视频在线免费| 国产一区二区三区网站| 日韩视频免费在线观看| 欧美一区二区在线观看| 男人的天堂亚洲| 一区二区电影免费在线观看| 亚洲欧美中文日韩在线| 老司机成人在线视频| 99精品欧美一区二区三区综合在线| 亚洲欧美一区二区视频| 亚洲日本激情| 亚洲尤物视频在线| 麻豆久久婷婷| 亚洲高清在线观看| 欧美1区2区| 在线观看欧美一区| 久久亚洲影院| 久久精品国产欧美激情| 国产精品综合不卡av| 亚洲欧美日韩国产成人| 中文在线不卡视频| 国产精品一区二区三区四区五区| 亚洲一区日韩| 亚洲在线电影| 怡红院精品视频| 麻豆精品网站| 9国产精品视频| 国产一区二区三区精品久久久| 久久久www成人免费精品| 欧美在线视屏| 日韩视频在线观看免费| aa国产精品| 亚洲电影在线免费观看| 99精品久久久| 亚洲福利av| 亚洲欧美日韩国产中文在线| 国产一区二区av| 亚洲欧洲日本专区| 国产精品分类| 久久久噜久噜久久综合| 欧美激情综合在线| 久久综合九色99| 欧美午夜一区| 亚洲综合成人婷婷小说| 欧美午夜一区二区福利视频| 美脚丝袜一区二区三区在线观看 | 国产一区999| 一区二区三区免费在线观看| 亚洲欧洲日产国码二区| 久久精品亚洲一区二区三区浴池| 中文精品在线| 国产精品美女一区二区在线观看| 亚洲人成人99网站| 亚洲精品一区二区三| 欧美成人午夜视频| 亚洲第一主播视频| 夜夜嗨av一区二区三区四区| 欧美粗暴jizz性欧美20| 亚洲美女毛片| 亚洲欧美99| 国产一区二区福利| 国产中文一区二区| 亚洲国产精品免费| 在线视频欧美日韩| 国产九九精品| 久久综合狠狠综合久久综合88| 久久久视频精品| 一区二区欧美在线| 国产精品久久一级| 久久av一区二区| 日韩视频在线观看一区二区| 性欧美暴力猛交69hd| 亚洲国产成人在线播放| 国产精品久久久久国产精品日日| 亚洲欧美一区二区在线观看| 暖暖成人免费视频| 亚洲男女毛片无遮挡| 国产精品久久久久久久久搜平片| 亚洲免费av观看| 欧美在线视频免费播放| 亚洲精品一区二区三区四区高清| 欧美美女福利视频| 欧美成人激情在线| 性欧美1819sex性高清| 精品91在线| 国产丝袜一区二区| 欧美日韩日本国产亚洲在线| 久久久久女教师免费一区| 香蕉久久夜色| 亚洲一区在线播放| 在线一区二区三区做爰视频网站| 亚洲国产国产亚洲一二三| 狂野欧美一区| 久久久人成影片一区二区三区观看 | 一区二区三区鲁丝不卡| 亚洲国产91色在线| 亚洲国产精品一区二区尤物区| 久久久久国产精品一区| 久久久久一区二区三区| 欧美在线免费播放| 欧美在线观看视频在线| 久久国产直播| 欧美激情一区二区三区四区| 亚洲国产91| 欧美岛国激情| 亚洲精品久久久久久久久久久久久| 另类激情亚洲| 亚洲精品一区二区在线观看| 日韩午夜一区| 久久精品国亚洲| 欧美激情二区三区| 国模精品一区二区三区色天香| 狠狠色丁香久久婷婷综合丁香 | 免费观看日韩av| 国产精品美女久久| 亚洲成人在线免费| 午夜精品一区二区三区电影天堂| 欧美一区二区三区另类| 亚洲国产免费看| 欧美专区在线观看| 亚洲缚视频在线观看| 午夜精品一区二区三区在线| 欧美二区在线观看| 在线观看三级视频欧美| 一区二区国产在线观看| 欧美成人一品| 久久久久一区| 国产综合在线视频| 欧美一区二区三区四区视频| 久热精品视频在线| 欧美一区二区三区在线观看 | 久久综合伊人| 欧美中文字幕在线观看| 欧美日韩综合精品| 亚洲精品国产欧美| 欧美成人亚洲成人| 久久一区二区三区四区五区| 国产精品午夜电影| 久久精品麻豆| 久热精品视频在线免费观看| 黄色成人小视频| 欧美v亚洲v综合ⅴ国产v| 欧美成人免费大片| 国产精品99久久久久久白浆小说| 亚洲精品乱码久久久久久蜜桃麻豆| 久久这里只有精品视频首页| 亚洲九九精品| 亚洲一区二区在| 亚洲欧洲日本mm| 亚洲无吗在线| 影音先锋成人资源站| 亚洲美女视频在线观看| 国产一区在线看| 亚洲精品少妇网址| 国产欧美另类| 亚洲婷婷免费| 亚洲日本视频| 久久精品视频在线观看| 日韩一级精品| 久久久久天天天天| 久久亚洲风情| 国产亚洲精品bv在线观看| 欧美激情国产日韩精品一区18| 亚洲精品美女免费| 亚洲国产精品久久久久婷婷884| 午夜精品久久一牛影视| 亚洲一区二区免费| 欧美女主播在线| 欧美大片在线看| 亚洲激情影视| 欧美日本高清视频| 91久久精品国产| 亚洲精品视频啊美女在线直播| 久久精品国产一区二区三区|