ฉันต้องได้รับชื่อแพ็คเกจของ Android APK ฉันได้ลองเปิดเครื่องรูด APK และอ่านเนื้อหาAndroidManifest.xml
แล้ว แต่ดูเหมือนว่าไม่ใช่ไฟล์ข้อความ
ฉันจะแยกชื่อแพ็กเกจของ APK ได้อย่างไร?
ฉันต้องได้รับชื่อแพ็คเกจของ Android APK ฉันได้ลองเปิดเครื่องรูด APK และอ่านเนื้อหาAndroidManifest.xml
แล้ว แต่ดูเหมือนว่าไม่ใช่ไฟล์ข้อความ
ฉันจะแยกชื่อแพ็กเกจของ APK ได้อย่างไร?
คำตอบ:
aapt dump badging <path-to-apk> | grep package:\ name
|
ได้กด Enter แล้วค้นหาผลลัพธ์สำหรับพารามิเตอร์ที่คุณต้องการ เพียงจำไว้ว่าaapt
ต้องอยู่ในเส้นทางของคุณ
aapt
Android\SDK\build-tools\version
คำสั่งจะอยู่ภายใต้ คำสั่งบน windows สามารถเป็นaapt dump badging <path-to-apk> | findstr -i "package: name"
หรือaapt dump badging <path-to-apk>
คุณสามารถติดตั้ง apk บนโทรศัพท์ของคุณได้
เชื่อมต่อโดยใช้ adb คุณสามารถเรียกใช้ adb shell และเรียกใช้งานรายการแพคเกจ pm -f ซึ่งแสดงชื่อแพ็กเกจสำหรับ apk ที่ติดตั้งไว้แต่ละตัว
สิ่งนี้นำมาจาก ชื่อแพ็คเกจค้นหาสำหรับแอป Android เพื่อใช้ Intent เพื่อเปิดแอป Market จากเว็บ
su
คำสั่งก่อน
pm list packages -f | grep term-to-search-for
ตามคำตอบ @hackbod ... แต่เกี่ยวข้องกับ windows
aapt
Android\SDK\build-tools\version
คำสั่งตั้งอยู่บน หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับappt command
(เครื่องมือบรรจุภัณฑ์สินทรัพย์ของ Android) อ่านhttps://stackoverflow.com/a/28234956/812915
dump
ย่อยคำสั่งของผู้aapt
ถูกนำมาใช้เพื่อแสดงค่าของแต่ละองค์ประกอบหรือบางส่วนของแพคเกจ:
aapt dump badging <path-to-apk>
หากคุณต้องการดูเฉพาะบรรทัดที่มีpackage: name
ข้อมูลให้ใช้findstr
aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"
หวังว่ามันจะช่วยให้ผู้ใช้ windows อื่น ๆ !
หากคุณกำลังดูที่ google play และต้องการทราบชื่อแพ็คเกจของมันคุณสามารถดู url หรือแถบที่อยู่ได้ คุณจะได้รับชื่อแพ็คเกจ นี่com.landshark.yaum
คือชื่อแพ็คเกจ
https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd
หากคุณเปิด AndroidManifest.xml โดยใช้ MS Notepad ให้ค้นหาวลีpackage
และคุณจะพบสิ่งต่อไปนี้:
package manifest $xxx.xxxxxxx.xxxxxxx |
โดยที่ xxx.xxxxxxx.xxxxxxx เป็นชื่อแพ็กเกจของคุณเพียงเขียนด้วยช่องว่างหลังอักขระแต่ละตัว
เป็นวิธีที่มีประโยชน์เมื่อคุณไม่มีเครื่องมือเฉพาะติดตั้ง
สคริปต์ทุบตีต่อไปนี้จะแสดงชื่อแพ็คเกจและชื่อกิจกรรมหลัก:
apk_package.sh
package=$(aapt dump badging "$*" | awk '/package/{gsub("name=|'"'"'",""); print $2}')
activity=$(aapt dump badging "$*" | awk '/activity/{gsub("name=|'"'"'",""); print $2}')
echo
echo " file : $1"
echo "package : $package"
echo "activity: $activity"
เรียกใช้เช่น:
apk_package.sh /path/to/my.apk
หากคุณต้องการทำสิ่งนี้โดยทางโปรแกรมมันมีส่วนเกี่ยวข้องมากกว่าเพียงแค่ได้รับคำตอบในสมองของคุณ ฉันมีสคริปต์ที่ฉันใช้ในการลงชื่อแอปทั้งหมดของเรา แต่แต่ละคนใช้คีย์ที่แตกต่างกัน ต่อไปนี้เป็น 2 วิธีในการรับชื่อแพ็คเกจเป็นผลลัพธ์เพื่อให้คุณสามารถใส่ไว้ในตัวแปรหรือทำสิ่งที่คุณต้องการ
ตัวอย่างผลลัพธ์: com.example.appname
(และไม่มีอะไรเพิ่มเติม)
aapt
- เครื่องมือบรรจุสินทรัพย์ Android ซึ่งเป็นส่วนหนึ่งของการดาวน์โหลดเครื่องมือ SDK
การใช้awk
ระบุ'
เป็นตัวคั่นฟิลด์ค้นหาบรรทัดด้วยpackage: name=
และพิมพ์เฉพาะ "ฟิลด์" ที่ 2 ในบรรทัด:
aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'
จุดอ่อนของวิธีนี้คืออาศัยการปรับเอาท์พุทฟิลด์ข้อมูลแพ็กเกจในลำดับเดียวกัน:
package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'
เราไม่มีข้อผูกมัดจากนักพัฒนาในการรักษารูปแบบนี้
การใช้awk
ระบุ"
เป็นตัวคั่นฟิลด์ค้นหาบรรทัดด้วยpackage=
และพิมพ์เฉพาะ "ฟิลด์" ที่ 2 ในบรรทัด:
aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'
จุดอ่อนของวิธีนี้คืออาศัยการปรับเอาท์พุทpackage=
เฉพาะในAndroid Manifest:
ส่วนของเอาต์พุต เราไม่มีข้อผูกมัดจากนักพัฒนาในการรักษารูปแบบนี้
ขยายไฟล์ apk ด้วยapktool d
และอ่าน AndroidManifest.xml
นี่จะเป็นวิธีที่ดีที่สุด แต่ AndroidManifest.xml เป็นไฟล์ไบนารีและคำตอบ SO ทั้งหมดที่ฉันเห็นสำหรับการแปลงเป็นข้อความจะไม่ทำงาน (การใช้งานapktool d
แบบง่าย ๆ แทนที่จะunzip
ทำแบบนี้กับคุณ แต่ไม่ได้ใช้) โปรดแสดงความคิดเห็นหากคุณมีวิธีแก้ไขปัญหานี้
ทางออกที่ง่ายคือ Open Android Studio -> Build -> วิเคราะห์ Apk ... เรียกดูและเลือก APK ตอนนี้คุณสามารถค้นหาชื่อแพ็คเกจและสวยมากที่คุณสามารถอ่านได้
หากคุณต้องการทราบชื่อแพคเกจเรียกใช้ adb logcat เริ่มกิจกรรมที่คุณต้องการคุณจะได้รับคำแนะนำเกี่ยวกับชื่อแพ็คเกจ
อีกวิธีคือใช้ aapt list และใช้ sed เพื่อวิเคราะห์คำว่า:
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"
A:package="com.example.appname"
ในAndroid Manifest:
ส่วนถ้าคุณทำaapt list -a
มีวิธีที่ง่ายมากถ้าคุณได้รับ APK พร้อมบนสมาร์ทโฟนของคุณ เพียงใช้หนึ่งในแอปเหล่านี้:
วิธีที่ง่ายมากคือการใช้ apkanalyzer
apkanalyzer manifest application-id "${_path_to_apk}"
ฉันคิดว่าวิธีที่ดีที่สุดและง่ายที่สุดในการแยกเฉพาะชื่อแพ็คเกจใน Linux คือ
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
คำอธิบาย:
package: name='([a-z0-9.]*)'.*
และแทนที่ด้วยกลุ่มการจับคู่แรก (และเท่านั้น)คุณสามารถแยก AndroidManifest.xml จาก APK ลบ NULL ไบต์ทั้งหมดข้ามทุกอย่างจนกระทั่งหลังจากสตริง 'รายการ' และจากนั้นคุณจะอยู่ที่ความยาวไบต์ตามด้วยชื่อแพ็คเกจ (และสิ่งที่เกิดขึ้นหลังจากนั้น) สำหรับงานที่ยากฉันใช้เครื่องมือGEMAที่ยอดเยี่ยมดังนั้นคำสั่งจะเป็นดังนี้:
7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'
แน่นอนคุณสามารถใช้เครื่องมืออื่น ๆ เพื่อทำการกรอง
หากคุณไม่ได้ติดตั้ง Android SDK ไว้เช่นในบางสถานการณ์การทดสอบคุณสามารถรับชื่อแพ็คเกจโดยใช้วิธีการทุบตีต่อไปนี้:
getAppIdFromApk() {
local apk_path="$1"
# regular expression (required)
local re="^\"L.*/MainActivity;"
# sed substitute expression
local se="s:^\"L\(.*\)/MainActivity;:\1:p"
# tr expression
local te=' / .';
local app_id="$(unzip -p $apk_path classes.dex | strings | grep -Eo $re | sed -n -e $se | tr $te)"
echo "$app_id"
}
ทดสอบบนเครื่องแมค 'strings' และ 'unzip' เป็นมาตรฐานของ linux ส่วนใหญ่ดังนั้นควรใช้กับ linux ด้วย
คุณสามารถติดตั้งPackage_Name_Viewer.apkบนอีมูเลเตอร์ของคุณและต่อไปคุณจะเห็นชื่อแพ็กเกจของแอพที่ติดตั้งไว้ทั้งหมดบนอีมูเลเตอร์ของคุณ
ฉันได้ลองสิ่งที่รวบรวมแล้วมันใช้งานได้ แต่เมื่อเร็ว ๆ นี้ฉันพบวิธีที่ง่ายที่สุด:
ดาวน์โหลดและติดตั้ง Appium จากเว็บไซต์ Appium
เปิด Appium-> การตั้งค่า Android เลือกไฟล์ apk เป้าหมาย จากนั้นคุณจะได้รับทุกสิ่งที่คุณต้องการข้อมูลแพ็คเกจข้อมูลกิจกรรม
หากต้องการใช้สิ่งนี้ในการสร้างสคริปต์แบบแบ็ตช์มันมีประโยชน์มากที่จะให้สคริปต์คืนค่าเพียงชื่อแพ็คเกจ (เช่นสำหรับการถอนการติดตั้งแอปเมื่อคุณมี APK)
นี่คือสคริปต์ที่ฉันใช้:
# extract the android package id from a built apk file
# usage ./getPackageName.sh <path-to-apk>
line=`aapt dump badging "$1" | grep package:\ name`
# above returns:
# package: name='com.calvium.myapp' versionCode='1' versionName='1.0'
if [[ $line =~ name=\'(.+)\'\ versionCode ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Failed to find package name"
exit 1
fi
ดังนั้นคุณสามารถเขียน:
adb ถอนการติดตั้ง `./getPackageName.sh file.apk`
สำหรับ Windows ต่อไปนี้ทำงานให้ฉัน:
:: // Initializing variables
SET adb="C:\Users\<User name>\AppData\Local\Android\Sdk\platform-tools\adb"
SET aapt="C:\Users\<User name>\AppData\Local\Android\Sdk\build-tools\22.0.0\aapt"
SET APKPath=C:\Users\<User name>\Desktop\APK\Instant_Instal\
CD %APKPath%
:: // Searching for apk file and storing it
FOR /F "delims=" %%f IN ('dir /S /B *.apk') DO SET "APKFullPath=%%f"
SET apk=%APKFullPath%
:: // Command adb install apk, run apk
%adb% install %apk%
:: // Fetching package name from apk
%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
FOR /F "tokens=2 delims='" %%s IN (temp.txt) DO SET pkgName=%%s
del temp.txt
:: // Launching apk
%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1
pause
บันทึก
โปรดแก้ไขเส้นทางของ adb, aapt, APKPath ตามเส้นทางของ adb, aapt และตำแหน่ง apk ในระบบของคุณ
ที่ทำงาน:
%adb% install %apk%
จะติดตั้งแอปพลิเคชันหากอุปกรณ์นั้นเชื่อมต่ออยู่%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
ชื่อแพ็กเกจนี้จะดึงรายละเอียดอื่น ๆ เช่น apk ฯลฯ รุ่นอื่น ๆ และเก็บไว้ในไฟล์ temp.txt ในตำแหน่งเดียวกับ apkextracts the package name and assigns to
pkgName` variable%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1
เปิดตัวแอพในสาระสำคัญรหัสข้างต้นติดตั้ง apk จากสถานที่ที่กำหนดในเดสก์ท็อป "เดสก์ท็อป \ APK \ Instant_Instal \" ไปยังอุปกรณ์และเปิดแอปพลิเคชัน
เนื่องจากฉันไม่สามารถค้นหาชื่อแพ็คเกจในไฟล์. apk ด้วยตัวแก้ไข (เช่นที่แนะนำข้างต้น) ฉันได้ตรวจสอบฟังก์ชั่นในแอป "ES Datei Explorer" / "ES File Explorer" (รุ่นฟรี) ที่ฉัน ติดตั้งแล้ว ในเครื่องมือนี้ชื่อแพคเกจจะแสดงอย่างถูกต้อง
เนื่องจากฉันคิดว่าตัวสำรวจไฟล์ที่ดีไม่ควรพลาดในโทรศัพท์ฉันแนะนำให้ใช้เครื่องมือนี้ (ถ้าคุณติดตั้ง apk บนมือถือแล้วและต้องรู้ชื่อแพ็คเกจ)
เนื่องจากมีการกล่าวถึงในเอกสารประกอบ Android ที่AAPT เลิกใช้แล้วการรับชื่อแพ็กเกจโดยใช้คำสั่ง AAPT2 ใน Linux มีดังนี้:
./aapt2 dump packagename <path_to_apk>
เนื่องจากฉันใช้ Gradle build รุ่นเก่าฉันต้องดาวน์โหลด AAPT2 เวอร์ชันใหม่ตามที่กล่าวไว้ที่นี่:
ดาวน์โหลด AAPT2 จาก Google Maven
การใช้เครื่องมือสร้างใน sdk ของฉัน - 25.0.3, 26.0.1 และ 27.0.3, การดำเนินการคำสั่ง aapt2 แสดงข้อผิดพลาด: ไม่สามารถเปิด 'packagename': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว นั่นเป็นเหตุผลที่ฉันไปสำหรับ AAPT2 เวอร์ชันใหม่
ฉันใช้ 3.3.0-5013011 สำหรับ linux
คุณสามารถใช้Analyze APK...
จากเมนู Build ใน Android Studio มันจะแสดงชื่อแพ็คเกจที่ด้านบนของหน้าต่างใหม่
aapt list -a "path_to_apk"
ฉันขอแนะนำให้คุณบันทึกไว้ใน. txt เพราะอาจยาวมาก ดังนั้น:
aapt list -a "path_to_apk"> file.txt
จากนั้นดู file.txt ในไดเรกทอรีปัจจุบันของคุณ