Answers:
预安装的应用程序位于/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魔术和e中的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中。Shell用户可以读取特定的.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 调用或从eclipse / android studio安装apk adb push
,通常会将apk传输()到公共可读写目录/data/local/tmp/
。之后,该工具将使用pm
命令进行安装,/data/local/tmp/
安装成功后,它将删除临时apk 。
我们可以从调试输出中获取这些信息,如下所示。
$ 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版本的文件。
如果您使用的是eclipse goto DDMS,然后使用文件浏览器,则将看到System / Apps文件夹,而apks在那里
与所选答案上写的内容相反,您不需要root用户,并且可以获取已安装应用程序的APK,这就是我在应用程序上所做的操作(此处)。例:
List<PackageInfo> packages=getPackageManager().getInstalledPackages(0);
然后,对于列表中的每个项目,您都可以访问packageInfo.applicationInfo.sourceDir,这是已安装应用程序APK的完整路径。