中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android 系統開發

發布時間:2020-06-02 00:23:38 來源:網絡 閱讀:391 作者:yangxiaoming123 欄目:移動開發

  經過兩年的時間,終于完成對Android系統的研究了。Android是一個博大精深的系統,老羅不敢說自己精通了(事實上最討厭的就是說自己精通神馬神馬的了,或者說企業說要招聘精通神馬神馬的人才),但是至少可以說打通了整個Android系統,從最上面的應用層,一直到最下面的Linux內核,煉就的是一種內功修養。這篇文章和大家一起分享這兩年研究Android系統的歷程,以此感謝大家一直以來的支持和鼓勵。        以下是本文的提綱:

        1. 理念

        2. 里程碑

        3. 看過的書

        4. 研究過的內容

        5. 將來要做的事情

        它們涵蓋了老羅這兩年一直想要和大家分享的內容。好了,不說廢話了,直入主題。

        一. 理念

        這里說的理念是說應該帶什么樣的心態去研究一個系統。古人說書中自的顏如玉,書中自有黃金屋,我想說代碼里也有顏如玉和黃金屋,所以老羅希望大家都能“Read The Fucking Source Code”。再者,對于優秀的開源項目來說,不去讀一下它的源代碼,簡直就是暴殄天物啊。那么,讀代碼有什么好處呢?太多了,除了可以學到別人的優秀代碼、架構之外,最重要的是,我們能從中找到答案,從而可以解決自己項目上的燃眉之急。

        我們在項目中碰到問題的時候,通常第一反應都是到網上去搜索答案。但是有時候有些問題,網絡并不能給出滿意的答案。這時候就千萬不要忘了你所擁有的一個大招——從代碼中找答案!當然,從代碼中找答案說起來是輕松,但是等到直正去找時,可能就會發現云里霧里,根本不知道那些代碼在說什么東東,甚至連自己想要看的源代碼文件都不知道在哪里。這就要求平時就要養成讀代碼的習慣,不要臨時抱佛腳。有時候臨時抱佛腳是能解決問題,但是千萬不能抱著這種僥幸心里,掌握一門技術還是需要踏踏實實地一步一步走。

        胡克其實在牛頓之前,就發現了萬有引力定律,并且推導出了正確的公式。但由于數學不好,他只能勉強解釋行星繞日的圓周運動,而沒有認識到支配天體運行的力量是“萬有”的。后來數學狂人牛頓用微積分圓滿地解決了胡克的問題,并且把他提出的力學三條基本定律推廣到了星系空間,改變了自從亞里士多德以來公認的天地不一的舊觀點,被科學界奉為偉大的發現。胡克大怒,指責牛頓剽竊了他的成果。牛頓尖酸刻薄的回敬:是啊,我他媽還真是站在巨人的肩膀上呢!

        我們有理由相信像牛頓、喬布斯之類的狂人,不用站在巨人的肩膀上也能取得矚目的成就。但是,我們不是牛頓,也不是喬布斯,所以在看代碼之前,還是找一些前人總結的資料來看看吧。拿Android系統來說,你在至少得懂點Linux內核基礎吧!所以在看Android源代碼之前,先找些Linux內核的經典書籍來看看吧,騷年!后面老羅會推薦一些書籍給大家。

        另外,我們知道,現在的互聯網產品,講究的是快速迭代。Android系統自第一個版本發布以來,到現在已經經歷了很多版本呢?那么我們應該如何去選擇版本來閱讀呢?一般來說,就是選擇最新的版本來閱讀了。不過隨著又有新版本的源代碼的發布,我們所看的源代碼就會變成舊版本。這時候心里就會比較糾結:是應該繼續看舊的代碼,還是去追新版本的代碼呢?就當是看連續劇,一下子跳到前面去,可能就不知道講什么了。其實版本就算更新得再快,基礎的東西也是不會輕易變化的。我們看代碼時,要抱著的一個目的就是弄懂它的骨架和脈絡。畢竟對于一個系統來說,它是有很多細節的,我們無法在短時間把它們都完全吃透。但是主要我們掌握了它的骨架和脈絡,以后無論是要了解它的什么細節,都可以很輕輕地找到相關的源文件,并且可以很容易進入主題。

        坦白說,對于Android系統,很多細節我也不了解。所以有時候你們可以看到,在博客文章后面的評論上,有些同學問的一些比較具體的問題,我是沒有回復的。一來是我不懂,二來是我也沒有時間去幫這些同學去扒代碼來看。這也是在文章一開頭,我就說自己沒有精通Android系統的原因。但是請相信,主要你熟悉Android系統的代碼,并且有出現問題的現場,順藤摸瓜跟著代碼走下去,并且多一點耐心和細心,是可以解決問題的!

        關于Android版本的問題,相信大家都知道我現在的文章都是基于2.3來寫的。很多同學都說我out了,現在都4.2了,甚至4.3或者5.0都要出來了,還在看2.3。我想說的是,主要你掌握了它的骨架和脈絡,無論版本上怎么變化,原理都是一樣的,這就是以不變應萬變之道。因此,我就一直堅持研究2.3,這樣可以使得前前后后研究的東西更連貫一致,避免分散了自己的精力。如果還有疑問的話,后面我講到Android的UI架構時,就會簡單對比一下4.2和2.3的不同,其實就會發現,基本原理還是一樣的!

        說到Android系統的骨架和脈絡,也有同學抱怨我的文章里面太多代碼細節了,他們希望我可以抽象一下,用高度概括的語言或者圖像來勾勒出每一個模塊的輪廓。我想說的是,如果你不看代碼,不了解細節,即使我能夠用概括的語言或者圖像來勾勒出這樣的輪廓出來,也許這個輪廓只有我才能看得懂。

        我在真正開始看Android系統的源代碼之前,也是有這樣的想法,希望能有一張圖來清楚地告訴我Android系統的輪廓,例如,HAL為什么要將驅動劃分成用戶空間和內核空間兩部分,為什么說Binder是所有IPC機制效率最高的。我確實是從網上得到抽象的資料來解釋這兩個問題,但是這些資料對我來說,還是太抽象了,以至于我有似懂非懂的感覺,實際上就是不懂!就是因為這樣,激發了我要從代碼中找答案的念頭!現在當我回過頭來這些所謂抽象的輪廓時,我就清楚地知道它講的是什么了。

        所以古人云“天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚”是有道理的,因為只有親身經歷過一些磨難后得到的東西才是真實的!

        好了,關于理念的問題,就完了,這里再做一下總結:

        1. 從代碼中找答案——Read The Fucking Source Code。

        2. 以不變應萬變——堅持看一個版本的代碼直至理清它的骨架和脈絡。

        二. 里程碑

        研究Android 2.3期間,主要是經歷了以下五個時間點,如圖1所示:

android 系統開發

圖1 研究Android 2.3的里程碑

         從2011年06月21日第一篇博客文章開始,到2013年06月03日結束對Android 2.3的研究,一共是差不多兩年的時間,一個從無到有的過程。其中,最痛苦的莫過于是2011年12月下旬到2012年06月12日這6個多月的時間里面,整理了2011年12月下旬前的所有博客文章,形成了《Android系統源代碼情景分析》一書,并且最終在2012年10月下旬正式上市。

        總的來說,就是在兩年的時間里面,獲得了以下的兩個產出: 

        1. 《老羅的Android之旅》博客專欄93篇文章,1857224次訪問,4156條評論,13440積分,排名154。

        2. 《Android系統源代碼情景分析》一書3大篇16章,830頁,1570000字。

        以上產出除了能幫助到廣大的網友之外,也讓自己理清了Android系統的骨架和脈絡。這些骨架和脈絡接下來再總結。2013年06月03日之后,將何去何從?接下來老羅也會簡單說明。

        三. 看過的書 

        在2011年06月21日開始寫博客之前,其實已經看過不少的書。在2011年06月21日之后,也一邊寫博客一邊看過不少的書。這個書單很長,下面我主要分類列出一些主要的和經典的。

        語言:

        《深度探索C++對象模型》,對應的英文版是《Inside C+++ Object Model》

        程序編譯、鏈接、加載:

        《鏈接器和加載器》,對應的英文版是《Linker and Loader》

        《程序員的自我修養:鏈接、裝載和庫》

        操作系統:

        《Linux內核設計與實現》,對應的英文版是《Linux Kernel Development》

        《深入理解Linux內核》,對應的英文版是《Understanding the Linux Kernel》

        《深入Linux內核架構》,對應的英文版是《Professional Linux Kernel Architecture》

        《Linux內核源代碼情景分析》

         網絡:

        《Linux網絡體系結構:Linux內核中網絡協議的設計與實現》,對應的英文版是《The Linux Networking Architecture: Design and Implementation of Network Protocols in the Linux Kernel》

        《深入理解LINUX網絡技術內幕》,對應的英文版是《 Understanding Linux Network Internals》

        設備驅動:

        《Linux設備驅動程序》,對應的英文版是《Linux Device Drivers》

        《精通Linux設備驅動程序開發》,對應的英文版是《Essential Linux Device Drivers》

        虛擬機:

        《Java SE 7虛擬機規范》

        《深入Java虛擬機》,對應的英文版是《Inside the Java Virtual Machine》

        《Oracle JRockit: The Definitive Guide》

        嵌入式:

        《嵌入式Linux開發》,對應的英文版是《Embedded Linux Primer》

        《構建嵌入式Linux系統》,對應的英文版是《Building Embedded Linux Systems》

        ARM體系架構:

        《ARM嵌入式系統開發:軟件設計與優化》,對應的英文版是《ARM System Developer's Guide: Designing and Optimizing System Software》

        綜合:

       《深入理解計算機系統》,對應的英文版是《Computer Systems: A Programmer's Perspective》

        上面介紹的這些書,都是屬于進階級別的,所以要求要有一定的語言基礎以及操作系統基礎。此外,對于看書,老羅有一些觀點,供大家參考:

        1. 書不是要用的時候才去看的,要養成經常看書、終身學習的習慣。

        2. 不要只看與目前自己工作相關的書,IT技術日新月異,三五年河東,三五年河西。

        3. 書看得多了,就會越看越快,學習新的東西時也越容易進入狀態。

        對于Android應用開發,力推官方文檔:

        http://developer.android.com/training/index.html

        http://developer.android.com/guide/components/index.html

        http://developer.android.com/tools/index.html

        四. 研究過的內容

        整個博客的內容看似松散,實際上都是有組織有計劃的,目標是打通整個Android系統,從最上面的應用層,到最下面的Linux內核層。簡單來說,博客的所有文章可以劃分為“三橫三縱”,如圖2所示:

android 系統開發

圖2 Android系統研究之“三橫三縱”

        接下來,老羅就分別描述這三條橫線和縱線,并且給出對應的博客文章鏈接。

        1. 準備 -- Preparation -- 橫線

        主要就是:

       (1)通過閱讀相關的書籍來了解Linux內核和Android應用基礎知識

         Android學習啟動篇

       (2)搭建好Android源代碼環境

         在Ubuntu上下載、編譯和安裝Android最新源代碼

         在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)

         如何單獨編譯Android源代碼中的模塊

         制作可獨立分發的Android模擬器

       (3)Android系統有很多C++代碼,這些C++代碼用到了很多智能指針,因此有必要了解一下Android系統在C/C++ Runtime Framework中提供的智能指針

         Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析

         2. 專用驅動 -- Proprietary Drivers -- 橫線

         這些專用驅動就是指Logger、Binder和Ashmem,它們整個Android系統的基石:

        (1)Logger

          淺談Android系統開發中LOG的使用

         Android日志系統驅動程序Logger源代碼分析

         Android應用程序框架層和系統運行庫層日志系統源代碼分析

         Android日志系統Logcat源代碼簡要分析

        (2)Binder

          Android進程間通信(IPC)機制Binder簡要介紹和學習計劃

         淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路

         淺談Android系統進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路

         Android系統進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析

         Android系統進程間通信(IPC)機制Binder中的Client獲得Server遠程接口過程源代碼分析

         Android系統進程間通信Binder機制在應用程序框架層的Java接口源代碼分析

        (3)Ashmem

          Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃

          Android系統匿名共享內存Ashmem(Anonymous Shared Memory)驅動程序源代碼分析

          Android系統匿名共享內存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析

          Android系統匿名共享內存(Anonymous Shared Memory)C++調用接口分析

        3. 硬件抽象層 -- HAL -- 縱線

        硬件抽層象最適合用作Android系統的學習入口,它從下到上涉及到了Android系統的各個層次:

         Android硬件抽象層(HAL)概要介紹和學習計劃

         在Ubuntu上為Android系統編寫Linux內核驅動程序

         在Ubuntu上為Android系統內置C可執行程序測試Linux內核驅動程序

         在Ubuntu上為Android增加硬件抽象層(HAL)模塊訪問Linux內核驅動程序

         在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口

         在Ubuntu上為Android系統的Application Frameworks層增加硬件訪問服務

         在Ubuntu上為Android系統內置Java應用程序測試Application Frameworks層的硬件服務

        4. 應用程序組件 -- Application Component -- 縱線

        應用程序組件是Android系統的核心,為開發者提供了貼心的服務。應用程序組件有四種,分別是Activity、Service、Broadcast Receiver和Content Provider。圍繞應用程序組件,又有應用程序進程、消息循環和安裝三個相關模塊。

       (1)Activity

         Android應用程序的Activity啟動過程簡要介紹和學習計劃

         Android應用程序啟動過程源代碼分析

         Android應用程序內部啟動Activity過程(startActivity)的源代碼分析

         Android應用程序在新的進程中啟動新的Activity的方法和過程分析

         解開Android應用程序組件Activity的"singleTask"之謎

       (2)Service

         Android系統在新進程中啟動自定義服務過程(startService)的原理分析

         Android應用程序綁定服務(bindService)的過程源代碼分析

       (3)Broadcast Receiver

         Android系統中的廣播(Broadcast)機制簡要介紹和學習計劃

         Android應用程序注冊廣播接收器(registerReceiver)的過程分析

         Android應用程序發送廣播(sendBroadcast)的過程分析

       (4)Content Provider

         Android應用程序組件Content Provider簡要介紹和學習計劃

         Android應用程序組件Content Provider應用實例

         Android應用程序組件Content Provider的啟動過程源代碼分析

         Android應用程序組件Content Provider在應用程序之間共享數據的原理分析

         Android應用程序組件Content Provider的共享數據更新通知機制分析

       (5)進程

         Android系統進程Zygote啟動過程的源代碼分析

         Android應用程序進程啟動過程的源代碼分析

       (6)消息循環

         Android應用程序消息處理機制(Looper、Handler)分析

         Android應用程序鍵盤(Keyboard)消息處理機制分析

         Android應用程序線程消息循環模型分析

       (7)安裝

         Android應用程序安裝過程源代碼分析

         Android系統默認Home應用程序(Launcher)的啟動過程源代碼分析

        5. 用戶界面架構 -- UI -- 縱線

        大家對老羅現在還在寫Android 2.3的UI架構意見最大,認為已經過時了。老羅認為持有這種觀點的人,都是沒有經過認真思考的。老羅承認,從Android 4.0開始,UI部分發生了比較大的變化。但是請注意,這些變化都是在Android  2.3的UI架構基礎之上進行的,也就是說,Android  2.3的UI架構并沒有過時。你不能說Android 4.0在Android  2.3之上增加了一些feature,就說Android  2.3過時了。

        下面這張是從Android官網拿過來的最新UI渲染流程圖,也就是4.2的UI渲染流程圖:

android 系統開發

圖2 Android 4.2的UI渲染流程

        從這張圖可以看出關于Android的UI架構的三條主線:

      (1)每一個Window的Surface都怎樣渲染的?不管怎么樣,最后渲染出來的都是一個Buffer,交給SurfaceFlinger合成到Display上。

      (2)SurfaceFlinger是怎樣合成每一個Window的Surface的?

      (3)WindowManamgerService是怎么樣管理Window的? 

        第(1)和第(2)兩個點在2.3和4.2之間有變化,主要是因為增加了GPU的支持,具體就表現為Window的Surface在渲染的時候使用了GPU,而SurfaceFlinger在合成每一個Window的Surface的時候,也使用了GPU或者Overlay和Blitter這些硬件加速,但是主體流程都沒有變,也就是說,Window的Surface渲染好之后,最終依然是交給SurfaceFlinger來合成。此外,雖然我還沒有開始看4.2的代碼,但是可以看得出,4.2里面的HWComposer,只不過是封裝和抽象了2.3就有的Overlay和Blitter,而SurfaceTexture的作用與2.3的SurfaceComposerClient、SurfaceControl也是類似的。第(3)點基本上就沒有什么變化,除非以后要支持多窗口。

        通過上述對比,只想強調一點:Android 2.3的UI架構并沒有過時,是值得去研究的,并且在2.3的基礎上去研究4.2的UI架構,會更有幫助。

        仁者見仁,智者見智,Android 2.3的UI架構的說明就到此為止,接下來它的分析路線,都是圍繞上述三個點來進行的。

        首先是以開機動畫為切入點,了解Linux內核里面的驅動:

        Android系統的開機畫面顯示過程分析

        FB驅動抽象了顯卡,上面的用戶空間程序就是通過它來顯示UI的。

        HAL層的Gralloc模塊對FB驅動進行了封裝,以方便SurfaceFlinger對它進行訪問:

        Android幀緩沖區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析

        SurfaceFlinger負責合成各個應用程序窗口的UI,也就是將各個窗口的UI合成,并且通過FB顯示在屏幕上。在對SurfaceFlinger進行分析之前,我們首先了解應用程序是如何使用的它的:

        Android應用程序與SurfaceFlinger服務的關系概述和學習計劃

        Android應用程序與SurfaceFlinger服務的連接過程分析

        Android應用程序與SurfaceFlinger服務之間的共享UI元數據(SharedClient)的創建過程分析

        Android應用程序請求SurfaceFlinger服務創建Surface的過程分析

        Android應用程序請求SurfaceFlinger服務渲染Surface的過程分析

        萬事俱備,可以開始分析SurfaceFlinger了:

        Android系統Surface機制的SurfaceFlinger服務簡要介紹和學習計劃

        Android系統Surface機制的SurfaceFlinger服務的啟動過程分析

        Android系統Surface機制的SurfaceFlinger服務對幀緩沖區(Frame Buffer)的管理分析

        Android系統Surface機制的SurfaceFlinger服務的線程模型分析

        Android系統Surface機制的SurfaceFlinger服務渲染應用程序UI的過程分析

        SurfaceFlinger操作的對象是應用程序窗口,因此,我們要掌握應用程序窗口的組成:

        Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃

        Android應用程序窗口(Activity)的運行上下文環境(Context)的創建過程分析

        Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析

        Android應用程序窗口(Activity)的視圖對象(View)的創建過程分析

        Android應用程序窗口(Activity)與WindowManagerService服務的連接過程分析

        Android應用程序窗口(Activity)的繪圖表面(Surface)的創建過程分析

        Android應用程序窗口(Activity)的測量(Measure)、布局(Layout)和繪制(Draw)過程分析

        應用程序窗口是由WindowManagerService進行管理的,并且也是WindowManagerService負責提供窗口信息給SurfaceFlinger的,因此,我們最后分析WindowManagerService:

        Android窗口管理服務WindowManagerService的簡要介紹和學習計劃

        Android窗口管理服務WindowManagerService計算Activity窗口大小的過程分析

        Android窗口管理服務WindowManagerService對窗口的組織方式分析

        Android窗口管理服務WindowManagerService對輸入法窗口(Input Method Window)的管理分析

        Android窗口管理服務WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析

        Android窗口管理服務WindowManagerService計算窗口Z軸位置的過程分析

        Android窗口管理服務WindowManagerService顯示Activity組件的啟動窗口(Starting Window)的過程分析

        Android窗口管理服務WindowManagerService切換Activity窗口(App Transition)的過程分析

        Android窗口管理服務WindowManagerService顯示窗口動畫的原理分析

        上述內容都研究清楚之后,Android系統的UI架構的骨架就清晰了。但是前面所研究的應用程序窗口還是太抽象了,我們有必要研究一下那些組成應用程序窗口內容的UI控件是怎么實現的,以TextView和SurfaceView為代表:

        Android控件TextView的實現原理分析

        Android視圖SurfaceView的實現原理分析

        最后,分析Android系統的UI架構,怎能不提它的資源管理框架?它有效地分離了代碼和UI:

        Android資源管理框架(Asset Manager)簡要介紹和學習計劃

        Android應用程序資源的編譯和打包過程分析

        Android應用程序資源管理器(Asset Manager)的創建過程分析

        Android應用程序資源的查找過程分析

        分析這里,Android系統的UI架構就分析完成了,看出什么門道來沒有?是的,我們以開機動畫為切入點,從Linux內核空間的FB驅動,一直分析到用戶空間中HAL層模塊Gralloc、C/C++ Runtime Framework層的SurfaceFlinger、Java Runtime Framework層的WindowMangerService、Window、Widget,以及資源管理框架,從下到上,披荊斬棘。

        6. Dalvik虛擬機 -- 橫線

        Android系統的應用程序及部分應用程序框架是使用Java語言開發的,它們運行在Dalvik虛擬機之上,還有另外一部分應用唾棄框架在使用C/C++語言開發的。使用Java語言開發的應用程序框架老羅稱之為Java Runtime Framework,而使用C/C++語言開發的應用程序框架老羅稱之為C/C++ Runtime Framework,它們被Dalvik虛擬機一分為二。通過前面的學習,其實我們都已經了解Android系統的Java Runtime Framework和C/C++ Runtime Framework,因此,我們最后將注意力集中在Dalvik虛擬機上:

        Dalvik虛擬機簡要介紹和學習計劃

        Dalvik虛擬機的啟動過程分析

        Dalvik虛擬機的運行過程分析

        Dalvik虛擬機JNI方法的注冊過程分析

        Dalvik虛擬機進程和線程的創建過程分析

        學習完成“三橫三縱”這六條主線之后,我們就可以自豪地說,從上到下地把Android系統打通,并且將它的骨架和脈絡也理清了!

        對于“準備”、“專用驅動”、“HAL”、“應用程序組件”這四條主線,老羅極力推薦大家看《Android系統源代碼情況分析》一書,內容比博客文章要系統、詳細很多,不說其它的,就單單是講Binder進程間通信機制的那一章,就物超所值。在《Android系統源代碼情景分析》一書中,老羅最引以為豪的就是講Binder進程間通信機制的第5章,網上或者其它書上絕對是找不到這么詳盡的分析資料。

        五. 將來要做的事情

        接下來要做的主要是三件事情:

        1. 繼續研究Android系統

        本來以為前段時間的Google I/O會發布Android 4.3或者5.0,然后老羅就以最新發布的版本為藍本來進行研究。既然沒有發布新版本,那么就只有以現在的最新發布版本4.2為藍本進行研究了。如前所述,4.2與2.3相比,最大的不同之處是默認增加了GPU支持,因此,老羅在接下來的一段時間里,將著重研究4.2的GPU支持。

        2. 停止博客更新

        這兩年投入在博客上的精力太多了,博客上的文章基本上熬夜熬出來的。大多數時候,一個話題要花一個星期左右的時間來看代碼,然后再花四個星期左右的時間將文章寫出來。本來是這樣計劃的,依靠《Android系統源代碼情景分析》一書的銷量,可以在經濟上得到一定的回報,然后可以繼續在博客上投入,直至把4.x版本的GPU支持寫完,最后再整理出一本關于Android系統UI架構的書。但是最近詢問了一下書的銷量,差強人意,達不到預期目標。由于沒有形成良性循環,因此沒有辦法,只好停止博客更新。老羅需要把精力投入在其它事情上,希望大家諒解!


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐山县| 渭南市| 石城县| 天门市| 威信县| 古丈县| 通榆县| 象山县| 江油市| 永定县| 涞水县| 德江县| 山阴县| 菏泽市| 凤庆县| 容城县| 海盐县| 吉安县| 荣成市| 铜梁县| 温宿县| 保山市| 台中市| 嘉黎县| 镇原县| 湄潭县| 桓台县| 六安市| 平山县| 临泽县| 延川县| 如皋市| 仁寿县| 婺源县| 玛多县| 连州市| 香河县| 花垣县| 都兰县| 响水县| 滁州市|