主頁 > 移動端開發 > 安卓常用shell命令大全

安卓常用shell命令大全

2023-02-10 08:39:35 移動端開發

前言

這篇筆記用來收集在日常開發中所用到的安卓adb shell命令,參照了一些大佬的再加上我自己平時用到的整理在了一塊兒,感謝無私共享的大佬們,

將會持續更新,歡迎收藏~

一、基本用法

命令語法

adb 命令的基本語法如下:

adb [-d|-e|-s <serialNumber>] <command>

如果只有一個設備/模擬器連接時,可以省略掉 [-d|-e|-s <serialNumber>] 這一部分,直接使用 adb <command>

為命令指定目標設備

如果有多個設備/模擬器連接,則需要為命令指定目標設備,

引數 含義
-d 指定當前唯一通過 USB 連接的 Android 設備為命令目標
-e 指定當前唯一運行的模擬器為命令目標
-s <serialNumber> 指定相應 serialNumber 號的設備/模擬器為命令目標

在多個設備/模擬器連接的情況下較常用的是 -s <serialNumber> 引數,serialNumber 可以通過 adb devices 命令獲取,如:

$ adb devices

List of devices attached
cf264b8f	device
emulator-5554	device
10.129.164.6:5555	device

輸出里的 cf264b8femulator-555410.129.164.6:5555 即為 serialNumber,

比如這時想指定 cf264b8f 這個設備來運行 adb 命令獲取螢屏解析度:

adb -s cf264b8f shell wm size

又如想給 10.129.164.6:5555 這個設備安裝應用(這種形式的 serialNumber 格式為 <IP>:<Port>,一般為無線連接的設備或 Genymotion 等第三方 Android 模擬器):

adb -s 10.129.164.6:5555 install test.apk

遇到多設備/模擬器的情況均使用這幾個引數為命令指定目標設備,下文中為簡化描述,不再重復,

啟動/停止

啟動 adb server 命令:

adb start-server

(一般無需手動執行此命令,在運行 adb 命令時若發現 adb server 沒有啟動會自動調起,)

停止 adb server 命令:

adb kill-server

查看 adb 版本

命令:

adb version

示例輸出:

Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android

以 root 權限運行 adbd

adb 的運行原理是 PC 端的 adb server 與手機端的守護行程 adbd 建立連接,然后 PC 端的 adb client 通過 adb server 轉發命令,adbd 接收命令后決議運行,

所以如果 adbd 以普通權限執行,有些需要 root 權限才能執行的命令無法直接用 adb xxx 執行,這時可以 adb shell 然后 su 后執行命令,也可以讓 adbd 以 root 權限執行,這個就能隨意執行高權限命令了,

命令:

adb root

正常輸出:

restarting adbd as root

現在再運行 adb shell,看看命令列提示符是不是變成 # 了?

有些手機 root 后也無法通過 adb root 命令讓 adbd 以 root 權限執行,比如三星的部分機型,會提示 adbd cannot run as root in production builds,此時可以先安裝 adbd Insecure,然后 adb root 試試,

相應地,如果要恢復 adbd 為非 root 權限的話,可以使用 adb unroot 命令,

指定 adb server 的網路埠

命令:

adb -P <port> start-server

默認埠為 5037,

二、設備連接管理

查詢已連接設備/模擬器

命令:

adb devices

輸出示例:

List of devices attached
cf264b8f	device
emulator-5554	device
10.129.164.6:5555	device

輸出格式為 [serialNumber] [state],serialNumber 即我們常說的 SN,state 有如下幾種:

  • offline —— 表示設備未連接成功或無回應,

  • device —— 設備已連接,注意這個狀態并不能標識 Android 系統已經完全啟動和可操作,在設備啟動程序中設備實體就可連接到 adb,但啟動完畢后系統才處于可操作狀態,

  • no device —— 沒有設備/模擬器連接,

以上輸出顯示當前已經連接了三臺設備/模擬器,cf264b8femulator-555410.129.164.6:5555 分別是它們的 SN,從 emulator-5554 這個名字可以看出它是一個 Android 模擬器,而 10.129.164.6:5555 這種形為 <IP>:<Port> 的 serialNumber 一般是無線連接的設備或 Genymotion 等第三方 Android 模擬器,

常見例外輸出:

  1. 沒有設備/模擬器連接成功,

    List of devices attached
    
  2. 設備/模擬器未連接到 adb 或無回應,

    List of devices attached
    cf264b8f	offline
    

USB 連接

通過 USB 連接來正常使用 adb 需要保證幾點:

  1. 硬體狀態正常,

    包括 Android 設備處于正常開機狀態,USB 連接線和各種介面完好,

  2. Android 設備的開發者選項和 USB 除錯模式已開啟,

    可以到「設定」-「開發者選項」-「Android 除錯」查看,

    如果在設定里找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設定」-「關于手機」連續點擊「版本號」7 次,

  3. 設備驅動狀態正常,

    這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「設備管理器」里查看相關設備上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了,否則可以下載一個手機助手類程式來安裝驅動先,

  4. 通過 USB 線連接好電腦和設備后確認狀態,

    adb devices
    

    如果能看到

    xxxxxx device
    

    說明連接成功,

無線連接(Android11 及以上)

Android 11 及更高版本支持使用 Android 除錯橋 (adb) 從作業站以無線方式部署和除錯應用,例如,您可以將可除錯應用部署到多臺遠程設備,而無需通過 USB 實際連接設備,這樣就可以避免常見的 USB 連接問題,例如驅動程式安裝方面的問題,

官方檔案

操作步驟:

  1. 更新到最新版本的 SDK 平臺工具(至少30.0.0),

  2. 將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi,

  3. 在開發者選項中啟用無線除錯

  4. 在詢問要允許在此網路上進行無線除錯嗎?的對話框中,點擊允許,

  5. 選擇使用配對碼配對設備,使用彈窗中的 IP 地址和埠號,

adb pair ipaddr:port
  1. 提示Enter pairing code: 時輸入彈窗中的配對碼,成功后會顯示Successfully paired to ...

  2. 使用無線除錯下的 IP 地址和埠

adb connect ipaddr:port
  1. 確認連接狀態,

    adb devices
    

    如果能看到

    ipaddr:port device
    

說明連接成功,

無線連接(需要借助 USB 線)

除了可以通過 USB 連接設備與電腦來使用 adb,也可以通過無線連接——雖然連接程序中也有需要使用 USB 的步驟,但是連接成功之后你的設備就可以在一定范圍內擺脫 USB 連接線的限制啦!

操作步驟:

  1. 將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi,

  2. 將設備與電腦通過 USB 線連接,

    應確保連接成功(可運行 adb devices 看是否能列出該設備),

  3. 讓設備在 5555 埠監聽 TCP/IP 連接:

    adb tcpip 5555
    
  4. 斷開 USB 連接,

  5. 找到設備的 IP 地址,

    一般能在「設定」-「關于手機」-「狀態資訊」-「IP地址」找到,也可以使用下文里 [查看設備資訊 - IP 地址][1] 一節里的方法用 adb 命令來查看,

  6. 通過 IP 地址連接設備,

    adb connect <device-ip-address>
    

    這里的 <device-ip-address> 就是上一步中找到的設備 IP 地址,

  7. 確認連接狀態,

    adb devices
    

    如果能看到

    <device-ip-address>:5555 device
    

    說明連接成功,

如果連接不了,請確認 Android 設備與電腦是連接到了同一個 WiFi,然后再次執行 adb connect <device-ip-address> 那一步;

如果還是不行的話,通過 adb kill-server 重新啟動 adb 然后從頭再來一次試試,

斷開無線連接

命令:

adb disconnect <device-ip-address>

無線連接(無需借助 USB 線)

注:需要 root 權限,

上一節「無線連接(需要借助 USB 線)」是官方檔案里介紹的方法,需要借助于 USB 資料線來實作無線連接,

既然我們想要實作無線連接,那能不能所有步驟下來都是無線的呢?答案是能的,

  1. 在 Android 設備上安裝一個終端模擬器,

    已經安裝過的設備可以跳過此步,我使用的終端模擬器下載地址是:Terminal Emulator for Android Downloads

  2. 將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi,

  3. 打開 Android 設備上的終端模擬器,在里面依次運行命令:

    su
    setprop service.adb.tcp.port 5555
    
  4. 找到 Android 設備的 IP 地址,

    一般能在「設定」-「關于手機」-「狀態資訊」-「IP地址」找到,也可以使用下文里 [查看設備資訊 - IP 地址][1] 一節里的方法用 adb 命令來查看,

  5. 在電腦上通過 adb 和 IP 地址連接 Android 設備,

    adb connect <device-ip-address>
    

    這里的 <device-ip-address> 就是上一步中找到的設備 IP 地址,

    如果能看到 connected to <device-ip-address>:5555 這樣的輸出則表示連接成功,

節注一:

有的設備,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重啟 adbd 服務,在設備的終端模擬器上運行:

restart adbd

如果 restart 無效,嘗試以下命令:

stop adbd
start adbd

三、應用管理

查看應用串列

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

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

即在 adb shell pm list packages 的基礎上可以加一些引數進行過濾查看不同的串列,支持的過濾引數如下:

引數 顯示串列
所有應用
-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

包名包含某字串的應用

比如要查看包名包含字串 mazhuang 的應用串列,命令:

adb shell pm list packages mazhuang

當然也可以使用 grep 來過濾:

adb shell pm list packages | grep mazhuang

安裝 APK

命令格式:

adb install [-lrtsdg] <path_to_apk>

引數:

adb install 后面可以跟一些可選引數來控制安裝 APK 的行為,可用引數及含義如下:

引數 含義
-l 將應用安裝到保護目錄 /mnt/asec
-r 允許覆寫安裝
-t 允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的應用
-s 將應用安裝到 sdcard
-d 允許降級覆寫安裝
-g 授予所有運行時權限
--abi abi-identifier 為特定 ABI 強制安裝 apk,abi-identifier 可以是 armeabi-v7a、arm64-v8a、v86、x86_64 等

運行命令后如果見到類似如下輸出(狀態為 Success)代表安裝成功:

[100%] /data/local/tmp/1.apk
	pkg: /data/local/tmp/1.apk
Success

上面是當前最新版 v1.0.36 的 adb 的輸出,會顯示 push apk 檔案到手機的進度百分比,

使用舊版本 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 install 內部原理簡介

adb install 實際是分三步完成:

  1. push apk 檔案到 /data/local/tmp,

  2. 呼叫 pm install 安裝,

  3. 洗掉 /data/local/tmp 下的對應 apk 檔案,

所以,必要的時候也可以根據這個步驟,手動分步執行安裝程序,

卸載應用

命令:

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 mResumedActivity

輸出示例:

mResumedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}

其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher 就是當前處于前臺的 Activity,

在 Windows 下以上命令可能不可用,可以嘗試 adb shell dumpsys activity activities | findstr mResumedActivityadb shell "dumpsys activity activities | grep mResumedActivity"

查看正在運行的 Services

命令:

adb shell dumpsys activity services [<packagename>]

<packagename> 引數不是必須的,指定 <packagename> 表示查看與某個包名相關的 Services,不指定表示查看所有 Services,

<packagename> 不一定要給出完整的包名,比如運行 adb shell dumpsys activity services org.mazhuang,那么包名 org.mazhuang.demo1org.mazhuang.demo2org.mazhuang123 等相關的 Services 都會列出來,

查看應用詳細資訊

命令:

adb shell dumpsys package <packagename>

輸出中包含很多資訊,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝后的檔案資源代碼等路徑、版本資訊、權限資訊和授予狀態、簽名版本資訊等,

<packagename> 表示應用包名,

輸出示例:

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

四、與應用互動

通常情況下adb與應用互動需要知道包名和Activity名,這里介紹了個在win系統時獲取這些名的方法

命令:

aapt dump badging 包名(apk)| findstr package

這里實際是用了兩個命令:aaptfindstr,aapt獲取APK資訊,findstr查找包含package的行(類似于linux的grep),結果如下:

package: name='com.naeiq1est.navi' versionCode='2023013001' versionName='2023.01.30.01'

以上為獲取到了包名,如需獲取到Activity名只需要修改findstr的字串為activity,結果如下:

launchable activity name='com.naviquest.navi.ScreenConfig'label='??????' icon=''

命令介紹

主要是使用 am <command> 命令,常用的 <command> 如下:

command 用途
start [options] <INTENT> 啟動 <INTENT> 指定的 Activity
startservice [options] <INTENT> 啟動 <INTENT> 指定的 Service
broadcast [options] <INTENT> 發送 <INTENT> 指定的廣播
force-stop <packagename> 停止 <packagename> 相關的行程

<INTENT> 引數很靈活,和寫 Android 程式時代碼里的 Intent 相對應,

用于決定 intent 物件的選項如下:

引數 含義
-a <ACTION> 指定 action,比如 android.intent.action.VIEW
-c <CATEGORY> 指定 category,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT> 指定完整 component 名,用于明確指定啟動哪個 Activity,如 com.example.app/.ExampleActivity

<INTENT> 里還能帶資料,就像寫代碼時的 Bundle 一樣:

引數 含義
--esn <EXTRA_KEY> null 值(只有 key 名)
`-e --es <EXTRA_KEY> <EXTRA_STRING_VALUE>`
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> boolean 值
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> integer 值
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> long 值
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> float 值
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> URI
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> component name
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] integer 陣列
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] long 陣列

啟動應用/ 調起 Activity

指定Activity名稱啟動

命令格式:

adb shell am start [options] <INTENT>

例如:

adb shell am start -n com.tencent.mm/.ui.LauncherUI

表示調起微信主界面,

adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"

表示調起 org.mazhuang.boottimemeasure/.MainActivity 并傳給它 string 資料鍵值對 toast - hello, world

不指定Activity名稱啟動(啟動主Activity)

命令格式:

adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1

例如:

adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1

表示調起微信主界面,

調起 Service

命令格式:

adb shell am startservice [options] <INTENT>

例如:

adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService

表示調起微信的某 Service,

另外一個典型的用例是如果設備上原本應該顯示虛擬按鍵但是沒有顯示,可以試試這個:

adb shell am startservice -n com.android.systemui/.SystemUIService

停止 Service

命令格式:

adb shell am stopservice [options] <INTENT>

發送廣播

命令格式:

adb shell am broadcast [options] <INTENT>

可以向所有組件廣播,也可以只向指定組件廣播,

例如,向所有組件廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver

這類用法在測驗的時候很實用,比如某個廣播的場景很難制造,可以考慮通過這種方式來發送廣播,

既能發送系統預定義的廣播,也能發送自定義廣播,如下是部分系統預定義廣播及正常觸發時機:

action 觸發時機
android.net.conn.CONNECTIVITY_CHANGE 網路連接發生變化
android.intent.action.SCREEN_ON 螢屏點亮
android.intent.action.SCREEN_OFF 螢屏熄滅
android.intent.action.BATTERY_LOW 電量低,會彈出電量低提示框
android.intent.action.BATTERY_OKAY 電量恢復了
android.intent.action.BOOT_COMPLETED 設備啟動完畢
android.intent.action.DEVICE_STORAGE_LOW 存盤空間過低
android.intent.action.DEVICE_STORAGE_OK 存盤空間恢復
android.intent.action.PACKAGE_ADDED 安裝了新的應用
android.net.wifi.STATE_CHANGE WiFi 連接狀態發生變化
android.net.wifi.WIFI_STATE_CHANGED WiFi 狀態變為啟用/關閉/正在啟動/正在關閉/未知
android.intent.action.BATTERY_CHANGED 電池電量發生變化
android.intent.action.INPUT_METHOD_CHANGED 系統輸入法發生變化
android.intent.action.ACTION_POWER_CONNECTED 外部電源連接
android.intent.action.ACTION_POWER_DISCONNECTED 外部電源斷開連接
android.intent.action.DREAMING_STARTED 系統開始休眠
android.intent.action.DREAMING_STOPPED 系統停止休眠
android.intent.action.WALLPAPER_CHANGED 壁紙發生變化
android.intent.action.HEADSET_PLUG 插入耳機
android.intent.action.MEDIA_UNMOUNTED 卸載外部介質
android.intent.action.MEDIA_MOUNTED 掛載外部介質
android.os.action.POWER_SAVE_MODE_CHANGED 省電模式開啟

(以上廣播均可使用 adb 觸發)

強制停止應用

命令:

adb shell am force-stop <packagename>

命令示例:

adb shell am force-stop com.qihoo360.mobilesafe

表示停止 360 安全衛士的一切行程與服務,

收緊記憶體

命令:

adb shell am send-trim-memory  <pid> <level>

pid: 行程 ID
level:
HIDDEN、RUNNING_MODERATE、BACKGROUND、
RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE

命令示例:

adb shell am send-trim-memory 12345 RUNNING_LOW

表示向 pid=12345 的行程,發出 level=RUNNING_LOW 的收緊記憶體命令,

五、檔案管理

復制設備里的檔案到電腦

命令:

adb pull <設備里的檔案路徑> [電腦上的目錄]

其中 電腦上的目錄 引數可以省略,默認復制到當前目錄,

例:

adb pull /sdcard/sr.mp4 ~/tmp/

小技巧:設備上的檔案路徑可能需要 root 權限才能訪問,如果你的設備已經 root 過,可以先使用 adb shellsu 命令在 adb shell 里獲取 root 權限后,先 cp /path/on/device /sdcard/filename 將檔案復制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc

復制電腦里的檔案到設備

命令:

adb push <電腦上的檔案路徑> <設備里的目錄>

例:

adb push ~/sr.mp4 /sdcard/

小技巧:設備上的檔案路徑普通權限可能無法直接寫入,如果你的設備已經 root 過,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shellsu 在 adb shell 里獲取 root 權限后,cp /sdcard/filename /path/on/device

六、模擬按鍵/輸入

adb shell 里有個很實用的命令叫 input,通過它可以做一些有趣的事情,

input 命令的完整 help 資訊如下:

Usage: input [<source>] <command> [<arg>...]

The sources are:
      mouse
      keyboard
      joystick
      touchnavigation
      touchpad
      trackball
      stylus
      dpad
      gesture
      touchscreen
      gamepad

The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)

比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能實作不同的功能,完整的 keycode 串列詳見 KeyEvent,摘引部分我覺得有意思的如下:

keycode 含義
3 HOME 鍵
4 回傳鍵
5 打開撥號應用
6 掛斷電話
24 增加音量
25 降低音量
26 電源鍵
27 拍照(需要在相機應用里)
64 打開瀏覽器
82 選單鍵
85 播放/暫停
86 停止播放
87 播放下一首
88 播放上一首
122 移動游標到行首或串列頂部
123 移動游標到行末或串列底部
126 恢復播放
127 暫停播放
164 靜音
176 打開系統設定
187 切換應用
207 打開聯系人
208 打開日歷
209 打開音樂
210 打開計算器
220 降低螢屏亮度
221 提高螢屏亮度
223 系統休眠
224 點亮螢屏
231 打開語音助手
276 如果沒有 wakelock 則讓系統休眠

下面是 input 命令的一些用法舉例,

電源鍵

命令:

adb shell input keyevent 26

執行效果相當于按電源鍵,

選單鍵

命令:

adb shell input keyevent 82

HOME 鍵

命令:

adb shell input keyevent 3

回傳鍵

命令:

adb shell input keyevent 4

音量控制

增加音量:

adb shell input keyevent 24

降低音量:

adb shell input keyevent 25

靜音:

adb shell input keyevent 164

媒體控制

播放/暫停:

adb shell input keyevent 85

停止播放:

adb shell input keyevent 86

播放下一首:

adb shell input keyevent 87

播放上一首:

adb shell input keyevent 88

恢復播放:

adb shell input keyevent 126

暫停播放:

adb shell input keyevent 127

點亮/熄滅螢屏

可以通過上文講述過的模擬電源鍵來切換點亮和熄滅螢屏,但如果明確地想要點亮或者熄滅螢屏,那可以使用如下方法,

點亮螢屏:

adb shell input keyevent 224

熄滅螢屏:

adb shell input keyevent 223

滑動解鎖

如果鎖屏沒有密碼,是通過滑動手勢解鎖,那么可以通過 input swipe 來解鎖,

命令(引數以機型 Nexus 5,向上滑動手勢解鎖舉例):

adb shell input swipe 300 1000 300 500

引數 300 1000 300 500 分別表示起始點x坐標 起始點y坐標 結束點x坐標 結束點y坐標

輸入文本

在焦點處于某文本框時,可以通過 input 命令來輸入文本,

命令:

adb shell input text hello

現在 hello 出現在文本框了,

七、查看日志

Android 系統的日志分為兩部分,底層的 Linux 內核日志輸出到 /proc/kmsg,Android 的日志輸出到 /dev/log,

Android 日志

命令格式:

[adb] logcat [<option>] ... [<filter-spec>] ...

常用用法列舉如下:

按級別過濾日志

Android 的日志分為如下幾個優先級(priority):

  • V —— Verbose(最低,輸出得最多)
  • D —— Debug
  • I —— Info
  • W —— Warning
  • E —— Error
  • F —— Fatal
  • S —— Silent(最高,啥也不輸出)

按某級別過濾日志則會將該級別及以上的日志輸出,

比如,命令:

adb logcat *:W

會將 Warning、Error、Fatal 和 Silent 日志輸出,

注: 在 macOS 下需要給 *:W 這樣以 * 作為 tag 的引數加雙引號,如 adb logcat "*:W",不然會報錯 no matches found: *:W,)

按 tag 和級別過濾日志

<filter-spec> 可以由多個 <tag>[:priority] 組成,

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

表示輸出 tag ActivityManager 的 Info 以上級別日志,輸出 tag MyApp 的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志),

日志格式

可以用 adb logcat -v <format> 選項指定日志輸出格式,

日志支持按以下幾種 <format>

  • brief

    默認格式,格式為:

    <priority>/<tag>(<pid>): <message>
    

    示例:

    D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
    
  • process

    格式為:

    <priority>(<pid>) <message>
    

    示例:

    D( 1785) Disconnected process message: 10, size: 0  (HeadsetStateMachine)
    
  • tag

    格式為:

    <priority>/<tag>: <message>
    

    示例:

    D/HeadsetStateMachine: Disconnected process message: 10, size: 0
    
  • raw

    格式為:

    <message>
    

    示例:

    Disconnected process message: 10, size: 0
    
  • time

    格式為:

    <datetime> <priority>/<tag>(<pid>): <message>
    

    示例:

    08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
    
  • threadtime

    格式為:

    <datetime> <pid> <tid> <priority> <tag>: <message>
    

    示例:

    08-28 22:39:39.974  1785  1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
    
  • long

    格式為:

    [ <datetime> <pid>:<tid> <priority>/<tag> ]
    <message>
    

    示例:

    [ 08-28 22:39:39.974  1785: 1832 D/HeadsetStateMachine ]
    Disconnected process message: 10, size: 0
    

指定格式可與上面的過濾同時使用,比如:

adb logcat -v long ActivityManager:I *:S

清空日志

adb logcat -c

內核日志

命令:

adb shell dmesg

輸出示例:

<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.

中括號里的 [14201.684016] 代表內核開始啟動后的時間,單位為秒,

通過內核日志我們可以做一些事情,比如衡量內核啟動時間,在系統啟動完畢后的內核日志里找到 Freeing init memory 那一行前面的時間就是,

八、設備資訊

型號

命令:

adb shell getprop ro.product.model

輸出示例:

Nexus 5

電池狀況

命令:

adb shell dumpsys battery

輸入示例:

Current Battery Service state:
  AC powered: false
  USB powered: true
  Wireless powered: false
  status: 2
  health: 2
  present: true
  level: 44
  scale: 100
  voltage: 3872
  temperature: 280
  technology: Li-poly

其中 scale 代表最大電量,level 代表當前電量,上面的輸出表示還剩下 44% 的電量,

螢屏解析度

命令:

adb shell wm size

輸出示例:

Physical size: 1080x1920

該設備螢屏解析度為 1080px * 1920px,

如果使用命令修改過,那輸出可能是:

Physical size: 1080x1920
Override size: 480x1024

表明設備的螢屏解析度原本是 1080px * 1920px,當前被修改為 480px * 1024px,

螢屏密度

命令:

adb shell wm density

輸出示例:

Physical density: 420

該設備螢屏密度為 420dpi,

如果使用命令修改過,那輸出可能是:

Physical density: 480
Override density: 160

表明設備的螢屏密度原來是 480dpi,當前被修改為 160dpi,

顯示屏引數

命令:

adb shell dumpsys window displays

輸出示例:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
  Display: mDisplayId=0
    init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
    deferred=false layoutNeeded=false

其中 mDisplayId 為 顯示屏編號,init 是初始解析度和螢屏密度,app 的高度比 init 里的要小,表示螢屏底部有虛擬按鍵,高度為 1920 - 1794 = 126px 合 42dp,

android_id

查看命令

adb shell settings get secure android_id

或:

adb shell content query --uri content://settings/secure --where "name=\'android_id\'"

輸出示例:

51b6be48bac8c569

設定命令

adb shell settings put secure android_id 123456789addvff

IMEI

在 Android 4.4 及以下版本可通過如下命令獲取 IMEI:

adb shell dumpsys iphonesubinfo

輸出示例:

Phone Subscriber Info:
  Phone Type = GSM
  Device ID = 860955027785041

其中的 Device ID 就是 IMEI,

而在 Android 5.0 及以上版本里這個命令輸出為空,得通過其它方式獲取了(需要 root 權限):

adb shell
su
service call iphonesubinfo 1

輸出示例:

Result: Parcel(
  0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
  0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
  0x00000020: 00340030 00000031                   '0.4.1...        ')

把里面的有效內容提取出來就是 IMEI 了,比如這里的是 860955027785041

參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

Android 系統版本

命令:

adb shell getprop ro.build.version.release

輸出示例:

5.0.2

IP 地址

每次想知道設備的 IP 地址的時候都得「設定」-「關于手機」-「狀態資訊」-「IP地址」很煩對不對?通過 adb 可以方便地查看,

命令:

adb shell ifconfig | grep Mask

輸出示例:

inet addr:10.130.245.230  Mask:255.255.255.252
inet addr:127.0.0.1  Mask:255.0.0.0

那么 10.130.245.230 就是設備 IP 地址,

在有的設備上這個命令沒有輸出,如果設備連著 WiFi,可以使用如下命令來查看局域網 IP:

adb shell ifconfig wlan0

輸出示例:

wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]

wlan0     Link encap:UNSPEC
          inet addr:10.129.168.57  Bcast:10.129.175.255  Mask:255.255.240.0
          inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:496520 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:116266821 TX bytes:8311736

如果以上命令仍然不能得到期望的資訊,那可以試試以下命令(部分系統版本里可用):

adb shell netcfg

輸出示例:

wlan0    UP                               10.129.160.99/20  0x00001043 f8:a9:d0:17:42:4d
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
p2p0     UP                                     0.0.0.0/0   0x00001003 fa:a9:d0:17:42:4d
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
rmnet0   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet1   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet3   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet2   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet4   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet6   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet5   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet7   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rev_rmnet3 DOWN                                   0.0.0.0/0   0x00001002 4e:b7:e4:2e:17:58
rev_rmnet2 DOWN                                   0.0.0.0/0   0x00001002 4e:f0:c8:bf:7a:cf
rev_rmnet4 DOWN                                   0.0.0.0/0   0x00001002 a6:c0:3b:6b:c4:1f
rev_rmnet6 DOWN                                   0.0.0.0/0   0x00001002 66:bb:5d:64:2e:e9
rev_rmnet5 DOWN                                   0.0.0.0/0   0x00001002 0e:1b:eb:b9:23:a0
rev_rmnet7 DOWN                                   0.0.0.0/0   0x00001002 7a:d9:f6:81:40:5a
rev_rmnet8 DOWN                                   0.0.0.0/0   0x00001002 4e:e2:a9:bb:d0:1b
rev_rmnet0 DOWN                                   0.0.0.0/0   0x00001002 fe:65:d0:ca:82:a9
rev_rmnet1 DOWN                                   0.0.0.0/0   0x00001002 da:d8:e8:4f:2e:fe

可以看到網路連接名稱、啟用狀態、IP 地址和 Mac 地址等資訊,

Mac 地址

命令:

adb shell cat /sys/class/net/wlan0/address

輸出示例:

f8:a9:d0:17:42:4d

這查看的是局域網 Mac 地址,移動網路或其它連接的資訊可以通過前面的小節「IP 地址」里提到的 adb shell netcfg 命令來查看,

CPU 資訊

命令:

adb shell cat /proc/cpuinfo

輸出示例:

Processor       : ARMv7 Processor rev 0 (v7l)
processor       : 0
BogoMIPS        : 38.40

processor       : 1
BogoMIPS        : 38.40

processor       : 2
BogoMIPS        : 38.40

processor       : 3
BogoMIPS        : 38.40

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant     : 0x2
CPU part        : 0x06f
CPU revision    : 0

Hardware        : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision        : 000b
Serial          : 0000000000000000

這是 Nexus 5 的 CPU 資訊,我們從輸出里可以看到使用的硬體是 Qualcomm MSM 8974,processor 的編號是 0 到 3,所以它是四核的,采用的架構是 ARMv7 Processor rev 0 (v71)

記憶體資訊

命令:

adb shell cat /proc/meminfo

輸出示例:

MemTotal:        1027424 kB
MemFree:          486564 kB
Buffers:           15224 kB
Cached:            72464 kB
SwapCached:        24152 kB
Active:           110572 kB
Inactive:         259060 kB
Active(anon):      79176 kB
Inactive(anon):   207736 kB
Active(file):      31396 kB
Inactive(file):    51324 kB
Unevictable:        3948 kB
Mlocked:               0 kB
HighTotal:        409600 kB
HighFree:         132612 kB
LowTotal:         617824 kB
LowFree:          353952 kB
SwapTotal:        262140 kB
SwapFree:         207572 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        265324 kB
Mapped:            47072 kB
Shmem:              1020 kB
Slab:              57372 kB
SReclaimable:       7692 kB
SUnreclaim:        49680 kB
KernelStack:        4512 kB
PageTables:         5912 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      775852 kB
Committed_AS:   13520632 kB
VmallocTotal:     385024 kB
VmallocUsed:       61004 kB
VmallocChunk:     209668 kB

其中,MemTotal 就是設備的總記憶體,MemFree 是當前空閑記憶體,

硬體與系統屬性

設備的更多硬體與系統屬性可以通過如下命令查看:

adb shell cat /system/build.prop

這會輸出很多資訊,包括前面幾個小節提到的「型號」和「Android 系統版本」等,

輸出里還包括一些其它有用的資訊,它們也可通過 adb shell getprop <屬性名> 命令單獨查看,列舉一部分屬性如下:

屬性名 含義
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系統版本
ro.build.version.security_patch Android 安全補丁程式級別
ro.product.model 型號
ro.product.brand 品牌
ro.product.name 設備名
ro.product.board 處理器型號
ro.product.cpu.abilist CPU 支持的 abi 串列[節注一]
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每個應用程式的記憶體上限
ro.sf.lcd_density 螢屏密度
ro.build.id=GRI40 版本ID
ro.build.display.id=GRJ22 版本號
ro.build.version.incremental=eng.buildbot.20110619.060228 版本增量
ro.build.version.sdk=10 sdk版本
ro.build.version.codename=REL 版本代號
ro.build.version.release=2.3.4 Android 2.3.4系統無需修改,也可改為3.0裝裝B
ro.build.date=Sun Jun 19 06:02:58 UTC 2011 制作者制作的時間,可修改2011年X月X日 某某某制作
ro.build.date.utc=0
ro.build.type=user
ro.build.user=buildbot
ro.build.host=bb1
ro.build.tags=test-keys
ro.product.model=HTC Wildfire HTC內部手機代號也就是手機名,改為你想改的名字
ro.product.brand=htc_wwe 手機品牌,改為中國山寨機
ro.product.name=htc_buzz 手機正式名稱,改為你想改的名字
ro.product.device=buzz 采用的設備,改為China G8
ro.product.board=buzz 采用的處理器,改為China 800.8Ghz
ro.product.cpu.abi=armeabi-v6j cpu的版本
ro.product.cpu.abi2=armeabi cpu的品牌
ro.product.manufacturer=HTC 手機制造商,改為中國智造
ro.product.locale.language=en 手機默認語言,把en改為zh
ro.product.locale.region=US 地區語言,美國毛多呀美國,干掉US改為CN
ro.wifi.channels= WIFI連接的渠道
ro.board.platform=msm7k 主板平臺
ro.build.product=buzz 建立產品
ro.build.description=passion-user 2.3.3 GRI40 102588 release-keys 用戶的KEY
ro.build.fingerprint=google/passion/passion:2.3.3/GRI40/102588:user/release-keys 機身碼的啥玩意

節注一:

一些小廠定制的 ROM 可能修改過 CPU 支持的 abi 串列的屬性名,如果用 ro.product.cpu.abilist 屬性名查找不到,可以這樣試試:

adb shell cat /system/build.prop | grep ro.product.cpu.abi

示例輸出:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi

查看/修改序列號

查看命令

adb get-serialno

或:

adb shell getprop sys.serialno

修改序列號:

通常安卓系統正常流程需要修改 cmdline中的引數,可以通過命令查看cmdline引數:

 adb shell cat /proc/cmdline

顯示:

storagemedia=emmc androidboot.mode=emmc androidboot.dtbo_idx=0 androidboot.slot_suffix= androidboot.serialno=9501a97c59fe092 console=ttyFIQ0 androidboot.baseband=N/A androidboot.wificountrycode=US androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 firmware_class.path=/vendor/etc/firmware init=/init rootwait ro init=/init root=PARTUUID=af01642c-9b84-11e8-9b2a-234eb5e198a0 loop.max_part=7 androidboot.selinux=permissive buildvariant=userdebug earlyprintk=uart8250,mmio32,0xff690000 swiotlb=1 kpti=0 bt_type=4

九、修改設定

注: 修改設定之后,運行恢復命令有可能顯示仍然不太正常,可以運行 adb reboot 重啟設備,或手動重啟,

修改設定的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的設定值,

解析度

命令:

adb shell wm size 480x1024

表示將解析度修改為 480px * 1024px,

恢復原解析度命令:

adb shell wm size reset

螢屏密度

命令:

adb shell wm density 160

表示將螢屏密度修改為 160dpi,

恢復原螢屏密度命令:

adb shell wm density reset

顯示區域

命令:

adb shell wm overscan 0,0,0,200

四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將螢屏底部 200px 留白,

恢復原顯示區域命令:

adb shell wm overscan reset

關閉 USB 除錯模式

命令:

adb shell settings put global adb_enabled 0

恢復:

用命令恢復不了了,畢竟關閉了 USB 除錯 adb 就連接不上 Android 設備了,

去設備上手動恢復吧:「設定」-「開發者選項」-「Android 除錯」,

允許/禁止訪問非 SDK API

允許訪問非 SDK API:

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1

禁止訪問非 SDK API:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps

不需要設備獲得 Root 權限,

命令最后的數字的含義:

含義
0 禁止檢測非 SDK 介面的呼叫,該情況下,日志記錄功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 無效,不推薦,
1 僅警告——允許訪問所有非 SDK 介面,但保留日志中的警告資訊,可繼續使用 strick mode API,
2 禁止呼叫深灰名單和黑名單中的介面,
3 禁止呼叫黑名單中的介面,但允許呼叫深灰名單中的介面,

狀態欄和導航欄的顯示隱藏

本節所說的相關設定對應 Cyanogenmod 里的「擴展桌面」,

命令:

adb shell settings put global policy_control <key-values>

<key-values> 可由如下幾種鍵及其對應的值組成,格式為 <key1>=<value1>:<key2>=<value2>

key 含義
immersive.full 同時隱藏
immersive.status 隱藏狀態欄
immersive.navigation 隱藏導航欄
immersive.preconfirms ?

這些鍵對應的值可則如下值用逗號組合:

value 含義
apps 所有應用
* 所有界面
packagename 指定應用
-packagename 排除指定應用

例如:

adb shell settings put global policy_control immersive.full=*

表示設定在所有界面下都同時隱藏狀態欄和導航欄,

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3

表示設定在包名為 com.package1com.package2 的應用里隱藏狀態欄,在除了包名為 com.package3 的所有應用里隱藏導航欄,

十、實用功能

螢屏截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png

如果 adb 版本較老,無法使用 exec-out 命令,這時候建議更新 adb 版本,無法更新的話可以使用以下麻煩點的辦法:

先截圖保存到設備里:

adb shell screencap -p /sdcard/sc.png

然后將 png 檔案匯出到電腦:

adb pull /sdcard/sc.png

可以使用 adb shell screencap -h 查看 screencap 命令的幫助資訊,下面是兩個有意義的引數及含義:

引數 含義
-p 指定保存檔案為 png 格式
-d display-id 指定截圖的顯示屏編號(有多顯示屏的情況下)

實測如果指定檔案名以 .png 結尾時可以省略 -p 引數;否則需要使用 -p 引數,如果不指定檔案名,截圖檔案的內容將直接輸出到 stdout,

另外一種一行命令截圖并保存到電腦的方法:

Linux 和 Windows

adb shell screencap -p | sed "s/\r$//" > sc.png

Mac OS X

adb shell screencap -p | gsed "s/\r$//" > sc.png

這個方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 檔案夾下也有,如果確實找不到該命令,可以下載 sed for Windows 并將 sed.exe 所在檔案夾添加到 PATH 環境變數里,

而在 Mac 下使用系統自帶的 sed 命令會報錯:

sed: RE error: illegal byte sequence

需要安裝 gnu-sed,然后使用 gsed 命令:

brew install gnu-sed

錄制螢屏

錄制螢屏以 mp4 格式保存到 /sdcard:

adb shell screenrecord /sdcard/filename.mp4

需要停止時按 Ctrl-C,默認錄制時間和最長錄制時間都是 180 秒,

如果需要匯出到電腦:

adb pull /sdcard/filename.mp4

可以使用 adb shell screenrecord --help 查看 screenrecord 命令的幫助資訊,下面是常見引數及含義:

引數 含義
--size WIDTHxHEIGHT 視頻的尺寸,比如 1280x720,默認是螢屏解析度,
--bit-rate RATE 視頻的位元率,默認是 4Mbps,
--time-limit TIME 錄制時長,單位秒,
--verbose 輸出更多資訊,

重新掛載 system 磁區為可寫

注:需要 root 權限,

/system 磁區默認掛載為只讀,但有些操作比如給 Android 系統添加命令、洗掉自帶應用等需要對 /system 進行寫操作,所以需要重新掛載它為可讀寫,

步驟:

  1. 進入 shell 并切換到 root 用戶權限,

    命令:

    adb shell
    su
    
  2. 查看當前磁區掛載情況,

    命令:

    mount
    

    輸出示例:

    rootfs / rootfs ro,relatime 0 0
    tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
    devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
    proc /proc proc rw,relatime 0 0
    sysfs /sys sysfs rw,seclabel,relatime 0 0
    selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
    debugfs /sys/kernel/debug debugfs rw,relatime 0 0
    none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0
    none /acct cgroup rw,relatime,cpuacct 0 0
    none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
    none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
    tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
    tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
    none /dev/memcg cgroup rw,relatime,memory 0 0
    none /dev/cpuctl cgroup rw,relatime,cpu 0 0
    none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
    none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
    none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0
    /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=https://www.cnblogs.com/erdongsir/p/ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
    /dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
    /dev/fuse /mnt/shell/emulated/0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
    

    找到其中我們關注的帶 /system 的那一行:

    /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=https://www.cnblogs.com/erdongsir/p/ordered 0 0
    
  3. 重新掛載,

    命令:

    mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
    

    這里的 /dev/block/platform/msm_sdcc.1/by-name/system 就是我們從上一步的輸出里得到的檔案路徑,

如果輸出沒有提示錯誤的話,操作就成功了,可以對 /system 下的檔案為所欲為了,

查看連接過的 WiFi 密碼

注:需要 root 權限,

命令:

adb shell
su
cat /data/misc/wifi/*.conf

輸出示例:

network={
	ssid="TP-LINK_9DFC"
	scan_ssid=1
	psk="123456789"
	key_mgmt=WPA-PSK
	group=CCMP TKIP
	auth_alg=OPEN
	sim_num=1
	priority=13893
}

network={
	ssid="TP-LINK_F11E"
	psk="987654321"
	key_mgmt=WPA-PSK
	sim_num=1
	priority=17293
}

ssid 即為我們在 WLAN 設定里看到的名稱,psk 為密碼,key_mgmt 為安全加密方式,

如果 Android O 或以后,WiFi 密碼保存的地址有變化,是在 WifiConfigStore.xml 里面

adb shell
su
cat /data/misc/wifi/WifiConfigStore.xml

輸出格式:

資料項較多,只需關注 ConfigKey(WiFi 名字)和 PreSharedKey(WiFi 密碼)即可

<string name="ConfigKey">&quot;Wi-Fi&quot;WPA_PSK</string>
<string name="PreSharedKey">&quot;931907334&quot;</string>

設定系統日期和時間

注:需要 root 權限,

命令:

adb shell
su
date -s 20160823.131500

表示將系統日期和時間更改為 2016 年 08 月 23 日 13 點 15 分 00 秒,

重啟手機

命令:

adb reboot

檢測設備是否已 root

命令:

adb shell
su

此時命令列提示符是 $ 則表示沒有 root 權限,是 # 則表示已 root,

使用 Monkey 進行壓力測驗

Monkey 可以生成偽隨機用戶事件來模擬單擊、觸摸、手勢等操作,可以對正在開發中的程式進行隨機壓力測驗,

簡單用法:

adb shell monkey -p <packagename> -v 500

表示向 <packagename> 指定的應用程式發送 500 個偽隨機事件,

Monkey 的詳細用法參考 官方檔案,

開啟/關閉 WiFi

注:需要 root 權限,

有時需要控制設備的 WiFi 狀態,可以用以下指令完成,

開啟 WiFi:

adb root
adb shell svc wifi enable

關閉 WiFi:

adb root
adb shell svc wifi disable

若執行成功,輸出為空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed

十一、刷機相關命令

重啟到 Recovery 模式

命令:

adb reboot recovery

從 Recovery 重啟到 Android

命令:

adb reboot

重啟到 Fastboot 模式

命令:

adb reboot bootloader

通過 sideload 更新系統

如果我們下載了 Android 設備對應的系統更新包到電腦上,那么也可以通過 adb 來完成更新,

以 Recovery 模式下更新為例:

  1. 重啟到 Recovery 模式,

    命令:

    adb reboot recovery
    
  2. 在設備的 Recovery 界面上操作進入 Apply update-Apply from ADB

    注:不同的 Recovery 選單可能與此有差異,有的是一級選單就有 Apply update from ADB

  3. 通過 adb 上傳和更新系統,

    命令:

    adb sideload <path-to-update.zip>
    

十二、安全相關命令

啟用/禁用 SELinux

啟用 SELinux

adb root
adb shell setenforce 1

禁用 SELinux

adb root
adb shell setenforce 0

啟用/禁用 dm_verity

啟用 dm_verity

adb root
adb enable-verity

禁用 dm_verity

adb root
adb disable-verity

十三、系統管理命令

Android 系統是基于 Linux 內核的,所以 Linux 里的很多命令在 Android 里也有相同或類似的實作,在 adb shell 里可以呼叫,本檔案前面的部分內容已經用到了 adb shell 命令,

查看行程

命令:

adb shell ps

輸出示例:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME
root      1     0     8904   788   ffffffff 00000000 S /init
root      2     0     0      0     ffffffff 00000000 S kthreadd
...
u0_a71    7779  5926  1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic
u0_a58    7963  5926  1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure
...
shell     8750  217   10640  740   00000000 b6f28340 R ps

各列含義:

列名 含義
USER 所屬用戶
PID 行程 ID
PPID 父行程 ID
NAME 行程名

查看實時資源占用情況

命令:

adb shell top

輸出示例:

User 0%, System 6%, IOW 0%, IRQ 0%
User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
 8763  0   3% R     1  10640K   1064K  fg shell    top
  131  0   3% S     1      0K      0K  fg root     dhd_dpc
 6144  0   0% S   115 1682004K 115916K  fg system   system_server
  132  0   0% S     1      0K      0K  fg root     dhd_rxf
 1731  0   0% S     6  20288K    788K  fg root     /system/bin/mpdecision
  217  0   0% S     6  18008K    356K  fg shell    /sbin/adbd
 ...
 7779  2   0% S    19 1538748K  48896K  bg u0_a71   com.sohu.inputmethod.sogou:classic
 7963  0   0% S    18 1561916K  59568K  fg u0_a58   org.mazhuang.boottimemeasure
 ...

各列含義:

列名 含義
PID 行程 ID
PR 優先級
CPU% 當前瞬間占用 CPU 百分比
S 行程狀態(R=運行,S=睡眠,T=跟蹤/停止,Z=僵尸行程)
#THR 執行緒數
VSS Virtual Set Size 虛擬耗用記憶體(包含共享庫占用的記憶體)
RSS Resident Set Size 實際使用物理記憶體(包含共享庫占用的記憶體)
PCY 調度策略優先級,SP_BACKGROUND/SPFOREGROUND
UID 行程所有者的用戶 ID
NAME 行程名

top 命令還支持一些命令列引數,詳細用法如下:

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
    -m num  最多顯示多少個行程
    -n num  重繪多少次后退出
    -d num  重繪時間間隔(單位秒,默認值 5)
    -s col  按某列排序(可用 col 值:cpu, vss, rss, thr)
    -t      顯示執行緒資訊
    -h      顯示幫助檔案

查看行程 UID

有兩種方案:

  1. adb shell dumpsys package <packagename> | grep userId=

    如:

    $ adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
       userId=10394
    
  2. 通過 ps 命令找到對應行程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid

    如:

    $ adb shell
    gemini:/ $ ps | grep org.mazhuang.guanggoo
    u0_a394   28635 770   1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
    gemini:/ $ cat /proc/28635/status | grep Uid
    Uid:    10394   10394   10394   10394
    gemini:/ $
    

其它

如下是其它常用命令的簡單描述,前文已經專門講過的命令不再額外說明:

命令 功能
cat 顯示檔案內容
cd 切換目錄
chmod 改變檔案的存取模式/訪問權限
df 查看磁盤空間使用情況
grep 過濾輸出
kill 殺死指定 PID 的行程
ls 列舉目錄內容
mount 掛載目錄的查看和管理
mv 移動或重命名檔案
ps 查看正在運行的行程
rm 洗掉檔案
top 查看行程的資源占用情況

常見問題

啟動 adb server 失敗

出錯提示

error: protocol fault (couldn't read status): No error

可能原因

adb server 行程想使用的 5037 埠被占用,

解決方案

找到占用 5037 埠的行程,然后終止它,以 Windows 下為例:

netstat -ano | findstr LISTENING

...
TCP    0.0.0.0:5037           0.0.0.0:0              LISTENING       1548
...

這里 1548 即為行程 ID,用命令結束該行程:

taskkill /PID 1548

然后再啟動 adb 就沒問題了,

本文來自博客園,作者:耳東Sir,轉載請注明原文鏈接:https://www.cnblogs.com/erdongsir/p/17106563.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/543486.html

標籤:Android

上一篇:react-native-web跨平臺實戰

下一篇:react-native-web跨平臺實戰

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more