Android中adb push和adb install的使用區別 轉載
本篇文章由史迎春(@三俗小女子)投稿。轉載請注明原文地址。
在Android實際開發中,經常會使用adb命令,安裝應用程序可以使用adb push 或者adb install。下面就來講講這兩種安裝方式的區別。
- adb push 能夠指定安裝目錄。比如執行”adb push xxx.apk system/app” 后,xxx.apk被安裝到了system/app目錄下,此目錄下的軟件為上文中提到的system application。(注意,system/app是只讀的,所以只有有root權限才能push apk進去,而且在push進去的apk會把原本的apk覆蓋掉。)adb push本身的意思是將文件復制到系統中的某個文件夾下,但是將apk push到system/app下並且重啟手機以后會注冊應用程序。
- adb install 用此命令安裝的軟件位於 data/app 目錄,帶有參數 -r才能強制安裝,為user application。
由以上兩條可知,adb install和adb push的apk主要區別有:
| push | install | |
| 目錄 | system/app | data/app |
| 權限 | 系統級(權限全開) | 用戶級(沒全開) |
| 卸載 | root后刪除 | 可卸載 |
| 大小 | 無限制,自定義 | 有限制 |
| 安裝 | pm重新注冊 | 不會重新弄注冊 |
手動安裝的APK版本號和系統內置API版本號一樣。
更深一層的分析:
1、Android系統應用更新機制
- 系統為每個應用在AndroidMainfest.xml提供了versionName、versionCode兩個屬性。
- versionName:String類型,用來給應用的使用者來查看版本.
- versionCode:Integer類型,作為系統判斷應用是否能升級的依據。
2、Android系統內置應用更新判斷代碼
- 代碼來自frameworks/base/services/java/com/android/server/PackageManagerService.java 中 scanPackageLI函數的package更新判斷條件
由以上資料分析:
- 同一個AP,若在data/app下有更高版本的app,但是system下有舊版本,則follow舊版本。
- 又已知如果有兩個以上的AP在同一個進程但是只有一個AP更改了API version則編譯會出錯
- 假設有兩個AP:AP1和AP2.兩個AP都在API Version更新以后build通過且install進手機。且系統中有內置AP1是舊版本的,重新開機的時候還是會注冊舊版本的AP1。則此時,系統中就會出現相同進程但是不同版本的AP1(system/app)和AP2(data/app)
綜上,編譯會出錯。
猜測:
- 若同一個進程的AP都用同一版本的SDK編譯,push進手機,則可以運行(已驗證)。
- 若同一進程的AP都用同一個版本的SDK編譯。install進手機,則可以運行,前提是刪除system/app內所有同一進程AP。(已驗證)
- 若同一個進程的AP都用同一個版本的SDK編譯,push/install進手機都可以(待驗證)。
補充:用push時會將原來系統中的對應的apk覆蓋掉,所以,最好先備份出來一份,用如下命令:
adb pull /system/app/xxxx.apk /home/
