sourcetip

Android APK의 패키지 이름 읽기

fileupload 2023. 8. 6. 10:18
반응형

Android APK의 패키지 이름 읽기

안드로이드 APK의 패키지 이름을 알아야 합니다.APK의 압축을 풀고 내용을 읽으려고 했습니다.AndroidManifest.xml파일이지만 텍스트 파일이 아닌 것 같습니다.

APK의 패키지 이름을 추출하려면 어떻게 해야 합니까?

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

Android 장치에 apk를 설치합니다. 그러면

시할수있다니습작다를 시작할 수 .adb shell 행실을 실행합니다.pm list packages -f설치된 각 apk의 패키지 이름을 나타냅니다.

이것은 웹에서 마켓 앱을 시작하기 위해 의도를 사용하기 위해 Android 앱의 패키지 이름 찾기에서 가져온 것입니다.

@hackbod 답변을 기반으로 하지만 Windows와 관련이 있습니다.

aapt은 다음 위치에 .Android\Sdk\build-tools\<build-tools-version>만약 당신이 무엇에 대한 더 많은 정보가 필요하다면.aapt명령(Android Asset Packaging Tool)은 이 https://stackoverflow.com/a/28234956/812915 을 참조하십시오.

dump의하 지휘권의 명령aapt패키지의 개별 요소 또는 부품 값을 표시하는 데 사용됩니다.aapt dump badging <path-to-apk>

package: name,사용하다findstr CMD의 PowerShell은 CMD의 경우)

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

공백이 포함된 경우 따옴표로 <path-to-apk>를 둘러싸야 합니다.

이것이 다른 윈도우 사용자들에게 도움이 되기를 바랍니다!

만약 당신이 구글 플레이를 보고 있고 그것의 패키지 이름을 알고 싶다면, 당신은 url이나 주소 표시줄을 볼 수 있습니다.패키지 이름이 표시됩니다.여기서com.landshark.yaum는 패키지 입니다.

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

다음 bash 스크립트는 패키지 이름과 기본 활동 이름을 표시합니다.

pk_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

메모장을 , AndroidManifest.xml 문구를 검색합니다.package다음과 같은 정보를 얻을 수 있습니다.

package manifest $xxx.xxxxxxx.xxxxxxx |

여기서 xxx.xxxxxxxxx.xxxxxxxxx는 각 문자 뒤에 공백으로 작성된 패키지 이름입니다.

특정 도구가 설치되어 있지 않을 때 유용한 방법입니다.

Android 설명서에 AAPT가 이상 사용되지 않는다고 나와 있으므로 Linux에서 AAPT2 명령을 사용하여 패키지 이름을 얻는 방법은 다음과 같습니다.

./aapt2 dump packagename <path_to_apk>

이전 버전의 Gradle build를 사용하고 있기 때문에 여기에 언급된 것처럼 AAPT2의 최신 버전을 다운로드해야 했습니다.

Google Maven에서 AAPT2 다운로드

my sdk - 25.0.3, 26.0.1 및 27.0.3의 빌드 도구를 사용하여 apt2 명령을 실행하면 다음 오류가 표시됩니다.'패키지 이름'을 열 수 없습니다.해당 파일 또는 디렉터리가 없습니다.그래서 AAPT2의 새로운 버전을 선택했습니다.

리눅스용으로 3.3.0-5013011을 사용했습니다.

프로그래밍 방식의 대답

만약 여러분이 이것을 프로그래밍 방식으로 해야 한다면, 그것은 여러분의 뇌에 답을 넣는 것보다 조금 더 관련이 있습니다.모든 앱에 서명하는 데 사용하는 스크립트가 있지만 각각 다른 키를 사용합니다.다음은 패키지 이름을 출력으로 가져오는 두 가지 방법으로 변수에 넣거나 필요한 작업을 수행할 수 있습니다.

예: 출예 력:com.example.appname(그리고 그 이상은 아닙니다)

요구 사항들

aaptSDK Tools 다운로드의 일부인 Android Asset Packaging Tool

솔루션 1

용사를 합니다.awk명다하를 합니다.'구분 로 필드구기분, 행을검니다합색로호다음▁▁line다▁for니▁as▁a▁search합검색▁field▁separator로 행을 검색합니다.package: name=다음 행의 두 번째 "필드"만 인쇄합니다.

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

이 방법의 단점은 apt를 사용하여 패키지 정보 필드를 동일한 순서로 출력한다는 것입니다.

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

우리는 개발자들로부터 이 형식을 유지하겠다는 약속을 받지 않았습니다.

솔루션 2

용사를 합니다.awk명다하를 합니다."구분 로 필드구기분, 행을검니다합색로호다음▁▁line다▁for니▁as▁a▁search합검색▁field▁separator로 행을 검색합니다.package=다음 행의 두 번째 "필드"만 인쇄합니다.

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

은 하여 apt를 출력한다는 입니다.package=의 경우에만Android Manifest:은 이.우리는 개발자들로부터 이 형식을 유지하겠다는 약속을 받지 않았습니다.

솔루션 3

을 apk로 합니다.apktool dAndroidManifest.xml 파일입니다.

할 때 나타나는 작동하지 ( 이것가좋은 AndroidManifest.xml 사이진트변로스데환하므는로표이시일텍되모는든응않작지하습동답이니다용이파장이은지법만방▁(사▁thisman▁(,▁answers▁i▁but▁would▁and▁the않작▁is습man니xmlxml응▁a지하은다동이이▁the▁be▁method답using▁file▁the▁all▁best▁android▁do)▁work▁not용것▁forif▁binary▁so모▁so데표apktool d한 단한것아라 unzip당신을 위해 이것을 해야 하지만, 그렇지 않습니다.)이 문제에 대한 해결책이 있으면 의견을 제시하십시오.

간단한 해결책은 Open Android Studio -> Build -> Analyze Apk... 패키지 이름과 읽을 수 있는 거의 모든 APK를 찾아 선택하는 것입니다.

사용할 수 있습니다.Analyze APK...Android Studio의 Build 메뉴에서 패키지 이름이 새 창 상단에 표시됩니다.

Mac의 경우:

방법 1:

zgong$ /Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt dump badging ~/Downloads/NonSIMCC-151-app-release-signed.apk
package: name='com.A.B' versionCode='2020111801' versionName='1.0.40' compileSdkVersion='29' compileSdkVersionCodename='10'
sdkVersion:'24'
targetSdkVersion:'29'
......

방법 2:

/Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt2 dump packagename ~/Downloads/NonSIMCC-151-app-release-signed.apk
com.A.B

일부 테스트 시나리오와 같이 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에서 테스트했습니다.'unzip'과 'unzip'은 대부분의 Linux에서 표준으로 제공되므로 Linux에서도 작동해야 합니다.

매우 간단한 방법은 분석기를 사용하는 것입니다.

apkanalyzer manifest application-id "${_path_to_apk}"

만약 당신이 단지 패키지 이름을 알고 싶다면, adblogcat을 실행하고, 당신이 원하는 활동을 시작하고, 당신은 패키지 이름에 대한 힌트를 얻을 것입니다.

또 다른 솔루션은 apt 목록을 사용하여 구문 분석하는 것입니다.

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

리눅스에서 패키지 이름만 추출하는 가장 좋고 간단한 방법은

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

설명:

  1. AAPT는 APK 정보를 추출합니다.
  2. 패키지 정보에 대한 줄만 유지하려면 Grep "package"
  3. 다음 정규식을 사용하여 전체 줄을 패키지 이름으로 바꾸십시오.package: name='([a-z0-9.]*)'.*첫 번째(및 유일한) 일치 그룹으로 대체합니다.

스마트폰에 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 파일.pk'

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

물론 다른 도구를 사용하여 필터링할 수도 있습니다.

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, apt, apk 위치에 따라 adb, apt, APK 경로를 편집하십시오.

작업:

  • 여기에서 데스크톱 "\Desktop\"의 폴더에 apk를 추가했습니다.APK\인스턴트_설치\".
  • 명령어%adb% install %apk%장치가 연결된 경우 응용 프로그램을 설치합니다.
  • 이것.%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt패키지 이름과 apk 버전 등과 같은 몇 가지 세부 정보를 가져와서 임시로 저장합니다.apk의 위치와 동일한 위치에 있는 txt 파일.
  • /='" %%IN (의 경우, "delimes delimes='" %s IN (208.txt)"을 합니다.extracts the package name and assigns to pkgName' 변수
  • 마내침.%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1앱을 실행합니다.

본질적으로 위의 코드는 데스크톱 "Desktop\"의 지정된 위치에서 apk를 설치합니다.APK\인스턴트_장치에 설치\"하고 응용 프로그램을 실행합니다.

다음을 통해 패키지 이름을 프로그래밍 방식으로 가져올 수 있습니다.

packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName

Package_Name_Viewer.apk를 에뮬레이터에 설치하면 에뮬레이터에 설치된 모든 앱의 패키지 이름을 볼 수 있습니다.

저도 디컴파일링을 시도해봤는데, 효과가 있었습니다. 하지만 최근에 가장 쉬운 방법을 찾았습니다.

  1. Appium 웹 사이트에서 Appium 다운로드 및 설치

  2. Appium->Android 설정을 열고 대상 apk 파일을 선택합니다.그러면 패키지 정보, 활동 정보 등 원하는 모든 것을 얻을 수 있습니다.

에디터(에서 제안한 것처럼파일에서 수 이미 " Explorer" / " File 버전했습니다.apk 파일에서 패키지 이름을 에디터로 찾을 수 없었기 때문에(위에서 제안한 것처럼), 이미 설치한 앱 "ES Datei Explorer" / "ES File Explorer"(무료 버전)에서 기능을 확인했습니다.이 도구에서는 패키지 이름이 올바르게 표시됩니다.
폰에서 좋은 파일 탐색기를 놓쳐서는 안 된다고 생각하기 때문에 (모바일에 apk를 이미 설치하고 패키지 이름을 알아야 한다면) 이 도구를 사용하는 것을 제안합니다.

앱에서 일반적인 APK 파일의 패키지 이름을 읽으려면 PackageInfo를 쉽게 분석할 수 있습니다.

fun getAPKPackageName(apkFile: File?): String? {
        if (apkFile == null || !apkFile.isFile || !apkFile.exists()) return null
        val apkFilePath = apkFile.absolutePath
        if (apkFilePath.isNullOrEmpty()) return null
        val packageManager = App.context.packageManager ?: return null
        val packageInfo = packageManager.getPackageArchiveInfo(apkFilePath, 0) ?: return null
        return packageInfo.packageName
    }

언급URL : https://stackoverflow.com/questions/6289149/read-the-package-name-of-an-android-apk

반응형