Android Studio詳細(xì)的顯示了如何編譯和運(yùn)行你的App憔狞,但是你是否想知道當(dāng)你按下Run按鈕時(shí)蝴悉,它做了什么?
這里介紹他們是如何編譯的
Java部分
你的代碼是Java寫的瘾敢,但是編譯是否按照J(rèn)ava的方式呢拍冠,一個(gè)網(wǎng)頁應(yīng)用呢?
Android應(yīng)用的編譯和Java應(yīng)用的編譯有很大的不同簇抵。但開始的時(shí)候是一樣的:Java源碼會(huì)經(jīng)過經(jīng)過 javac
命令庆杜,被編譯為.class
文件:
轉(zhuǎn)變的代碼如下:
public MainActivity() {
super();
currentPosition = 0;
}
轉(zhuǎn)換成字節(jié)代碼如下
public com.hfad.bitsandpizzas.MainActivity();
Code:
0: aload_0
1: invokespecial #5; //Method android/app/Activity."<init>":()V
4: aload_0
5: iconst_0
6: putfield #3; //Field currentPosition:I
9: return
轉(zhuǎn)換為Dalvik字節(jié)代碼
.class
文件包含標(biāo)準(zhǔn)的 Oracle JVM Java字節(jié)代碼,但是Android設(shè)備沒有使用這種格式的字節(jié)代碼碟摆,而是使用了它自己的獨(dú)特的自己代碼格式Dalvik晃财,就像Oracle JVM字節(jié)代碼一樣,都是機(jī)器代碼的一種說明典蜕。
這個(gè)編譯過程需要將.class
文件和所有的.jar
庫文件轉(zhuǎn)換為一個(gè)單獨(dú)的包含Dalvik字節(jié)代碼的classes.dex
文件断盛,用來完成這項(xiàng)任務(wù)的是dx
命令:
dx
命令將所有的.class
文件和.jar
文件縫合成一個(gè)classes.dex
文件。Dalvik將原始的Java代碼轉(zhuǎn)換為如下:
0x0000: iput-object v1, v0, Lcom/hfad/bitsandpizzas/MainActivity; com.hfad.bitsandpizzas.MainActivity$2.this$0 // field@4869
0x0002: invoke-direct {v0}, void java.lang.Object.<init>() // method@13682
0x0005: return-void
將classes.dex和資源打包
classes.dex
文件和資源文件愉舔,如:圖片钢猛,布局等,將他們壓縮進(jìn)一個(gè) zip文件轩缤,叫做安裝包命迈,或者.apk文件,完成這項(xiàng)任務(wù)的命令叫做 aapt
火的。
.apk
文件就是你需要的應(yīng)用文件壶愤,你可以發(fā)布了,但是馏鹤,或許你需要知道另外一步...
你可能需要將.apk文件簽名
如果你要在Google Play商店發(fā)布你的應(yīng)用征椒,你需要給這個(gè)應(yīng)用簽名,簽名意味著你在.apk
文件添加了一個(gè)獨(dú)一無二的文件假瞬,基于校驗(yàn).apk
文件和私有的密匙陕靠。
.apk
文件使用標(biāo)準(zhǔn)的jarsigner
工具編譯迂尝,jarsigner
是用于編輯.jar
文件的,但對(duì).apk
文件依然有效剪芥,因?yàn)樗麄兌际?code>.zip格式的文件垄开。
如果你要編譯.apk
文件,你還需要一個(gè)叫zipalign
的工具税肪,用來確保壓縮的正確性溉躲。
如何部署
如果Adb進(jìn)程沒有運(yùn)行,它會(huì)自動(dòng)啟動(dòng)
將app部署到Android設(shè)備的工具是adb
(Android Debug Bridge)益兄,adb
在你的開發(fā)環(huán)境和Android設(shè)備上各有一套锻梳,如果你的機(jī)器上沒有運(yùn)行adb進(jìn)程,adb
命令會(huì)啟動(dòng)這個(gè)進(jìn)程
adb
進(jìn)程將會(huì)打開一個(gè)網(wǎng)絡(luò)socket并在5037端口監(jiān)聽命令净捅。每個(gè)你輸入的
adb
命令將會(huì)在這個(gè)端口發(fā)送疑枯。
.apk文件被安裝到設(shè)備上
adb
命令用于將.apk
文件傳輸?shù)紸ndroid文件系統(tǒng)中,位置在/data/app/com.xxx.xxx下蛔六,其中com.xxx.xxx就是應(yīng)用的包名荆永。