ADB——管理應用

ADB應用管理

  主要操做有查看應用列表、安裝應用、卸載應用、清楚應用數據與緩存、查看前臺Activity、查看應用信息及安裝路徑等等java

 

查看應用列表node

  查看應用列表的基本命令格式是python

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]

  即在adb shell pm list packages的基礎上能夠加一些參數進行過濾查看不一樣的列表,支持的過濾參數以下:android

參數 顯示列表
全部應用
-f 顯示應用關聯的 apk 文件
-d 只顯示 disabled 的應用
-e 只顯示 enabled 的應用
-s 只顯示系統應用
-3 只顯示第三方應用
-i 顯示應用的 installer
-u 包含已卸載應用
<FILTER> 包名包含<FILTER>的字符串
  • 查看全部應用
    adb shell pm list packages
    '''
    package:com.android.smoketest
    package:com.example.android.livecubes
    package:com.android.providers.telephony
    package:com.google.android.googlequicksearchbox
    package:com.android.providers.calendar
    package:com.android.providers.media
    package:com.android.protips
    package:com.android.documentsui
    package:com.android.gallery
    package:com.android.externalstorage
    ...
    // other packages here
    ...
    '''
  • 查看系統應用
    adb shell pm list packages -s
  • 查看第三方應用
    adb shell pm list packages -3
  • 查看某個包名中包含指定字符的應用
    # 好比要查看包名包含字符串 python 的應用列表
    adb shell pm list packages python
    
    # 也可使用 grep 來過濾:
    adb shell pm list packages | grep python

 

安裝應用git

adb install [-lrtsdg] <path_to_apk>

  

實際上 adb install 是分三步完成:github

  1. push apk 文件到 /data/local/tmp。web

  2. 調用 pm install 安裝。shell

  3. 刪除 /data/local/tmp 下的對應 apk 文件。緩存

  因此,必要的時候也能夠根據這個步驟,手動分步執行安裝過程。app

  adb install後面能夠跟一些可選參數來控制安裝 APK 的行爲,可用參數及含義以下:

參數 含義
-l 將應用安裝到保護目錄 /mnt/asec
-r 容許覆蓋安裝
-t 容許安裝 AndroidManifest.xml 裏 application 指定android:testOnly="true"的應用
-s 將應用安裝到 sdcard
-d 容許降級覆蓋安裝
-g 授予全部運行時權限

  運行命令後若是見到相似以下輸出(狀態爲Success)表明安裝成功:

# 當前最新版 v1.0.36 的 adb 的輸出,會顯示 push apk 文件到手機的進度百分比。
[100%] /data/local/tmp/1.apk
    pkg: /data/local/tmp/1.apk
Success

# 使用舊版本 adb 的輸出則是這樣的:
12040 KB/s (22205609 bytes in 1.801s)
        pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success

# 若是狀態爲 Failure 則表示安裝失敗,好比:
[100%] /data/local/tmp/map-20160831.apk
        pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

 

  常見安裝失敗輸出代碼、含義及可能的解決辦法以下:

輸出 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應用已經存在,或卸載了但沒卸載乾淨 adb install使用 -r 參數,或者先adb uninstall <packagename>再安裝
INSTALL_FAILED_INVALID_APK 無效的 APK 文件  
INSTALL_FAILED_INVALID_URI 無效的 APK 文件名 確保 APK 文件名裏無中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空間不足 清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE 已經存在同名程序  
INSTALL_FAILED_NO_SHARED_USER 請求的共享用戶不存在  
INSTALL_FAILED_UPDATE_INCOMPATIBLE 之前安裝過同名應用,但卸載時數據沒有移除;或者已安裝該應用,但簽名不一致 先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 請求的共享用戶存在但簽名不一致  
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安裝包使用了設備上不可用的共享庫  
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替換時沒法刪除  
INSTALL_FAILED_DEXOPT dex 優化驗證失敗或空間不足  
INSTALL_FAILED_OLDER_SDK 設備系統版本低於應用要求  
INSTALL_FAILED_CONFLICTING_PROVIDER 設備裏已經存在與應用裏同名的content provider  
INSTALL_FAILED_NEWER_SDK 設備系統版本高於應用要求  
INSTALL_FAILED_TEST_ONLY 應用是 test-only 的,但安裝時沒有指定 -t 參數  
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容設備 CPU 應用程序二進制接口的 native code  
INSTALL_FAILED_MISSING_FEATURE 應用使用了設備不可用的功能  
INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 訪問失敗;
2. 應用簽名與 ROM 簽名一致,被看成內置應用。
1. 確認 sdcard 可用,或者安裝到內置存儲;
2. 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安裝到指定位置;
2. 應用簽名與 ROM 簽名一致,被看成內置應用。
1. 切換安裝位置,添加或刪除 -s 參數;
2. 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_MEDIA_UNAVAILABLE 安裝位置不可用 通常爲 sdcard,確認 sdcard 可用或安裝到內置存儲
INSTALL_FAILED_VERIFICATION_TIMEOUT 驗證安裝包超時  
INSTALL_FAILED_VERIFICATION_FAILURE 驗證安裝包失敗  
INSTALL_FAILED_PACKAGE_CHANGED 應用與調用程序指望的不一致  
INSTALL_FAILED_UID_CHANGED 之前安裝過該應用,與本次分配的 UID 不一致 清除之前安裝過的殘留文件
INSTALL_FAILED_VERSION_DOWNGRADE 已經安裝了該應用更高版本 使用 -d 參數
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安裝 target SDK 支持運行時權限的同名應用,要安裝的版本不支持運行時權限  
INSTALL_PARSE_FAILED_NOT_APK 指定路徑不是文件,或不是以 .apk 結尾  
INSTALL_PARSE_FAILED_BAD_MANIFEST 沒法解析的 AndroidManifest.xml 文件  
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到異常  
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安裝包沒有簽名  
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安裝該應用,且簽名與 APK 文件不一致 先卸載設備上的該應用,再安裝
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK 文件時遇到CertificateEncodingException  
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest 文件裏沒有或者使用了無效的包名  
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件裏指定了無效的共享用戶 ID  
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest 文件時遇到結構性錯誤  
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest 文件裏找不到找可操做標籤(instrumentation 或 application)  
INSTALL_FAILED_INTERNAL_ERROR 因系統問題安裝失敗  
INSTALL_FAILED_USER_RESTRICTED 用戶被限制安裝應用 在開發者選項裏將「USB安裝」打開,若是已經打開了,那先關閉再打開。
INSTALL_FAILED_DUPLICATE_PERMISSION 應用嘗試定義一個已經存在的權限名稱  
INSTALL_FAILED_NO_MATCHING_ABIS 應用包含設備的應用程序二進制接口不支持的 native code  
INSTALL_CANCELED_BY_USER 應用安裝須要在設備上確認,但未操做設備或點了取消 在設備上贊成安裝
INSTALL_FAILED_ACWF_INCOMPATIBLE 應用程序與設備不兼容  
INSTALL_FAILED_TEST_ONLY APK 文件是使用 Android Studio 直接 RUN 編譯出來的文件 經過 Gradle 的 assembleDebug 或 assembleRelease 從新編譯,或者 Generate Signed APK
does not contain AndroidManifest.xml 無效的 APK 文件  
is not a valid zip file 無效的 APK 文件  
Offline 設備未鏈接成功 先將設備與 adb 鏈接成功
unauthorized 設備未受權容許調試  
error: device not found 沒有鏈接成功的設備 先將設備與 adb 鏈接成功
protocol failure 設備已斷開鏈接 先將設備與 adb 鏈接成功
Unknown option: -s Android 2.2 如下不支持安裝到 sdcard 不使用 -s 參數
No space left on device 空間不足 清理空間
Permission denied ... sdcard ... sdcard 不可用  
signatures do not match the previously installed version; ignoring! 已安裝該應用且簽名不一致 先卸載設備上的該應用,再安裝

參考:PackageManager.java

 

卸載應用

adb uninstall [-k] <packagename>
# <packagename> 表示應用的包名,-k 參數可選,表示卸載應用但保留數據和緩存目錄。

adb uninstall com.qihoo360.mobilesafe # 卸載 360 手機衛士。

 

清楚應用數據與緩存

adb shell pm clear <packagename>
# <packagename> 表示應用名包,這條命令的效果至關於在設置裏的應用信息界面點擊了「清除緩存」和「清除數據」。

adb shell pm clear com.qihoo360.mobilesafe # 表示清除 360 手機衛士的數據和緩存。

 

查看前臺Activity

adb shell dumpsys activity activities | grep mFocusedActivity
# mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
# 其中的com.cyanogenmod.trebuchet/com.android.launcher3.Launcher 就是當前處於前臺的 Activity。

 

查看運行的services

adb shell dumpsys activity services [<packagename>]
# <packagename> 參數不是必須的,指定 <packagename> 表示查看與某個包名相關的 Services,不指定表示查看全部 Services。
# <packagename> 不必定要給出完整的包名,好比運行adb shell dumpsys activity services org.xxx,那麼包名org.xxx.demo一、org.xxx.demo2 和 org.xxx123 等相關的Services都會列出來。

 

查看應用信息

adb shell dumpsys package <packagename> # <packagename> 表示應用包名。
# 輸出中包含不少信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝後的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。
Activity Resolver Table:
  Non-Data Actions:
      android.intent.action.MAIN:
        5b4cba8 org.mazhuang.guanggoo/.SplashActivity filter 5ec9dcc
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.LAUNCHER"
          AutoVerify=false

Registered ContentProviders:
  org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider:
    Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}

ContentProvider Authorities:
  [org.mazhuang.guanggoo.fileProvider]:
    Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
      applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}

Key Set Manager:
  [org.mazhuang.guanggoo]
      Signing KeySets: 501

Packages:
  Package [org.mazhuang.guanggoo] (c1d7f):
    userId=10394
    pkg=Package{55f714c org.mazhuang.guanggoo}
    codePath=/data/app/org.mazhuang.guanggoo-2
    resourcePath=/data/app/org.mazhuang.guanggoo-2
    legacyNativeLibraryDir=/data/app/org.mazhuang.guanggoo-2/lib
    primaryCpuAbi=null
    secondaryCpuAbi=null
    versionCode=74 minSdk=15 targetSdk=25
    versionName=1.1.74
    splits=[base]
    apkSigningVersion=2
    applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    privateFlags=[ RESIZEABLE_ACTIVITIES ]
    dataDir=/data/user/0/org.mazhuang.guanggoo
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    timeStamp=2017-10-22 23:50:53
    firstInstallTime=2017-10-22 23:50:25
    lastUpdateTime=2017-10-22 23:50:55
    installerPackageName=com.miui.packageinstaller
    signatures=PackageSignatures{af09595 [53c7caa2]}
    installPermissionsFixed=true installStatus=1
    pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    requested permissions:
      android.permission.READ_PHONE_STATE
      android.permission.INTERNET
      android.permission.ACCESS_NETWORK_STATE
      android.permission.ACCESS_WIFI_STATE
      android.permission.READ_LOGS
      android.permission.WRITE_EXTERNAL_STORAGE
      android.permission.READ_EXTERNAL_STORAGE
    install permissions:
      android.permission.INTERNET: granted=true
      android.permission.ACCESS_NETWORK_STATE: granted=true
      android.permission.ACCESS_WIFI_STATE: granted=true
    User 0: ceDataInode=1155675 installed=true hidden=false suspended=false stopped=true notLaunched=false enabled=0
      gids=[3003]
      runtime permissions:
        android.permission.READ_EXTERNAL_STORAGE: granted=true
        android.permission.READ_PHONE_STATE: granted=true
        android.permission.WRITE_EXTERNAL_STORAGE: granted=true
    User 999: ceDataInode=0 installed=false hidden=false suspended=false stopped=true notLaunched=true enabled=0
      gids=[3003]
      runtime permissions:


Dexopt state:
  [org.mazhuang.guanggoo]
    Instruction Set: arm64
      path: /data/app/org.mazhuang.guanggoo-2/base.apk
      status: /data/app/org.mazhuang.guanggoo-2/oat/arm64/base.odex [compilation_filter=speed-profile, status=kOatUpToDa
      te]
輸出示例

 

查看應用安裝路徑

adb shell pm path <PACKAGE>
#
adb shell pm path ecarx.weather # package:/data/app/ecarx.weather-1.apk
相關文章
相關標籤/搜索