寫這篇文章主要解決以下幾個問題:
1.為什么我配置了Android SDk 還要配置JDK呢?這兩者到底是什么關(guān)系菩佑?
2.JVM是java程序的運行環(huán)境自晰, Dalvik 是android程序的運行環(huán)境,而android是用java語言編寫的稍坯,那么 JVM 與Dalvik是什么關(guān)系呢酬荞?
3.為什么我下載的JDK有兩個文件夾,一個是jdk瞧哟,一個是jre混巧。而jdk文件中其實已經(jīng)包含了jre,為什么有兩個呢勤揩?
4.為什么我不配置jdk的環(huán)境變量打不開eclipse咧党,配置了之后,可以進入了陨亡,不過進入了eclipse之后還要配置jdk的路徑呢傍衡?
5.Android打包過程中,產(chǎn)生的65536錯誤的原因是什么负蠕?
下面我聽我娓娓道來聪舒,到最后上邊幾個問題就都解決了。
我們從官網(wǎng)下載JDK虐急,解壓后是下邊的這個文件夾箱残。
很明顯,這個文件夾中既有JDK,又有JRE被辑。而且燎悍,打開jdk的文件夾,可以看到:
這里面也有一個jre的文件夾盼理,而且它們的大小都差不多谈山,里面的內(nèi)容也都差不多。
這時候我們需要在環(huán)境變量中加入jdk的路徑宏怔,如果不加入的話會發(fā)現(xiàn)打不開eclipse奏路,這是為什么呢臊诊?
大家都知道鸽粉,jre是java的運行環(huán)境,也就是說配置好jre以后抓艳,java程序就可以運行了触机。jdk是java程序的開發(fā)編譯運行所需的。
而eclipse是用java編寫的玷或,所以他需要jre才可以運行儡首。所以如果不加入的話會發(fā)現(xiàn)打不開eclipse。電腦中的其他用java編寫的程序沒有jre也是不能運行的偏友。
所以上邊jdk外邊的這個jre就是做這個用的蔬胯。而jdk里面的jre,是在ide(集成開發(fā)環(huán)境位他,如eclipse)里面編譯運行java程序用的氛濒。
JDK除了jre之外,主要還包括類庫(lib文件夾中棱诱,封裝了java常用類)和工具(bin文件夾中泼橘,如java文件到class文件的編譯程序)。
打開eclipse->Preferebces->java->Installed JREs,會發(fā)現(xiàn)Location為jdk的目錄迈勋,如下圖:
說明eclipse的編譯開發(fā)環(huán)境用的是jdk文件夾下的jre炬灭。
好,弄清楚這個問題靡菇,我們接續(xù)探究jre與jdk邏輯關(guān)系呢重归?這邊這張圖可以很清楚的說明問題。
上圖是從整體上闡述了jre和jdk的關(guān)系厦凤,那么jre作為java的運行環(huán)境鼻吮,他究竟是怎么工作的呢?這就不得不說說jdk的組成较鼓,它由基本的類庫椎木,工具和jre組成(當然還包括其他的违柏,這里不過多討論),類庫就是java封裝好的一系列類(都繼承于Object)香椎。.java文件首先要編譯成.class文件漱竖,才能放到JVM中運行,那JVM和JRE又是什么關(guān)系呢畜伐?我們來看下邊這張圖:
從圖中我們可以清晰的看到JVM實際上是JRE的一部分馍惹,jre除了JVM之外還包括JVM運行時所需要的類庫(lib文件夾下),打開jre的文件夾玛界,如下圖:
我們可以清晰的看到它包括兩個文件夾:bin和lib万矾,bin里面放的是可執(zhí)行文件,可以理解為JVM慎框,lib里面放的是JVM依賴的類庫良狈。
好了到這里 JDK、JRE鲤脏、JVM的關(guān)系清楚了吧们颜?那么我們接著來探究Andriod SDK 與前三者是什么關(guān)系呢吕朵?為什么配置Andriod SDK之前必須配置好JDK呢猎醇?
原因其實很簡單,因為Andriod是用java語言開發(fā)的努溃,所以其依賴的類庫是在JDK中硫嘶,最終編寫好的.java文件還要通過JDK中的工具編譯成.class文件。唯一不同的是編譯成
.class文件之后梧税,它不是放在JVM中運行沦疾,而是通過打包工具ant,打包成DEX格式的文件在Android的的虛擬機Dalvik中運行第队。
這里可能還有一個疑問哮塞?android最終不是打包成了APK了嘛?這里怎么又出現(xiàn)了DEX凳谦?
APK其實只是個壓縮文件忆畅,安裝用的,安裝好之后Dalvik其實還是解析的APK解壓出的DEX文件尸执,來加載里面的.class文件來執(zhí)行家凯。
為了便于理解,請見下圖:
至于JVM 與Dalvik的差別如失,從上述的討論中很明顯的看出:
JVM解釋運行的是.class文件绊诲,而Dalvik解釋運行的是.dex文件(其實dex就是class的打包形式,最終還是解釋運行的還是dex中的class)褪贵。
再有其他的不同就是:
JVM是基于棧作為存儲空間的掂之,而Dalvik是基于寄存器的,而且每個安卓應(yīng)用都有自己的Dalvik虛擬機,而JVM所以應(yīng)用只有一個世舰。
具體還有其他的不同橄镜,讀者可以參考網(wǎng)上的其他文章,講的都很詳細冯乘,不在本文的討論范圍固不多贅述了洽胶。
PS:由于Dalvik是基于寄存器的,而寄存器的數(shù)量有65536個裆馒,所以我們會發(fā)現(xiàn)當dex太大的時候姊氓,會報65536的錯誤,這時候就明白了為什么大型的APP需要分包處理了喷好。
至此JDK JRE Android SDk JVM Dalvik 的關(guān)系是不是都清楚了翔横。