關(guān)于我們
書單推薦
新書推薦
|
深入理解Android內(nèi)核設計思想
全書從操作系統(tǒng)的基礎(chǔ)知識入手, 全面剖析進程/線程、內(nèi)存管理、Binder機制、GUI顯示系統(tǒng)、多媒體管理、輸入系統(tǒng)、虛擬機等核心技術(shù)在Android中的實現(xiàn)原理。書中講述的知識點大部分來源于工程項目研發(fā), 因而具有較強的實用性, 希望可以讓讀者“知其然, 更知其所以然”。本書分為編譯篇、系統(tǒng)原理篇、應用原理篇、系統(tǒng)工具篇, 共4篇25章, 基本涵蓋了參與Android開發(fā)所需具備的知識, 并通過大量圖片與實例來引導讀者學習, 以求盡量在源碼分析外為讀者提供更易于理解的思維方式。本書既適合Android系統(tǒng)工程師, 也適合于應用開發(fā)工程師來閱讀, 從而提升Android開發(fā)能力。讀者可以在本書潛移默化的學習過程中更深刻地理解Android系統(tǒng), 并將所學知識自然地應用到實際開發(fā)難題的解決中。
·基于AndroidSDK新版本
·全面剖析了進程/線程、內(nèi)存管理、Binder機制、GUI顯示系統(tǒng)、多媒體管理、輸入系統(tǒng)等核心知識在Android中的實現(xiàn)原理Android安全機制虛擬內(nèi)存優(yōu)化性能優(yōu)化 ·通過大量圖片與實例來引導讀者學習,以求盡量在源碼分析外,為讀者提供更易于理解的思維路徑 ·由淺入深,由總體框架再到細節(jié)實現(xiàn),讓讀者盡快了解Android內(nèi)核的設計思想
Android系統(tǒng)的誕生地——美國硅谷。
Google大樓前擺放著Android的zui新版本雕塑,歷史版本則被放置在Android Statues Park中 寫第2版前言時,筆者剛好在美國加州硅谷等地公事出差訪問。其間我一直在思考的問題是,美國硅谷(Silicon Valley)在近幾十年時間里長盛不衰的原因是什么?技術(shù)的浪潮總是一波接著一波的,誰又會在不遠的將來接替Google的Android系統(tǒng),在操作系統(tǒng)領(lǐng)域成為下一輪的弄潮兒?我們又應該如何應對這種“長江后浪推前浪”的必然更迭呢? 從歷史的長河來看,新技術(shù)、新事物的誕生往往和當時的大背景有著不可分割的關(guān)系。如果我們追溯硅谷的發(fā)展史,會發(fā)現(xiàn)其實它相對于美國很多傳統(tǒng)地區(qū)來說還是非常年輕的!肮韫取边@個詞是在1971年的“Silicon Valley in the USA”系列報導文章中才首次出現(xiàn)的。20世紀四五十年代開始,硅谷就像一匹脫了韁的野馬一般,“一發(fā)不可收拾”。從早期的Hewlett-Packard公司,到仙童、AMD、Intel以及后來的Apple、Yahoo!等眾多世界一流企業(yè),硅谷牢牢把握住了科技界的幾次大變革,成功匯集了美國90%以上的半導體產(chǎn)業(yè),逐步呈現(xiàn)出“生生不息”的景象。 但為什么是硅谷,而不是美國其他地區(qū)成為高科技行業(yè)的“發(fā)動機”呢? 古語有云,“天時、地利、人和,三者不得,雖勝有殃”。 現(xiàn)在我們回過頭來看這段歷史,應該說硅谷早期的發(fā)展和當時的世界大環(huán)境有很大關(guān)系——更確切地說,正是美國國防工業(yè)的發(fā)展訴求,才給了硅谷創(chuàng)業(yè)初期的“第一桶金”。只有“先活下來,才有可能走得更遠”。而接下來社會對半導體工業(yè)需求的爆炸式增長,同樣讓硅谷占據(jù)了“天時”的優(yōu)勢,再接再厲最終走上良性循環(huán)。 密密麻麻的硅谷大企業(yè) 。ㄒ米詂dn.com) 硅谷的“地利”和“人和”,可能主要體現(xiàn)在: 。1)Stanford University 斯坦福大學校園 Stanford University在硅谷的發(fā)展過程中起到了非常關(guān)鍵的作用。20世紀50年代的時候,這所大學還并不是很起眼,各方面條件都比較糟糕,她的畢業(yè)生也多數(shù)會去東海岸尋求就業(yè)機會。后來她的一位教授Frederick Terman看到了產(chǎn)業(yè)和學術(shù)的接合點,從學校里劃分出一大塊空地來鼓勵學生創(chuàng)業(yè),并且指導其中兩位學生創(chuàng)立了Hewlett-Packard公司。隨后的幾年他又成立了Stanford Research Park,這也同時是后來全球各高科技園區(qū)的起點,并吸引了越來越多的公司加入。在那段時間里,相信起到核心催化作用的是“產(chǎn)”+“學”的高度結(jié)合——將科技產(chǎn)品不斷推陳出新產(chǎn)生經(jīng)濟效益,然后再回饋到研究領(lǐng)域。在幾十年的跨度里,很多頂尖公司(Google、Yahoo!、HP等)的創(chuàng)始人都出自該校。有統(tǒng)計顯示Standford師生及校友創(chuàng)造了硅谷一半以上的總產(chǎn)值,其影響力可見一斑。 。2)便利的地理環(huán)境 整個硅谷地區(qū)面積并不是很大,屬于溫帶海洋性氣候,全年平均溫度在13℃~24℃,污染很小。同時,它依林傍海,陸、海、空都可以很好地與外界相連,這樣一來自然有利于人才的引入。 (3)鼓勵創(chuàng)新,完善的專利保護機制 從法律上講,硅谷每年有超過4000項的專利申請,工程師和律師的比例達到了10∶1。在創(chuàng)新點得到保護的同時,也使得初創(chuàng)公司能夠得到進一步的發(fā)展,從而避免它們被扼殺在搖籃中。從觀念上來說,硅谷人對知識產(chǎn)權(quán)還是非常尊重的,他們大多認為剽竊是沒有技術(shù)含量的,相當于“涸澤而漁”。 (4)完善的風投體系,并容忍失敗 事實上在硅谷創(chuàng)業(yè),其成本和失敗率都很高——其中能存活3~5年的公司只有10%~20%。一方面,風險投資方需要高度容忍這樣的失敗率;另一方面,在允許快速試錯的同時,風險投資方又可以從某些成功中獲得巨大收益——硅谷就是一個可以達到這種矛盾平衡的神奇所在地。 “三十年河東,三十年河西”,技術(shù)的浪潮總是在不斷演進的。從Symbian、Black Berry,到Android、iOS,歷史經(jīng)驗告訴我們沒有一項技術(shù)是會永遠一成不變的。所以我們在技術(shù)領(lǐng)域的探索過程中,既要拿“魚”,更要學會“漁”——前者是為當前的工作而努力,后者則是為我們的未來做投資。以Android操作系統(tǒng)為例,事實上我們除了“知其然”外,還更應該學習它的內(nèi)部設計思想——即“知其所以然”。當我們真正地理解了那些“精華”所在以后,那么相信以后再遇到任何其他的操作系統(tǒng),就都可以做到“觸類旁通”了。也只有這樣,或許才能在快速變革的科技領(lǐng)域中把握住脈搏,立于不敗之地。 林學森 于美國硅谷 關(guān)于本書第2版 在第1版上市的這兩年時間里,不斷有讀者來信分享他們閱讀本書時的感想和心得,筆者首先要在這里衷心地向大家說聲感謝!正是你們的支持和肯定,才有了《深入理解Android內(nèi)核設計思想》(第2版)的誕生。 其中有不少讀者提到了他們希望在本書后續(xù)更新中看到的內(nèi)容,包括Android虛擬機的內(nèi)部實現(xiàn)原理、Android的安全機制、Gradle自動化構(gòu)建工具等——這些要求都在本次版本更新中得到了體現(xiàn)。 需要特別說明的是,第2版中的所有新增和有更新的部分都是基于Android最新的N版本展開的。由于Android版本的更新?lián)Q代很快,且版本間的差異巨大,導致書中很多內(nèi)容幾乎需要全部重寫。另外筆者寫書都是在下班后的業(yè)余時間進行的,所以即便是每晚奮筆疾書到深夜,再加上周末和節(jié)假日時間(如果沒有加班工作的話),最后發(fā)現(xiàn)更新全書所需時間依然要大于Android系統(tǒng)的發(fā)布間隔。為了讓讀者可以早日閱讀到大家感興趣的內(nèi)容,本次版本的部分章節(jié)保留了第1版的原有內(nèi)容——本書下一次再版時會爭取將它們更新到Android的最新版本。這一點希望得到大家的諒解,謝謝! 致謝 感謝我目前任職公司的領(lǐng)導和同事們,是你們的幫助和支持,才讓我更快地融入到了這個大家庭中。在一個到處都是“聰明人”和具有“狼性奮斗者”精神的公司里,每天的進步和知識積累都是讓人愉悅的。 感謝人民郵電出版社的編輯,你們的專業(yè)態(tài)度和處理問題的人性化,是所有作者的“福音”。 感謝我的家人林進躍、張建山、林美玉、楊惠萍、林惠忠、林月明,沒有你們的鼓勵與理解,就沒有本書的順利出版。 感謝我的妻子張白楊的默默付出,是你工作之外還無怨無悔地在照顧著我們可愛的寶寶,才讓我有充足的時間和精力來寫作。 感謝所有讀者的支持,是你們賦予了我寫作的動力。另外,因為個人能力和水平有限,書中難免會有不足之處,希望讀者不吝指教,一起探討學習。 作者 本文僅用于學習和交流目的,不代表異步社區(qū)觀點。非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接。
林學森,曾于多家跨國企業(yè)擔任研發(fā)和管理工作,并已在國內(nèi)外會議、雜志上發(fā)表多篇文章,獲得多個發(fā)明專利,F(xiàn)為某世界500強科技公司高級專家、資深架構(gòu)師。
第1篇Android編譯篇
第1章Android系統(tǒng)簡介2 1.1Android系統(tǒng)發(fā)展歷程2 1.2Android系統(tǒng)特點4 1.3Android系統(tǒng)框架8 第2章Android源碼下載及編譯11 2.1Android源碼下載指南11 2.1.1基于Repo和Git的版本管理11 2.1.2Android源碼下載流程12 2.2原生Android系統(tǒng)編譯指南16 2.2.1建立編譯環(huán)境16 2.2.2編譯流程19 2.3定制產(chǎn)品的編譯與燒錄22 2.3.1定制新產(chǎn)品22 2.3.2Linux內(nèi)核編譯26 2.3.3燒錄/升級系統(tǒng)27 2.4AndroidMultilibBuild28 2.5Android系統(tǒng)映像文件31 2.5.1boot.img32 2.5.2ramdisk.img34 2.5.3system.img35 2.5.4VerifiedBoot35 2.6ODEX流程37 2.7OTA系統(tǒng)升級39 2.7.1生成升級包39 2.7.2獲取升級包40 2.7.3OTA升級—Recovery模式41 2.8Android反編譯44 2.9NDKBuild46 2.10第三方ROM的移植48 第3章Android編譯系統(tǒng)50 3.1Makefile入門50 3.2Android編譯系統(tǒng)52 3.2.1Makefile依賴樹的概念53 3.2.2Android編譯系統(tǒng)抽象模型53 3.2.3樹根節(jié)點droid54 3.2.4main.mk解析55 3.2.5droidcore節(jié)點59 3.2.6dist_files61 3.2.7Android.mk的編寫規(guī)則61 3.3JackToolchain64 3.4SDK的編譯過程68 3.4.1envsetup.sh68 3.4.2lunchsdk-eng70 3.4.3makesdk75 3.5Android系統(tǒng)GDB調(diào)試85 第2篇Android原理篇 第4章操作系統(tǒng)基礎(chǔ)90 4.1計算機體系結(jié)構(gòu)(ComputerArchitecture)90 4.1.1馮?諾依曼結(jié)構(gòu)90 4.1.2哈佛結(jié)構(gòu)90 4.2什么是操作系統(tǒng)91 4.3進程間通信的經(jīng)典實現(xiàn)93 4.3.1共享內(nèi)存(SharedMemory)94 4.3.2管道(Pipe)95 4.3.3UNIXDomainSocket97 4.3.4RPC(RemoteProcedureCalls)99 4.4同步機制的經(jīng)典實現(xiàn)100 4.4.1信號量(Semaphore)100 4.4.2Mutex101 4.4.3管程(Monitor)101 4.4.4LinuxFutex102 4.4.5同步范例103 4.5Android中的同步機制104 4.5.1進程間同步——Mutex104 4.5.2條件判斷——Condition105 4.5.3“柵欄、障礙”——Barrier107 4.5.4加解鎖的自動化操作——Autolock108 4.5.5讀寫鎖——ReaderWriterMutex109 4.6操作系統(tǒng)內(nèi)存管理基礎(chǔ)110 4.6.1虛擬內(nèi)存(VirtualMemory)110 4.6.2內(nèi)存保護(MemoryProtection)113 4.6.3內(nèi)存分配與回收113 4.6.4進程間通信——mmap114 4.6.5寫時拷貝技術(shù)(CopyonWrite)115 4.7Android中的LowMemoryKiller115 4.8Android匿名共享內(nèi)存(AnonymousSharedMemory)118 4.8.1Ashmem設備118 4.8.2Ashmem應用實例122 4.9JNI127 4.9.1Java函數(shù)的本地實現(xiàn)127 4.9.2本地代碼訪問JVM130 4.10Java中的反射機制132 4.11學習Android系統(tǒng)的兩條線索133 第5章Android進程/線程和程序內(nèi)存優(yōu)化134 5.1Android進程和線程134 5.2Handler,MessageQueue,Runnable與Looper140 5.3UI主線程——ActivityThread147 5.4Thread類150 5.4.1Thread類的內(nèi)部原理150 5.4.2Thread休眠和喚醒151 5.4.3Thread實例155 5.5Android應用程序如何利用CPU的多核處理能力157 5.6Android應用程序的典型啟動流程157 5.7Android程序的內(nèi)存管理與優(yōu)化159 5.7.1Android系統(tǒng)對內(nèi)存使用的限制159 5.7.2Android中的內(nèi)存泄露與內(nèi)存監(jiān)測160 第6章進程間通信—Binder166 6.1智能指針169 6.1.1智能指針的設計理念169 6.1.2強指針sp172 6.1.3弱指針wp173 6.2進程間的數(shù)據(jù)傳遞載體——Parcel179 6.3Binder驅(qū)動與協(xié)議187 6.3.1打開Binder驅(qū)動——binder_open188 6.3.2binder_mmap189 6.3.3binder_ioctl192 6.4“DNS”服務器——ServiceManager(BinderServer)193 6.4.1ServiceManager的啟動193 6.4.2ServiceManager的構(gòu)建194 6.4.3獲取ServiceManager服務—設計思考199 6.4.4ServiceManagerProxy203 6.4.5IBinder和BpBinder205 6.4.6ProcessState和IPCThreadState207 6.5Binder客戶端——BinderClient237 6.6Android接口描述語言——AIDL242 6.7匿名BinderServer254 第7章Android啟動過程257 7.1第一個系統(tǒng)進程(init)257 7.1.1init.rc語法257 7.1.2init.rc實例分析260 7.2系統(tǒng)關(guān)鍵服務的啟動簡析261 7.2.1Android的“DNS服務器”——ServiceManager261 7.2.2“孕育”新的線程和進程——Zygote261 7.2.3Android的“系統(tǒng)服務”——SystemServer274 7.2.4Vold和ExternalStorage存儲設備276 7.3多用戶管理282 第8章管理Activity和組件運行狀態(tài)的系統(tǒng)進程——ActivityManagerService(AMS)284 8.1AMS功能概述284 8.2管理當前系統(tǒng)中Activity狀態(tài)——ActivityStack286 8.3startActivity流程288 8.4完成同一任務的“集合”——ActivityTask296 8.4.1“后進先出”——LastIn,F(xiàn)irstOut297 8.4.2管理ActivityTask298 8.5Instrumentation機制300 第9章GUI系統(tǒng)—SurfaceFlinger305 9.1OpenGLES與EGL305 9.2Android的硬件接口——HAL307 9.3Android終端顯示設備的“化身”——Gralloc與Framebuffer309 9.4Android中的本地窗口313 9.4.1FramebufferNativeWindow315 9.4.2應用程序端的本地窗口——Surface321 9.5BufferQueue詳解325 9.5.1BufferQueue的內(nèi)部原理325 9.5.2BufferQueue中的緩沖區(qū)分配328 9.5.3應用程序的典型繪圖流程333 9.5.4應用程序與BufferQueue的關(guān)系339 9.6SurfaceFlinger343 9.6.1“黃油計劃”——ProjectButter343 9.6.2SurfaceFlinger的啟動347 9.6.3接口的服務端——Client351 9.7VSync的產(chǎn)生和處理355 9.7.1VSync信號的產(chǎn)生和分發(fā)355 9.7.2VSync信號的處理361 9.7.3handleMessageTransaction363 9.7.4“界面已經(jīng)過時/無效,需要重新繪制”——handleMessageInvalidate367 9.7.5合成前的準備工作——preComposition369 9.7.6可見區(qū)域——rebuildLayerStacks371 9.7.7為“Composition”搭建環(huán)境——setUpHWComposer375 9.7.8doDebugFlashRegions377 9.7.9doComposition377 第10章GUI系統(tǒng)之“窗口管理員”—WMS385 10.1“窗口管理員”——WMS綜述386 10.1.1WMS的啟動388 10.1.2WMS的基礎(chǔ)功能388 10.1.3WMS的工作方式389 10.1.4WMS,AMS與Activity間的聯(lián)系390 10.2窗口屬性392 10.2.1窗口類型與層級392 10.2.2窗口策略(WindowPolicy)396 10.2.3窗口屬性(LayoutParams)398 10.3窗口的添加過程400 10.3.1系統(tǒng)窗口的添加過程400 10.3.2Activity窗口的添加過程409 10.3.3窗口添加實例412 10.4Surface管理416 10.4.1Surface申請流程(relayout)416 10.4.2Surface的跨進程傳遞420 10.4.3Surface的業(yè)務操作422 10.5performLayoutAndPlaceSurfacesLockedInner423 10.6窗口大小的計算過程424 10.7啟動窗口的添加與銷毀433 10.7.1啟動窗口的添加433 10.7.2啟動窗口的銷毀437 10.8窗口動畫438 10.8.1窗口動畫類型439 10.8.2動畫流程跟蹤——WindowStateAnimator440 10.8.3AppWindowAnimator444 10.8.4動畫的執(zhí)行過程446 第11章讓你的界面炫彩起來的GUI系統(tǒng)—View體系452 第12章“問渠哪得清如許,為有源頭活水來”—InputManagerService與輸入事件514 12.1事件的分類514 12.2事件的投遞流程517 12.2.1InputManagerService518 12.2.2InputReaderThread519 12.2.3InputDispatcherThread519 12.2.4ViewRootImpl對事件的派發(fā)523 12.3事件注入524 第13章應用不再同質(zhì)化—音頻系統(tǒng)526 13.1音頻基礎(chǔ)527 13.2音頻框架532 13.3音頻系統(tǒng)的核心——Audio-Flinger538 13.4策略的制定者——Audio-PolicyService553 13.5音頻流的回放——AudioTrack560 13.6音頻數(shù)據(jù)流572 13.7音量控制584 13.8音頻系統(tǒng)的上層建筑588 13.9Android支持的媒體格式600 13.10ID3信息簡述602 13.11Android多媒體文件管理606 第3篇應用原理篇 第14章Intent的匹配規(guī)則616 第15章APK應用程序的資源適配628 第16章Android字符編碼格式650 第17章Android和OpenGLES660 第18章“系統(tǒng)的UI”——SystemUI685 第19章Android常用的工具 第20章Android應用程序的編譯和打包707 第21章Android虛擬機725 21.1Android虛擬機基礎(chǔ)知識725 21.1.1Java虛擬機核心概念725 21.1.2LLVM編譯器框架734 21.1.3Android中的經(jīng)典垃圾回收算法736 21.1.4Art和Dalvik之爭738 21.1.5Art虛擬機整體框架741 21.1.6Android應用程序與虛擬機742 21.1.7ProcedureCallStandardforArmArchitecture(過程調(diào)用標準)744 21.1.8C++11標準中的新特性746 21.2Android虛擬機核心文件格式—Dex字節(jié)碼749 21.3Android虛擬機核心文件格式—可執(zhí)行文件的基石ELF756 21.3.1ELF文件格式756 21.3.2Linux平臺下ELF文件的加載和動態(tài)鏈接過程764 21.3.3AndroidLinker和動態(tài)鏈接庫771 21.3.4SignalHandler和FaultManager782 21.4Android虛擬機核心文件格式——“主宰者”O(jiān)AT786 21.4.1OAT文件格式解析786 21.4.2OAT的兩個編譯時機793 21.5Android虛擬機的典型啟動流程806 21.6堆管理器和堆空間釋義815 21.7Android虛擬機中的線程管理823 21.7.1Java線程的創(chuàng)建過程823 21.7.2線程的掛起過程827 21.8Art虛擬機中的代碼執(zhí)行方式綜述829 21.9Art虛擬機的“中樞系統(tǒng)”——執(zhí)行引擎之Interpreter836 21.10Art虛擬機的“中樞系統(tǒng)”——執(zhí)行引擎之JIT839 21.10.1JIT重出江湖的契機839 21.10.2AndroidN版本中JIT的設計目標及策略840 21.10.3ProfileGuidedCompilation(追蹤技術(shù))842 21.10.4AOTCompilationDaemon843 21.11Art虛擬機的“中樞系統(tǒng)”——執(zhí)行引擎之本地代碼844 21.12Androidx86版本兼容ARM二進制代碼——NativeBridge864 21.13Android應用程序調(diào)試原理解析871 21.13.1Java代碼調(diào)試與JDWP協(xié)議872 21.13.2Native代碼調(diào)試879 21.13.3利用GDB調(diào)試AndroidArt虛擬機885 第22章Android安全機制透析887 22.1AndroidSecurity綜述887 22.2SELinux889 22.2.1DAC889 22.2.2MAC890 22.2.3基于MAC的SELinux890 22.3Android系統(tǒng)安全保護的三重利劍892 22.3.1第一劍:Permission機制893 22.3.2加強劍:DAC(UGO)保護896 22.3.3終極劍:SEAndroid898 22.4SEAndroid剖析899 22.4.1SEAndroid的頂層模型899 22.4.2SEAndroid相關(guān)的核心源碼900 22.4.3SEAndroid標簽和規(guī)則901 22.4.4如何在Android系統(tǒng)中自定義SEAndroid903 22.4.5TE文件的語法規(guī)則905 22.4.6SEAndroid中的核心主體—init進程907 22.4.7SEAndroid中的客體912 22.5Android設備Root簡析913 22.6APK的加固保護分析916 第4篇Android系統(tǒng)工具 第23章IDE和Gradle922 23.1Gradle的核心要點922 23.1.1Groovy與Gradle923 23.1.2Gradle的生命周期926 23.2Gradle的Console語法927 23.3GradleWrapper和Cache929 23.4AndroidStudio和Gradle931 23.4.1Gradle插件基礎(chǔ)知識931 23.4.2AndroidStudio中的Gradle編譯腳本932 第24章軟件版本管理937 24.1版本管理簡述937 24.2Git的安裝937 24.2.1Linux環(huán)境下安裝Git938 24.2.2Windows環(huán)境下安裝Git939 24.3Git的使用939 24.3.1基礎(chǔ)配置939 24.3.2新建倉庫940 24.3.3文件狀態(tài)942 24.3.4忽略某些文件943 24.3.5提交更新944 24.3.6其他命令944 24.4Git原理簡析945 24.4.1分布式版本系統(tǒng)的特點946 24.4.2安全散列算法—SHA-1947 24.4.34個重要對象948 24.4.4三個區(qū)域953 24.4.5分支的概念與實例954 第25章系統(tǒng)調(diào)試輔助工具958 25.1萬能模擬器——Emulator958 25.1.1QEMU958 25.1.2Android工程中的QEMU963 25.1.3模擬器控制臺(EmulatorConsole)966 25.1.4實例:為Android模擬器添加串口功能969 25.2此Android非彼Android970 25.3快速建立與模擬器或真機的通信渠道——ADB972 25.3.1ADB的使用方法972 25.3.2ADB的組成元素975 25.3.3ADB源代碼解析976 25.3.4ADBProtocol981 25.4SDKLayoutlib984 25.5TraceView和Dmtracedump985 25.6Systrace987 25.7代碼覆蓋率統(tǒng)計992 25.8模擬GPS位置995
你還可能感興趣
我要評論
|