รับชื่อแพ็คเกจและชื่อสามัญของแอพผ่าน ADB


15

ฉันกำลังมองหาความเป็นไปได้ที่จะดึงทั้งชื่อแพคเกจและชื่อสามัญของแอพที่ติดตั้งบนอุปกรณ์ Android ผ่าน ADB - หรืออย่างน้อยก็จะเรียกชื่อสามัญได้ถ้ารู้ชื่อแพ็คเกจ การค้นหาอย่างรวดเร็วในเว็บไซต์ของเราทำให้เกิดคำถามที่เกี่ยวข้องสองข้อ แต่พวกเขาไม่สามารถแก้ปัญหาของฉันได้:

ฉันกำลังมองหาวิธีที่จะดึงข้อมูลโดยตรงจากอุปกรณ์หากเป็นไปได้ไม่ใช่วิธี "ใด ๆ " (รวมถึง "การค้นหาเว็บ" หรือ "ผ่านแอพ") เนื่องจากเป็นคำถามสองข้อ

ฉันรู้ว่ามีเครื่องมือหลายอย่างเพื่อรับรายละเอียดแพ็คเกจ:

  • adb dumpsys package: แม้ว่ารายการนี้จะแสดงรายการแพ็คเกจทั้งหมดพร้อมรายละเอียดมากมาย แต่ชื่อ "สามัญ" จะไม่ปรากฏขึ้น
  • adb shell pm list: ให้ชื่อแพ็คเกจเท่านั้น
  • aaptจะสามารถรับชื่อสามัญได้ แต่จะต้องดึง.apkไฟล์จากอุปกรณ์ก่อนซึ่งไม่สะดวกจริงๆ (และแน่นอนว่าจะค่อนข้างช้าเมื่อติดตั้งแอพจำนวนมากและ / หรือแอปขนาดใหญ่)

ฉันพลาดอะไรไปหรือเปล่า? ฉันรู้ว่าข้อมูลจะต้องอยู่บนอุปกรณ์ (จะมีวิธีอื่นที่จะแสดงชื่อแอพใน GUI หรือไม่ฉันสงสัยว่า Android แยกวิเคราะห์.apkไฟล์ทุกครั้งที่ GUI ต้องการ "ชื่อสามัญ") ดังนั้นมีวิธีที่จะได้รับมันโดยใช้ ADB โดยตรงหรือไม่


TL; DR

พื้นหลัง (หากมีใครอยากรู้อยากเห็น): ฉันต้องการได้รับรายชื่อผู้ใช้แอพจากอุปกรณ์ใด ๆ ของฉันได้อย่างรวดเร็วโดยไม่ต้องเปลี่ยนกลับเป็นกายกรรม รายการชื่อแพคเกจของพวกเขาที่ฉันสามารถเรียกคืนได้โดยใช้adb shell pm list -3แต่เป็นชื่อแพ็กเกจเท่านั้นการรู้จักแอปเป็นงานที่คาดเดาได้ ดังนั้นหากมีคำสั่ง ADB บางตัวเพื่อเรียกชื่อสามัญสำหรับชื่อแพ็คเกจที่กำหนดฉันสามารถใช้ลูปเช่นfor pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- และรับรายการของแอพผู้ใช้ที่ติดตั้งทั้งหมดใน "รูปแบบที่มนุษย์สามารถอ่านได้" พร้อมกับชื่อแพ็คเกจ

กรณีการใช้งาน:

  • ดูว่ามีแอพพลิเคชั่น "ฟุ่มเฟือย" ติดตั้งอะไรบ้าง (ซึ่งฉันสามารถลบได้)
  • รายการตรวจสอบข้ามจากอุปกรณ์หลายเครื่อง
  • เอกสารประกอบ);
  • และอาจมากกว่า (แต่เหนือ 3 เป็นสิ่งที่ฉันต้องการ)

แค่อุดมคติ (ฉันคิดว่าคุณลองมาแล้ว) ทำไมคุณไม่คอมไพล์ aapt สำหรับ android และรันแทน shell? : D
user3344236

1
@ user3344236 ฉันตระหนักถึงความเป็นไปได้นั้น แต่มันไม่ได้เป็นตัวเลือกในการติดตั้งบางสิ่งบางอย่างไปยังอุปกรณ์ที่เป็นปัญหาโดยเฉพาะอย่างยิ่งไม่ใช่ไบนารีที่คอมไพล์ด้วยตนเอง (บางครั้งฉันได้รับอุปกรณ์ที่ไม่ได้รูทและต้องรักษา "เงื่อนไขเหมือนนิติเวช" - เช่น " ไม่เปลี่ยนอุปกรณ์เพียงแค่สำรวจ ")
Izzy

ดังนั้นความคิดที่สองคือการเขียนเครื่องมือที่ทำงานด้วย adb shell ... โดยไม่ต้องใช้ adbd ที่แก้ไขแล้วบนอุปกรณ์และไม่ต้องดันไฟล์บางไฟล์ที่นั่น ฉันคิดว่าจะใช้เวลาพอสมควรในการทำสิ่งนี้ให้สำเร็จ (ถ้าคุณประสบความสำเร็จ): D
user3344236

@ user3344236 กังวลมากเกินไปโดยเฉพาะเมื่อฉันไม่ใช่ Android dev ขณะนี้ฉันใช้ "โซลูชันบนเว็บ" (คล้ายกับ "การค้นหาของ Google Play") เนื่องจากดูเหมือนว่าจะไม่มีวิธีแก้ปัญหาดั้งเดิมที่นี่ (ยัง?)
Izzy

สวัสดีอิซซี่! เมื่อพิจารณาถึงความคิดเห็น (ด้านบน) หมายความว่าคุณต้องการโซลูชันที่คำนึงถึงอุปกรณ์ที่ไม่ได้รูทหรือไม่
Firelord

คำตอบ:


8

นี่ไม่ใช่คำตอบสุดท้ายเนื่องจากไม่ใช่คำตอบทั่วไป (ใช้ได้กับอุปกรณ์บางอย่างเท่านั้น) - แต่เป็นการเริ่มต้นอย่างน้อย

ในฐานะที่เราเคยคิดออกอย่างน้อย CM รอมโดยใช้ KitKat (Android 4.4) และเรือข้างต้นด้วยตามaaptไบนารีที่มีอยู่ใน1/system/bin หากรอมของคุณไม่ได้มีมันและติดตั้งไบนารีบนอุปกรณ์เป็นตัวเลือกที่คุณสามารถหาได้ที่นี่

การใช้การaaptเรียกชื่อแอปนั้นเป็นไปได้ด้วย

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

ผลลัพธ์จะเป็นสิ่งlabel='Funny App'ที่คุณสามารถแยกวิเคราะห์ชื่อแอพได้อย่างง่ายดาย

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

(ไม่ดีถ้าชื่อแอปมีคำพูดเดียว แต่อาจนับเป็นเครื่องสำอางได้หรือคุณคิดว่าจะปรับปรุงส่วนที่น่าสนใจเพื่อจัดการกับสิ่งนั้นได้อย่างไร)


1:เราไม่พบสิ่งนี้ใน ROM สต็อค Kitkat-and-above ที่เราได้ตรวจสอบดังนั้นอาจเป็น ROM ที่อ้างอิงกับ CM เท่านั้น


3
หมายเหตุถึงผู้อ่าน:คุณไม่จำเป็นต้องมีอุปกรณ์ที่รูทเพื่อใช้aaptไบนารีนั้น คุณสามารถดาวน์โหลดและเปลี่ยนชื่อไบนารี่เป็นaaptPC ได้เป็นอย่างดีตั้งค่าสิทธิ์อนุญาตให้ใช้งานได้กับลินุกซ์บนไบนารี่แล้วกดไปที่/data/local/tmpจากนั้นใช้พา ธ สัมบูรณ์/data/local/tmp/aaptเพื่อใช้ไบนารี่ในคำสั่งเหล่านั้น
Firelord

ดังนั้นสำหรับชื่อของแพ็คเกจ (ส่วนแรกของคำถามเดิม) คุณจะทำอย่างไรaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22

8

นี่คือทางออกของฉันสำหรับโทรศัพท์ที่ไม่ได้รูทซึ่งต้องการการเปลี่ยนแปลงเล็กน้อยจากด้านบนซึ่งฉันใช้กับ Moto G 2nd gen ที่ใช้ Android 5.0.2

ฉันไม่มีเลขฐานสอง aapt ใน / system / bin ดังนั้นฉันจึงลองดาวน์โหลดครั้งแรกจาก: https://android.izzysoft.de/downloads

แต่เมื่อฉันพยายามเรียกใช้ฉันพบข้อผิดพลาดว่า:

ข้อผิดพลาด: สนับสนุนเฉพาะตำแหน่งที่สามารถทำงานได้อิสระ (PIE)

ดังนั้นฉันจึงค้นหารุ่น PIE และพบ: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

และสิ่งนี้ทำงานโดยการคัดลอกไบนารีไปยัง / data / local / tmp:

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

ดังนั้น:

adb shell pm list packages -3 -f

รับรายการแอพของบุคคลที่สาม (แอพที่คุณติดตั้งไม่ใช่แอพระบบ) จากนั้นคุณสามารถใช้แพคเกจจากคำสั่งด้านบนใน aapt เพื่อรับข้อมูลเกี่ยวกับแพ็คเกจ - ตัวอย่าง:

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

ด้านล่างคือสคริปต์ (สำหรับไคลเอนต์ Linux) เพื่อรับชื่อ "ทั่วไป" สำหรับแอปของบุคคลที่สาม: ``

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

หากคุณต้องการแพ็กเกจและเวอร์ชันด้วยให้เปลี่ยนเป็นบรรทัดสุดท้ายจาก:

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

ถึง:

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

ตัวอย่างผลลัพธ์:

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: หนึ่งครั้งสำหรับสคริปต์เชลล์และอีกประการสำหรับตัวชี้ไปยังตัวแปร ARM ของaapt! จะตรวจสอบว่าออกโดยเร็วที่สุดเท่าที่เวลาจะอนุญาต (กำลังรีบหน่อย) โหวตขึ้นตอนนี้อาจได้รับการยอมรับหลังจากได้รับการยืนยันแล้ว :)
Izzy

PS: ตอนนี้หน้าดาวน์โหลดของฉันยังเชื่อมโยงไปยังแหล่งที่คุณระบุ - เพียงแค่ "หนึ่งระดับขึ้นไป" ดังนั้นผู้ใช้จึงสามารถเลือกระหว่าง ARM และ x86 builds ได้
Izzy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.