web-dev-qa-db-ja.com

Android AP​​Kのパッケージ名を読み取ります

Android AP​​Kのパッケージ名を取得する必要があります。 APKを解凍してAndroidManifest.xmlの内容を読み取ろうとしましたが、テキストファイルではないようです。

APKのパッケージ名を抽出するにはどうすればよいですか?

177
Dagang
aapt dump badging <path-to-apk> | grep package:\ name
285
hackbod

携帯電話にapkをインストールしてから、

adbを使用して接続すると、adbシェルを起動し、pm list packages -fを実行できます。これにより、インストールされている各apkのパッケージ名が表示されます。

Androidアプリのパッケージ名を検索して、Intentを使用してWebからマーケットアプリを起動する

68
Danail

Google Playを見ていて、そのパッケージ名を知りたい場合は、URLまたはアドレスバーを見ることができます。パッケージ名を取得します。ここでcom.landshark.yaumはパッケージ名です

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

次のbashスクリプトは、パッケージ名とメインアクティビティ名を表示します。

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
12
Brad Parks

MS Notepadを使用してAndroidManifest.xmlを開く場合、フレーズpackageを検索すると、次のようになります。

package manifest $xxx.xxxxxxx.xxxxxxx |

ここで、xxx.xxxxxxx.xxxxxxxはパッケージ名であり、各文字の後にスペースが書き込まれています。

特定のツールがインストールされていない場合に便利な方法です。

12
Wojciech

@hackbodの回答に基づいていますが、Windowsに関連しています。

aaptコマンドはAndroid\SDK\build-tools\versionにあります。 appt command(Android Asset Packaging Tool)の詳細については、こちらをお読みください https://stackoverflow.com/a/28234956/812915

dumpaaptサブコマンドは、個々の要素またはパッケージの一部の値を表示するために使用されます。

aapt dump badging <path-to-apk>

package: name情報を持つ行のみを表示する場合は、findstrを使用します

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

他のWindowsユーザーに役立つことを願っています!

8
equiman

プログラマティックアンサー

プログラムでこれを行う必要がある場合は、単に答えを脳に入力するよりも少し複雑です。すべてのアプリに署名するために使用するスクリプトがありますが、それぞれ異なるキーを使用します。 パッケージ名のみを出力として取得する2つの方法を次に示します。これにより、変数に入れたり、必要な処理を実行できます。

出力例:com.example.appname(およびそれ以上)

必要条件

aapt-Android Asset Packaging Tool、 SDK Toolsダウンロードの一部

解決策1

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'

この形式を維持するために、開発者からのコミットメントはありません。

解決策2

awkを使用して、フィールドセパレーターとして"を指定し、package=で行を検索し、その行の2番目の「フィールド」のみを出力します。

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

このメソッドの弱点は、出力のpackage=セクションでのみAndroid Manifest:を出力することに依存していることです。この形式を維持するために、開発者からのコミットメントはありません。

解決策3

apktool dを使用してapkファイルを展開し、AndroidManifest.xmlを読み取ります。

これが最善の方法ですが、AndroidManifest.xmlはバイナリファイルであり、テキストに変換するために表示されるすべてのSO回答は機能しません。 (単純なunzipの代わりにapktool dを使用すると、これを行うことができますが、そうしません。)この問題の解決策がある場合はコメントしてください

5
Bruno Bronosky

APPSを既にスマートフォンにインストールしている場合、非常に簡単な方法があります。次のAPPのいずれかを使用します。

パッケージ名ビューアーアプリ

2
Hexodus

簡単な解決策は、Open Android St​​udio-> Build-> Analyze Apk ...となります。APKをブラウズして選択すると、パッケージ名とほとんど読み込めるようになります。

2
Sai Kiran

パッケージ名だけを知りたい場合は、adb logcatを実行し、目的のアクティビティを起動してください。パッケージ名に関するヒントが表示されます。

2
sat

別の解決策は、aaptリストを使用し、sedを使用してそれを解析することです。

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

2
JohnnyLambada

のみ Linuxのパッケージ名を抽出するための最良かつ最も簡単な方法は

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

説明:

  1. AAPTはAPK情報を抽出します
  2. パッケージ情報に関する行のみを保持するGrep "package"
  3. 次の正規表現を使用してのみ、sedで行全体をパッケージ名に置き換えます:package: name='([a-z0-9.]*)'.*および最初の(そして唯一の)一致するグループに置き換えます。
1
m0skit0

APKからAndroidManifest.xmlを抽出し、すべてのNULLバイトを削除し、ストリング「manifest」の後まですべてをスキップすると、長さバイトの後にパッケージ名が続きます(その後に続くもの)。難しいタスクには、すばらしい GEMA ツールを使用するため、コマンドは次のようになります。

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

もちろん、他のツールを使用してフィルタリングを行うことができます。

1

いくつかのテストシナリオのように、Android SDKがインストールされていない場合、次のbashメソッドを使用してパッケージ名を取得できます。

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

Macでテスト済み。 「strings」と「unzip」はほとんどのLinuxで標準であるため、Linuxでも動作するはずです。

0
mmccabe

エディターを使用して.apkファイルでパッケージ名を見つけることができなかったため(上記のように)、アプリ「ES Datei Explorer」/「ES File Explorer」(無料版)で機能を確認しました。既にインストールされていました。このツールでは、パッケージ名が適切に表示されます。
携帯電話に優れたファイルエクスプローラーがなくてはならないと思うので、このツールを使用することをお勧めします(既にモバイルにapkをインストールしていて、パッケージ名を知っている必要がある場合)。

0
FredyWenger

バッチスクリプトでこれを使用するには、スクリプトがパッケージ名のみを返すようにすると便利です(たとえば、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`

0
Ben Clayton

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、およびシステム内のapkの場所のパスに従って、adb、aapt、APKPathのパスを編集してください。

ワーキング:

  • ここでは、デスクトップのフォルダー「\ Desktop\APK\Instant_Instal \」にapkを追加しました。
  • コマンド%adb% install %apk%は、デバイスが接続されている場合にアプリケーションをインストールします。
  • この%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txtは、パッケージ名と、apkのバージョンなどのその他の詳細を取得し、apkと同じ場所のtemp.txtファイルに保存します。
  • FOR/F "tokens = 2 delims = '" %% s IN(temp.txt)DO SET pkgName = %% sextracts the package name and assigns topkgName`変数
  • 最後に%adb% Shell monkey -p %pkgName% -c Android.intent.category.LAUNCHER 1がアプリを起動します。

本質的に、上記のコードはデスクトップ「Desktop\APK\Instant_Instal \」の指定された場所からデバイスにapkをインストールし、アプリケーションを起動します。

0
Kailas

私は逆コンパイルのことも試みましたが、うまくいきますが、最近私は最も簡単な方法を見つけました:

  1. Appium Webサイト からAppiumをダウンロードしてインストールします

  2. Appium-> Android設定を開き、ターゲットapkファイルを選択します。そして、必要なものすべて、パッケージ情報、アクティビティ情報を取得します。

0
wenwen

AndroidのドキュメントでAAPTが非推奨になったと記載されているため、LinuxでAAPT2コマンドを使用してパッケージ名を取得する方法は次のとおりです。

./aapt2 dump packagename <path_to_apk>

私は古いバージョンのGradleビルドを使用しているので、ここで述べたように新しいバージョンのAAPT2をダウンロードする必要がありました。

Google MavenからAAPT2をダウンロード

SDKのビルドツール-25.0.3、26.0.1、および27.0.3を使用して、aapt2コマンドを実行するとエラーが表示されます。「パッケージ名」を開けません:そのようなファイルまたはディレクトリはありません。それが、AAPT2の新しいバージョンに行った理由です。

Linuxでは3.3.0-5013011を使用しました。

0
user198530

エミュレータにPackage Name Viewer.apkをインストールすると、エミュレータにインストールされているすべてのアプリのパッケージ名を確認できます。

0
esideli