Đọc tên gói của APK Android


200

Tôi cần lấy tên gói của APK Android. Tôi đã cố gắng giải nén APK và đọc nội dung của nó AndroidManifest.xml, nhưng có vẻ như đó không phải là một tệp văn bản.

Làm cách nào tôi có thể trích xuất tên gói của APK?

Câu trả lời:


320
aapt dump badging <path-to-apk> | grep package:\ name

1
Có cách nào để gọi điều này từ trong mã Android không? Tôi muốn có thể khởi chạy gói apk tôi tải xuống thông qua ứng dụng của mình.
Matt Mặc

7
appt dump badging <path-to-apk> | gói grep: \ name
herbertD

2
@Campiador bạn chỉ có thể gõ cho đến khi đường ống |, nhấn enter và sau đó chỉ cần tìm kiếm đầu ra cho tham số mong muốn của bạn. Chỉ cần nhớ rằng aaptcần phải đi trên con đường của bạn
Patrick

Xem câu trả lời của tôi dưới đây nếu bạn cần lấy chương trình này (đối với kịch bản).
Bruno Bronosky

15
aaptlệnh được đặt dưới Android\SDK\build-tools\version. Lệnh trên windows có thể aapt dump badging <path-to-apk> | findstr -i "package: name"hoặcaapt dump badging <path-to-apk>
Equiman

75

Bạn có thể cài đặt apk trên điện thoại của mình, sau đó

kết nối bằng adb, bạn có thể khởi chạy shell adb và thực thi các gói danh sách pm -f, hiển thị tên gói cho mỗi apk đã cài đặt.

Điều này được lấy từ Tìm tên gói cho ứng dụng Android để sử dụng Ý định để khởi chạy ứng dụng Market từ web


1
Ngoài ra, bạn sẽ phải đảm bảo rằng bạn đang chạy với các đặc quyền nâng cao. Về cơ bản, trong terminal, sử dụng sulệnh trước.
palswim

4
để tìm kiếm tên gói cụ thểpm list packages -f | grep term-to-search-for
Patrick Favre

14

Dựa trên câu trả lời @hackbod ... nhưng liên quan đến windows.

aaptlệnh được đặt trên Android\SDK\build-tools\version. Nếu bạn cần thêm thông tin về appt commandcông cụ (Công cụ đóng gói tài sản Android), hãy đọc https://stackoverflow.com/a/28234956/812915

Lệnh dumpphụ aaptđược sử dụng để hiển thị các giá trị của các phần tử hoặc phần riêng lẻ của gói:

aapt dump badging <path-to-apk>

Nếu bạn chỉ muốn xem dòng có package: namethông tin, hãy sử dụngfindstr

aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"

Hy vọng nó sẽ giúp người dùng windows khác!


13

Nếu bạn đang xem google play và muốn biết tên gói của nó thì bạn có thể xem url hoặc thanh địa chỉ. Bạn sẽ nhận được tên gói. Đây com.landshark.yaumlà tên gói

 https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd

12

Nếu bạn mở AndroidManifest.xml bằng MS Notepad, hãy tìm kiếm cụm từ packagevà bạn sẽ tìm thấy sau đây:

package manifest $xxx.xxxxxxx.xxxxxxx |

trong đó xxx.xxxxxxx.xxxxxxx là tên gói của bạn, chỉ được viết với khoảng trắng sau mỗi ký tự.

Đó là cách hữu ích khi bạn không cài đặt bất kỳ công cụ cụ thể nào.


Điều này đặc biệt hữu ích nếu mã cho ứng dụng trên github! Dễ dàng hơn nhiều so với các phương pháp khác, cảm ơn!
sarink

1
Tôi đã giải nén APK, nhưng AndroidManifest.xml là một tệp nhị phân. Lạ nhưng đúng.
phatmann

12

Tập lệnh bash sau đây sẽ hiển thị tên gói và tên hoạt động chính:

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"

chạy nó như vậy:

apk_package.sh /path/to/my.apk

Không bao giờ kết hợp grep và sed với awk. Sử dụng awk là đủ.
Bruno Bronosky

8

Một câu trả lời có lập trình

Nếu bạn cần thực hiện việc này theo chương trình, thì nó liên quan nhiều hơn một chút so với việc chỉ đưa câu trả lời vào não của bạn. Tôi có một tập lệnh mà tôi sử dụng để ký tất cả các ứng dụng của chúng tôi, nhưng mỗi tập lệnh sử dụng một khóa khác nhau. Dưới đây là 2 cách để chỉ lấy Tên gói làm đầu ra để bạn có thể đặt nó trong một biến hoặc làm bất cứ điều gì bạn cần với nó.

Kết quả ví dụ: com.example.appname(và không có gì nữa)

Yêu cầu

aapt- Công cụ đóng gói tài sản Android, một phần của công cụ SDK tải xuống

Giải pháp 1

Sử dụng awkchỉ định 'làm Dấu tách trường, tìm kiếm một dòng package: name=và chỉ in "trường" thứ 2 trong dòng:

aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'

Một điểm yếu của phương pháp này là nó dựa vào aapt để xuất các trường thông tin gói theo cùng một thứ tự:

package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'

Chúng tôi không có cam kết từ các nhà phát triển để duy trì định dạng này.

Giải pháp 2

Sử dụng awkchỉ định "làm Dấu tách trường, tìm kiếm một dòng package=và chỉ in "trường" thứ 2 trong dòng:

aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'

Một điểm yếu của phương pháp này là nó chỉ dựa vào aapt để xuất ra package=trong Android Manifest:phần đầu ra. Chúng tôi không có cam kết từ các nhà phát triển để duy trì định dạng này.

Giải pháp 3

Mở rộng tệp apk với apktool dvà đọc AndroidManifest.xml.

Đây sẽ là phương pháp tốt nhất, nhưng AndroidManifest.xml là một tệp nhị phân và tất cả các câu trả lời SO tôi thấy để chuyển đổi nó thành văn bản không hoạt động. (Sử dụng apktool dthay vì đơn giản unzipđược cho là để làm điều này cho bạn, nhưng không.) Hãy bình luận nếu bạn có giải pháp cho vấn đề này


1
Cảm ơn đã cung cấp thêm thông tin để hiểu thay vì chỉ đưa ra một dòng lệnh để sao chép.
Ali Zeynali

4

Một giải pháp đơn giản sẽ là Mở Android Studio -> Build -> Phân tích Apk ... duyệt và chọn APK ngay bây giờ bạn có thể tìm thấy tên gói và khá nhiều bạn có thể đọc.


2

Nếu bạn chỉ muốn biết tên gói, chạy adb logcat, khởi chạy hoạt động bạn muốn, bạn sẽ nhận được một gợi ý về tên gói.


2

Một giải pháp khác là sử dụng danh sách aapt và sử dụng sed để phân tích cú pháp đó:

aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"


Tên nhóm gói chỉ trùng hợp với Tên gói trong một số ứng dụng. Bạn thực sự cần phải được sử dụng A:package="com.example.appname"trong Android Manifest:phần nếu bạn làmaapt list -a
Bruno Bronosky


2

Một phương pháp rất đơn giản là sử dụng apkanalyzer.

apkanalyzer manifest application-id "${_path_to_apk}"

1

Tôi nghĩ rằng cách tốt nhất và đơn giản nhất để chỉ trích xuất tên gói trong Linux là

aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"

Giải trình:

  1. AAPT trích xuất thông tin APK
  2. Grep "gói" để chỉ giữ dòng về thông tin gói
  3. Tạo sed thay thế toàn bộ dòng bằng tên gói chỉ sử dụng regex sau: package: name='([a-z0-9.]*)'.*và thay thế bằng nhóm khớp đầu tiên (và duy nhất).

1

Bạn có thể trích xuất AndroidManifest.xml từ APK, xóa tất cả các byte NULL, bỏ qua mọi thứ cho đến sau chuỗi 'tệp kê khai' và sau đó bạn ở một byte có độ dài theo sau là tên gói (và cái gì xuất hiện sau nó). Đối với nhiệm vụ khó khăn, tôi sử dụng công cụ Gema tuyệt vời , vì vậy lệnh trông như thế này:

7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'

Tất nhiên, bạn có thể sử dụng bất kỳ công cụ nào khác để lọc.


1

Nếu bạn chưa cài đặt SDK Android, như trong một số trường hợp thử nghiệm, bạn có thể lấy tên gói bằng phương pháp bash sau:

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"
}

Đã thử nghiệm trên máy mac. 'chuỗi' và 'giải nén' là tiêu chuẩn trên hầu hết các linux, vì vậy cũng nên hoạt động trên linux.


0

bạn có thể cài đặt Gói_Name_Viewer.apk trên trình giả lập của mình và tiếp theo bạn có thể thấy tên gói của tất cả các ứng dụng được cài đặt trên trình giả lập của mình.


0

Tôi cũng đã thử điều khử biên dịch, nó hoạt động nhưng gần đây tôi đã tìm thấy cách dễ nhất:

  1. Tải xuống và cài đặt Appium từ trang web Appium

  2. Mở Appium-> Cài đặt Android, chọn tệp apk đích. Và sau đó bạn có được mọi thứ bạn muốn, thông tin gói, thông tin hoạt động.


0

Để sử dụng điều này trong tập lệnh theo lô, thật tiện lợi khi tập lệnh chỉ trả về tên gói (ví dụ: để gỡ cài đặt ứng dụng khi bạn có APK).

Đây là kịch bản tôi sử dụng:

# 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

có sẵn trên ý chính

Vì vậy, bạn có thể viết:

adb gỡ cài đặt `./getPackageName.sh file.apk`


0

Đối với Windows sau đây làm việc cho tôi:

:: // 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

Ghi chú

Vui lòng chỉnh sửa các đường dẫn của adb, aapt, APKPath theo các đường dẫn của adb, aapt và vị trí apk trong hệ thống của bạn.

Đang làm việc:

  • Ở đây tôi đã thêm apk trong một thư mục trên Desktop "\ Desktop \ APK \ Instant_Instal \".
  • Lệnh %adb% install %apk% cài đặt ứng dụng nếu thiết bị được kết nối.
  • Điều này %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt tìm nạp tên gói và một vài chi tiết khác như phiên bản vv của apk và lưu trữ trong tệp temp.txt ở cùng vị trí với apk.
  • FOR / F "mã thông báo = 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% sextracts the package name and assigns to pkgName` biến
  • Cuối cùng %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1ra mắt ứng dụng.

Về bản chất, đoạn mã trên sẽ cài đặt apk từ vị trí đã cho trong máy tính để bàn "Desktop \ APK \ Instant_Instal \" cho thiết bị và khởi chạy ứng dụng.


0

Vì tôi không thể tìm thấy tên gói trong tệp .apk bằng trình chỉnh sửa (như được đề xuất ở trên), tôi đã kiểm tra các chức năng trong Ứng dụng "ES Datei Explorer" / "ES File Explorer" (phiên bản miễn phí) mà tôi đã cài đặt rồi. Trong công cụ này, tên gói được hiển thị đúng.
Vì tôi nghĩ không nên thiếu trình thám hiểm tệp tốt trên điện thoại, tôi khuyên bạn nên sử dụng công cụ này (nếu bạn đã cài đặt apk trên điện thoại di động và phải biết tên gói).


0

Do tài liệu AAPT đã đề cập trong tài liệu Android đã bị từ chối, việc lấy tên gói bằng lệnh AAPT2 trong Linux như sau:

./aapt2 dump packagename <path_to_apk>

Vì tôi đang sử dụng phiên bản cũ hơn của bản dựng Gradle, tôi đã phải tải xuống phiên bản AAPT2 mới hơn như được đề cập ở đây:

Tải xuống AAPT2 từ Google Maven

Sử dụng các công cụ xây dựng trong sdk của tôi - 25.0.3, 26.0.1 và 27.0.3, thực thi lệnh aapt2 cho thấy lỗi: Không thể mở 'packagename': Không có tệp hoặc thư mục như vậy. Đó là lý do tại sao tôi chọn phiên bản mới hơn của AAPT2.

Tôi đã sử dụng 3.3.0-5013011 cho linux.


0

Bạn có thể sử dụng Analyze APK...từ menu Build trong Android Studio, nó sẽ hiển thị tên gói ở đầu cửa sổ mới.


-1

danh sách aapt -a "path_to_apk"

Tôi khuyên bạn nên lưu nó trong .txt, vì nó có thể rất dài. Vì thế:

danh sách aapt -a "path_to_apk"> file.txt

Sau đó xem file.txt trong thư mục hiện tại của bạn.

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.