Android APKのパッケージ名を取得する必要があります。 APKを解凍してAndroidManifest.xml
の内容を読み取ろうとしましたが、テキストファイルではないようです。
APKのパッケージ名を抽出するにはどうすればよいですか?
aapt dump badging <path-to-apk> | grep package:\ name
携帯電話にapkをインストールしてから、
adbを使用して接続すると、adbシェルを起動し、pm list packages -fを実行できます。これにより、インストールされている各apkのパッケージ名が表示されます。
Google Playを見ていて、そのパッケージ名を知りたい場合は、URLまたはアドレスバーを見ることができます。パッケージ名を取得します。ここでcom.landshark.yaum
はパッケージ名です
https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd
次の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
MS Notepadを使用してAndroidManifest.xmlを開く場合、フレーズpackage
を検索すると、次のようになります。
package manifest $xxx.xxxxxxx.xxxxxxx |
ここで、xxx.xxxxxxx.xxxxxxxはパッケージ名であり、各文字の後にスペースが書き込まれています。
特定のツールがインストールされていない場合に便利な方法です。
@hackbodの回答に基づいていますが、Windowsに関連しています。
aapt
コマンドはAndroid\SDK\build-tools\version
にあります。 appt command
(Android Asset Packaging Tool)の詳細については、こちらをお読みください 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ユーザーに役立つことを願っています!
プログラムでこれを行う必要がある場合は、単に答えを脳に入力するよりも少し複雑です。すべてのアプリに署名するために使用するスクリプトがありますが、それぞれ異なるキーを使用します。 パッケージ名のみを出力として取得する2つの方法を次に示します。これにより、変数に入れたり、必要な処理を実行できます。
出力例:com.example.appname
(およびそれ以上)
aapt
-Android Asset Packaging Tool、 SDK Toolsダウンロードの一部
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:
を出力することに依存していることです。この形式を維持するために、開発者からのコミットメントはありません。
apktool d
を使用してapkファイルを展開し、AndroidManifest.xmlを読み取ります。
これが最善の方法ですが、AndroidManifest.xmlはバイナリファイルであり、テキストに変換するために表示されるすべてのSO回答は機能しません。 (単純なunzip
の代わりにapktool d
を使用すると、これを行うことができますが、そうしません。)この問題の解決策がある場合はコメントしてください
APPSを既にスマートフォンにインストールしている場合、非常に簡単な方法があります。次のAPPのいずれかを使用します。
簡単な解決策は、Open Android Studio-> Build-> Analyze Apk ...となります。APKをブラウズして選択すると、パッケージ名とほとんど読み込めるようになります。
パッケージ名だけを知りたい場合は、adb logcatを実行し、目的のアクティビティを起動してください。パッケージ名に関するヒントが表示されます。
別の解決策は、aaptリストを使用し、sedを使用してそれを解析することです。
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"
のみ Linuxのパッケージ名を抽出するための最良かつ最も簡単な方法は
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
説明:
package: name='([a-z0-9.]*)'.*
および最初の(そして唯一の)一致するグループに置き換えます。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}'
もちろん、他のツールを使用してフィルタリングを行うことができます。
いくつかのテストシナリオのように、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でも動作するはずです。
エディターを使用して.apkファイルでパッケージ名を見つけることができなかったため(上記のように)、アプリ「ES Datei Explorer」/「ES File Explorer」(無料版)で機能を確認しました。既にインストールされていました。このツールでは、パッケージ名が適切に表示されます。
携帯電話に優れたファイルエクスプローラーがなくてはならないと思うので、このツールを使用することをお勧めします(既にモバイルに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、およびシステム内のapkの場所のパスに従って、adb、aapt、APKPathのパスを編集してください。
ワーキング:
%adb% install %apk%
は、デバイスが接続されている場合にアプリケーションをインストールします。%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
は、パッケージ名と、apkのバージョンなどのその他の詳細を取得し、apkと同じ場所のtemp.txtファイルに保存します。extracts the package name and assigns to
pkgName`変数%adb% Shell monkey -p %pkgName% -c Android.intent.category.LAUNCHER 1
がアプリを起動します。本質的に、上記のコードはデスクトップ「Desktop\APK\Instant_Instal \」の指定された場所からデバイスにapkをインストールし、アプリケーションを起動します。
私は逆コンパイルのことも試みましたが、うまくいきますが、最近私は最も簡単な方法を見つけました:
Appium Webサイト からAppiumをダウンロードしてインストールします
Appium-> Android設定を開き、ターゲットapkファイルを選択します。そして、必要なものすべて、パッケージ情報、アクティビティ情報を取得します。
AndroidのドキュメントでAAPTが非推奨になったと記載されているため、LinuxでAAPT2コマンドを使用してパッケージ名を取得する方法は次のとおりです。
./aapt2 dump packagename <path_to_apk>
私は古いバージョンのGradleビルドを使用しているので、ここで述べたように新しいバージョンのAAPT2をダウンロードする必要がありました。
SDKのビルドツール-25.0.3、26.0.1、および27.0.3を使用して、aapt2コマンドを実行するとエラーが表示されます。「パッケージ名」を開けません:そのようなファイルまたはディレクトリはありません。それが、AAPT2の新しいバージョンに行った理由です。
Linuxでは3.3.0-5013011を使用しました。
エミュレータにPackage Name Viewer.apkをインストールすると、エミュレータにインストールされているすべてのアプリのパッケージ名を確認できます。