1. 取Cookie的API

[java]

CookieManager.getInstance().getCookie(url); 



2.CookieManager的getInstance()

[java]

/**    * Gets the singleton CookieManager instance. If this method is used    * before the application instantiates a {@link WebView} instance,    * {@link CookieSyncManager#createInstance(Context)} must be called    * first.    *    * @return the singleton CookieManager instance    */    public static synchronized CookieManager getInstance() {        return WebViewFactory.getProvider().getCookieManager();    } 


3.WebViewFactory是个工厂模式
[java]

static synchronized WebViewFactoryProvider getProvider() {     // For now the main purpose of this function (and the factory abstraction) is to keep     // us honest and minimize usage of WebViewClassic internals when binding the proxy.     if (sProviderInstance != null) return sProviderInstance;      sProviderInstance = getFactoryByName(DEFAULT_WEB_VIEW_FACTORY);     if (sProviderInstance == null) {         if (DEBUG) Log.v(LOGTAG, "Falling back to explicit linkage");         sProviderInstance = new WebViewClassic.Factory();     }     return sProviderInstance; } 


4.层层嵌套,最后生成的instance是CookieManagerClassic
[java]

@Override        public CookieManager getCookieManager() {            return CookieManagerClassic.getInstance();        } 


5. getCookie方法 实现在CookieManagerClassic上
[java]

@Override   public String getCookie(String url) {       return getCookie(url, false);   }  


@Override   public String getCookie(String url, boolean privateBrowsing) {       WebAddress uri;       try {           uri = new WebAddress(url);       } catch (ParseException ex) {           Log.e(LOGTAG, "Bad address: " + url);           return null;       }        return nativeGetCookie(uri.toString(), privateBrowsing);   } 

6. nativeGetCookie定义在CookieManager.cpp里
[java]

7. WebCookieJar.cpp中,定义了从哪里去取得Cookie情报
[java]

WebCookieJar* WebCookieJar::get(bool isPrivateBrowsing) {     MutexLocker lock(instanceMutex);     if (!isFirstInstanceCreated && fileSchemeCookiesEnabled)         net::CookieMonster::EnableFileScheme();     isFirstInstanceCreated = true;     scoped_refptr<WebCookieJar>* instancePtr = instance(isPrivateBrowsing);     if (!instancePtr->get())         *instancePtr = new WebCookieJar(databaseDirectory(isPrivateBrowsing));     return instancePtr->get(); } 


[java]

static std::string databaseDirectory(bool isPrivateBrowsing) {     static const char* const kDatabaseFilename = "/webviewCookiesChromium.db";     static const char* const kDatabaseFilenamePrivateBrowsing = "/webviewCookiesChromiumPrivate.db";      std::string databaseFilePath = databaseDirectory();     databaseFilePath.append(isPrivateBrowsing ? kDatabaseFilenamePrivateBrowsing : kDatabaseFilename);     return databaseFilePath; } 


※Android3.0以上是webviewCookiesChromium.db, 以下是WebView.db文件


8.最后读取Cookie情报发生在cookie_monster.cc。 额,最后调到C++, 去读.db文件

[java]

std::string CookieMonster::GetCookiesWithOptions(const GURL& url,                                                  const CookieOptions& options) {   base::AutoLock autolock(lock_);   InitIfNecessary();    if (!HasCookieableScheme(url)) {     return std::string();   }    TimeTicks start_time(TimeTicks::Now());    // Get the cookies for this host and its domain(s).   std::vector<CanonicalCookie*> cookies;   FindCookiesForHostAndDomain(url, options, true, &cookies);   std::sort(cookies.begin(), cookies.end(), CookieSorter);    std::string cookie_line;   for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin();        it != cookies.end(); ++it) {     if (it != cookies.begin())       cookie_line += "; ";     // In Mozilla if you set a cookie like AAAA, it will have an empty token     // and a value of AAAA.  When it sends the cookie back, it will send AAAA,     // so we need to avoid sending =AAAA for a blank token value.     if (!(*it)->Name().empty())       cookie_line += (*it)->Name() + "=";     cookie_line += (*it)->Value();   }    histogram_time_get_->AddTime(TimeTicks::Now() - start_time);    VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line;    return cookie_line; } 


更多相关文章

  1. android 打开各种文件的方式
  2. Android(安卓)解析CSV文件,中文乱码
  3. 【Android】向sdcard中写入文件
  4. Android(安卓)apk重新签名
  5. Android(安卓)下载网络url文件并显示进度
  6. 关于 Activity 中 must implement OnFragmentInteractionListene
  7. android studio的安装信息
  8. 在Android中使用NDK调用OpenGl
  9. NPM 和webpack 的基础使用

随机推荐

  1. android之字体阴影效果
  2. 关于 Android(安卓)程序员最近的状况
  3. 14、NFC技术:使用Android(安卓)Beam技术传
  4. Android消息机制(基于源码解析)
  5. Android自定义view中的layout()
  6. android中解析文件的三种方式
  7. Android学习路线总结,绝对干货
  8. [原]Android有用代码片断(六)
  9. Android(安卓)Studio官方文档之Android(
  10. Android+JavaEE实现登录注册(2)——Android