Lấy tên gói VÀ tên chung của ứng dụng thông qua ADB


14

Tôi đang tìm kiếm khả năng truy xuất cả hai , tên gói tên chung của các ứng dụng được cài đặt trên thiết bị Android thông qua ADB - hoặc ít nhất là để lấy tên chung nếu biết tên gói. Một tìm kiếm nhanh trên trang web của chúng tôi đưa ra hai câu hỏi liên quan, nhưng chúng không giải quyết được vấn đề của tôi:

Tôi đang tìm cách lấy thông tin trực tiếp từ thiết bị, nếu có thể - không phải là "bất kỳ cách nào" (bao gồm cả "tra cứu web" hoặc "thông qua một ứng dụng") vì hai câu hỏi đó có.

Tôi biết có nhiều công cụ có sẵn để lấy chi tiết gói:

  • adb dumpsys package: Mặc dù danh sách này liệt kê tất cả các gói có nhiều thông tin chi tiết, "tên chung" không được hiển thị
  • adb shell pm list: chỉ cung cấp tên gói
  • aaptsẽ có thể có được tên chung, nhưng trước tiên sẽ yêu cầu kéo .apktệp khỏi thiết bị, điều này không thực sự tiện lợi (và rõ ràng sẽ khá chậm với nhiều và / hoặc các ứng dụng lớn được cài đặt)

Tôi đã bỏ lỡ một cái gì đó? Tôi biết thông tin phải có trên thiết bị (làm thế nào khác nó có thể hiển thị tên ứng dụng trong GUI? Tôi nghi ngờ Android phân tích .apktệp mỗi khi GUI cần "tên chung"). Vậy có cách nào để nắm giữ nó, sử dụng ADB trực tiếp không?


TL; DR

Bối cảnh (nếu ai đó tò mò): Tôi muốn có thể nhanh chóng có được danh sách các ứng dụng người dùng từ bất kỳ thiết bị nào của mình mà không phải quay lại nhào lộn. Một danh sách các tên gói mà tôi có thể truy xuất bằng cách sử dụng adb shell pm list -3, nhưng vì đó chỉ là các tên gói, việc nhận ra các ứng dụng là một công việc đoán. Vì vậy, nếu có một số lệnh ADB để lấy tên chung cho tên gói đã cho, tôi có thể chỉ cần sử dụng một vòng lặp như for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- và nhận danh sách tất cả các ứng dụng người dùng đã cài đặt theo "định dạng có thể đọc được" cùng với tên gói của chúng.

Trường hợp sử dụng:

  • Xem những ứng dụng "siêu tốc" nào được cài đặt (mà tôi có thể xóa)
  • Danh sách kiểm tra chéo từ nhiều thiết bị
  • Tài liệu ;)
  • và có lẽ nhiều hơn (nhưng 3 ở trên là những gì tôi cần nó)

Chỉ là một ideea (tôi nghĩ bạn đã thử chưa?). Tại sao bạn không biên dịch aapt cho Android và chạy thay vì shell? : D
user344236

1
@ user3344236 Tôi biết khả năng đó; nhưng không phải lúc nào cũng là một tùy chọn để cài đặt một cái gì đó cho thiết bị đang được đề cập, đặc biệt không phải là một tệp nhị phân tự biên dịch (đôi khi tôi nhận được các thiết bị cầm tay không được root và phải giữ "điều kiện giống như pháp y" - tức là "làm không thay đổi thiết bị, chỉ cần khám phá nó ").
Izzy

Vì vậy, ý tưởng thứ hai là viết cho mình một công cụ chạy qua shell adb ... mà không sử dụng adbd đã sửa đổi trên thiết bị và không đẩy một số tệp ở đó. Tôi nghĩ rằng bạn sẽ mất một chút thời gian để hoàn thành việc này (nếu bạn thành công): D
user3344236

@ user3344236 quá đáng lo ngại, đặc biệt vì tôi không phải là nhà phát triển Android. Tôi hiện đang sử dụng "giải pháp dựa trên web" (tương tự như "tra cứu Google Play"), vì dường như không có giải pháp gốc nào ở đây (chưa?).
Izzy

Chào Izzy! Xem xét các ý kiến ​​(ở trên), có nghĩa là bạn cần một giải pháp xem xét một thiết bị không root trong tâm trí?
Firelord

Câu trả lời:


8

Đây không phải là câu trả lời cuối cùng, vì nó không chung chung (chỉ hoạt động trên một số thiết bị) - nhưng ít nhất đó là một sự khởi đầu:

Như chúng tôi đã tìm ra , ít nhất các ROM dựa trên CM có Kitkat (Android 4.4) trở lên được cung cấp với aaptnhị phân có sẵn trong /system/bin1 . Nếu ROM của bạn không có nó và cài đặt nhị phân trên thiết bị là một tùy chọn, bạn có thể tìm thấy nó ở đây .

Có thể sử dụng aapt, truy xuất tên ứng dụng với

aapt d badging <path to apk> | grep "application: label" |awk '{print $2}'

Đầu ra sẽ giống như cái label='Funny App'mà bạn có thể dễ dàng phân tích cho tên ứng dụng, vd

aapt d badging <path to apk> | grep 'application: label' | sed -n \"s/.*label\='\([^']*\)'.*/\1/p\"

(không tốt nếu tên ứng dụng chứa các trích dẫn đơn, nhưng điều đó có thể được tính là mỹ phẩm - hoặc bạn tìm cách cải thiện phần sed để đối phó với điều đó).


1: chúng tôi đã không tìm thấy điều này trong các ROM chứng khoán Kitkat trở lên mà chúng tôi đã kiểm tra, vì vậy nó chỉ có thể là ROM dựa trên CM


3
Lưu ý cho độc giả: Bạn không cần phải có thiết bị đã root để sử dụng aaptnhị phân đó . Bạn rất có thể tải xuống và đổi tên nhị phân thành aapttrong PC, đặt quyền thực thi tương thích Linux trên nhị phân và đẩy nó sang /data/local/tmp, sau đó sử dụng đường dẫn tuyệt đối /data/local/tmp/aaptđể sử dụng nhị phân trong các lệnh đó.
Firelord

Vì vậy, đối với tên của gói (phần đầu tiên của câu hỏi ban đầu), bạn sẽ làmaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22

7

Đây là giải pháp của tôi cho một chiếc điện thoại chưa root, cần một số thay đổi nhỏ từ phía trên mà tôi đã chạy trên Moto G 2nd gen chạy Android 5.0.2.

Tôi không có nhị phân aapt trong / system / bin, vì vậy trước tiên tôi đã thử tải xuống từ: https://android.izzysoft.de/doads

nhưng khi tôi cố chạy nó, tôi gặp lỗi:

lỗi: chỉ hỗ trợ thực thi độc lập vị trí (PIE).

Vì vậy, sau đó tôi đã tìm kiếm một phiên bản PIE và tìm thấy: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

và điều này hoạt động bằng cách sao chép nhị phân vào / data / local / tmp:

adb push aapt-arm-pie /data/local/tmp
adb shell chmod 0755 /data/local/tmp/aapt-arm-pie

Vậy thì:

adb shell pm list packages -3 -f

nhận danh sách các ứng dụng của bên thứ 3 (ứng dụng bạn đã cài đặt, không phải ứng dụng hệ thống) và sau đó bạn có thể sử dụng gói từ lệnh trên trong aapt để lấy thông tin về gói - ví dụ:

adb shell /data/local/tmp/aapt-arm-pie d badging /data/app/com.facebook.katana-3/base.apk

Vì vậy, bên dưới là tập lệnh (đối với máy khách Linux) để chỉ lấy tên "chung" cho các ứng dụng của bên thứ 3: ``

for pkg in `adb shell pm list packages -3 -f | awk -F= '{sub("package:","");print $1}'`
do
  adb shell /data/local/tmp/aapt-arm-pie d badging $pkg | awk -F: '
      $1 == "application-label" {print $2}'
done

Nếu bạn cũng muốn gói và phiên bản, sau đó thay đổi cuối cùng nhưng một dòng từ:

$1 == "application-label" {print $2}'

đến:

$1 == "package" { split($2,space," ")
name=space[1];version=space[3]}
$1 == "application-label" {print name, version, $2 }'

Ví dụ đầu ra:

name='com.ultimarom.launchnavigation' versionName='1.28' 'Navigation' name='com.enhanced.skineditorstudio' versionName='3.3' 'Custom Skin Creator' name='com.mojang.minecraftpe' versionName='1.2.6.60' 'Minecraft' name='org.videolan.vlc' versionName='2.5.13' 'VLC' name='com.jrustonapps.myauroraforecast' versionName='1.7.2' 'My Aurora Forecast' name='de.j4velin.wifiAutoOff' versionName='1.7.6' 'WiFi Automatic' name='com.facebook.katana' versionName='153.0.0.54.88' 'Facebook' name='com.metago.astro' versionName='6.0.5' 'ASTRO File Manager' name='za.co.hardrive.smartinfo.parkrun' versionName='2.0.2' 'My 5krun' name='com.PYOPYO.StarTrackerVR' versionName='1.0.1' 'StarTracker VR' name='cz.aponia.bor3.offlinemaps' versionName='1.1.19' 'Offline Maps' name='com.groupon' versionName='16.11.63973' 'Groupon' name='com.ebay.mobile' versionName='5.16.1.2' 'eBay' name='com.runtastic.android' versionName='8.1.1' 'Runtastic' name='com.google.android.diskusage' versionName='3.8.3' 'DiskUsage'

Mike


Cảm ơn rất nhiều và hai lần, Mike: một lần cho kịch bản shell và lần thứ hai cho con trỏ tới biến thể ARM của aapt! Sẽ kiểm tra xem ngay khi thời gian cho phép (hiện tại hơi vội vàng). Được nâng cấp ngay bây giờ, có thể được chấp nhận sau khi đã xác minh :)
Izzy

PS: Trang tải xuống của tôi bây giờ cũng liên kết đến nguồn bạn đã chỉ định - chỉ "tăng một cấp", vì vậy mọi người có thể chọn giữa các bản dựng ARM và x86.
Izzy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.