답변:
사전 설치된 응용 프로그램은 /system/app
폴더에 있습니다. 사용자 설치 응용 프로그램은에 /data/app
있습니다. 루팅 된 전화가 없으면 액세스 할 수 없습니다. 루팅 된 전화는 없지만이 코드를 사용해보십시오.
public class Testing extends Activity {
private static final String TAG = "TEST";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File appsDir = new File("/data/app");
String[] files = appsDir.list();
for (int i = 0 ; i < files.length ; i++ ) {
Log.d(TAG, "File: "+files[i]);
}
}
그것은 내 뿌리 HTC 마술과 에뮤에 APK를 나열합니다.
패키지 관리자 ( pm
)를 사용하여 패키지 adb shell
를 나열 할 수 있습니다 .
adb shell pm list packages | sort
.apk
파일이 있는 위치를 표시 합니다.
adb shell pm path com.king.candycrushsaga
package:/data/app/com.king.candycrushsaga-1/base.apk
그리고 adb pull
APK를 다운로드합니다.
adb pull data/app/com.king.candycrushsaga-1/base.apk
adb pull /data/app/com.example.app-filename.apk path/to/desired/destination
이전에 설치 한 것의 APK 파일을 얻으려면 다음을 수행하십시오.
휴대 전화를 근절하거나을 사용 adb
하거나 아무 것도 쓰지 않아도됩니다 .
표준 위치는 없지만 PackageManager를 사용하여 패키지를 찾을 수 있으며 여기에서 얻을 수있는 ApplicationInfo 클래스에는 특정 패키지에 대한 다양한 정보가 있습니다. .apk 경로, 데이터 디렉토리 경로, 경로 리소스 전용 .apk (포워드 잠금 앱의 경우) 등으로 전달합니다. 다른 앱과의 관계에 따라이 디렉토리를 읽을 권한이 있거나 없을 수 있습니다. 그러나 모든 앱은 리소스 .apk (앞으로 잠그지 않은 앱의 실제 .apk)를 읽을 수 있습니다.
셸에서 방금 파고 드는 경우 현재 전달되지 않은 앱은 /data/app/.apk에 있습니다. 쉘 사용자는 디렉토리를 나열 할 수 없지만 특정 .apk를 읽을 수 있습니다. 향후 릴리스에서는 이름 지정 규칙이 약간 변경되므로 동일하게 유지되지는 않지만 패키지 관리자에서 .apk 경로를 가져 오면 쉘에서 사용할 수 있습니다.
사전 설치된 앱은 일반적으로 / system / app에 있고 사용자 설치 앱은 / data / app에 있습니다.
"adb pull"을 사용할 수 있지만 APK 파일의 전체 경로를 알아야합니다. 에뮬레이터에서 "adb shell"+ "ls"를 사용하여 디렉토리 목록을 얻을 수 있습니다. 그러나 Android 기기에서는 보안상의 이유로 "/ data"폴더에서이를 수행 할 수 없습니다. APK 파일의 전체 경로를 어떻게 알 수 있습니까?
PackageManager를 쿼리하는 프로그램을 작성하여 설치된 모든 앱의 전체 목록을 얻을 수 있습니다. 아래의 짧은 코드 스 니펫 :
PackageManager pm = getPackageManager();
List<PackageInfo> pkginfo_list = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
List<ApplicationInfo> appinfo_list = pm.getInstalledApplications(0);
for (int x=0; x < pkginfo_list.size(); x++){
PackageInfo pkginfo = pkginfo_list.get(x);
pkg_path[x] = appinfo_list.get(x).publicSourceDir; //store package path in array
}
그러한 정보를 제공 할 앱을 찾을 수도 있습니다. 그것들이 많이 있습니다. 이것을 사용해보십시오 (AppSender).
마켓 플레이스에서 설치
설치 후 APK를 유지할지 여부는 마켓 플레이스의 동작입니다. Google Play는 설치 후 APK를 유지하지 않습니다. 다른 타사 마켓 플레이스에는 다른 동작이있을 수 있습니다.
개발 / 디버그 도구 (adb, eclipse, android studio)에서 설치
디버그 도구에서 apk를 설치 adb install
하거나 직접 호출 하거나 eclipse / android studio에서 apk를 설치하면 apk가 adb push
일반적으로 공개 읽기 및 쓰기 가능한 디렉토리 로 전송됩니다 ( ) /data/local/tmp/
. 그런 다음 도구는 pm
명령을 사용하여 설치하고 임시 APK를 삭제합니다./data/local/tmp/
하고 성공적인 설치 후 을 합니다.
다음과 같이 디버그 출력에서 이러한 정보를 얻을 수 있습니다.
$ adb install bin/TestApplication.apk
3155 KB/s (843375 bytes in 0.260s)
pkg: /data/local/tmp/TestApplication.apk
Success
시스템이 APK를 유지하는 방법
물론 시스템은 모든 APK를 어딘가에 저장해야합니다. 시스템이 다양한 유형의 APK를 기반으로 APK를 유지할 수있는 위치는 세 곳입니다.
재고 앱
시스템 실행 및 Google 서비스의 핵심 앱을 포함하여 일반적으로 제조 업체에서 기기로 배송되며 디렉토리 /system/app
및 에서 찾을 수 있습니다 /system/priv-app
.
사용자 설치 앱
대부분의 APK가이 범주에 속합니다. 이 APK는 일반적으로 마켓 플레이스에서 사용자 또는 옵션 adb install
없이 설치 -s
합니다. /data/app
루팅 된 장치 의 디렉토리 에서 찾을 수 있습니다 .
sdcard의 앱
APK android:installLocation="auto"
가 매니페스트 에서 sdcard의 설치 위치를 활성화하면 시스템의 앱 관리자 메뉴에서 sdcard로 앱을 이동할 수 있습니다. 이 APK는 일반적으로 sdcard의 보안 폴더에 /mnt/sdcard/asec
있습니다.
설치 위치를 sdcard로 설정하는 다른 방법은 명령을 사용하는 것 adb install -s apk-to-install.apk
입니다.
참고로, 사전 설치된 앱의 .apk
파일은 더 이상 단일 파일에 없습니다. 디렉토리에 사전 설치된 모든 앱 /system/app
또는 /system/priv-app
최신 Android 버전의 파일이 들어있는 폴더가 있습니다 .
에뮬레이터에 앱을 설치하면 .apk 파일이
data / app 그런 다음 ls data / app // 존재 여부를 확인했습니다.
앱을 설치 한 후 ls command vie shell을 사용하고 원하는 디렉토리를 확인하지만 설치하려는 응용 프로그램의 종류에 따라 다릅니다. 문제가있는 경우이 방법을 사용하여 Point 를 설치했습니다 .