Abraham.P Asked: 2020-03-03 08:19:57 +0800 CST 2020-03-03 08:19:57 +0800 CST 2020-03-03 08:19:57 +0800 CST 如何使应用程序显示为已安装? 772 我的问题是我需要能够通过复制数据对应目录中的dex、data和apk来显示我的应用程序手动安装的应用程序,但问题是它无法识别为已安装。 我没有代码,因为我不知道如何实现它。 android 3 Answers Voted Jorgesys 2020-03-03T12:24:12+08:002020-03-03T12:24:12+08:00 将 dex 或 .apk(实际上只需要 .apk)复制到内部存储并尝试以编程方式安装它可能是不可能的。 选项是: 通过安装程序从设备运行安装 https://www.asus.com/support/faq/1006430 通过 adb 安装它: adb install path_to_apk https://developer.android.com/studio/command-line/adb.html#move 如果您在外部存储中有 .apk ,则可以通过这种方式完成,定义它所在的文件夹和 .apk 文件的名称: String DIRECTORIO_APK = "/Downloads/"; String NAME_APK = "myApplication.apk"; String MIME_TYPE = "application/vnd.android.package-archive"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + DIRECTORIO_APK + NAME_APK)), MIME_TYPE); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); Best Answer UselesssCat 2020-03-03T13:45:40+08:002020-03-03T13:45:40+08:00 可以从另一个应用程序安装应用程序(商店中有应用程序可以安装,也可以备份其他应用程序)。有几种方法可以做到这一点,具体取决于 Android 的版本。 打开 APK 文件的意图。 您可以尝试按如下方式安装该应用程序: Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); install.setDataAndType(uri, manager.getMimeTypeForDownloadedFile(downloadId)); startActivity(install); 您可以在此答案中找到完整代码。 包管理器 还有一个名为Package Installer的类,它提供了安装应用程序的能力。为此,代码如下所示: public static boolean installPackage(Context context, InputStream in, String packageName) throws IOException { PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); params.setAppPackageName(packageName); // set params int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream out = session.openWrite("COSU", 0, -1); byte[] buffer = new byte[65536]; int c; while ((c = in.read(buffer)) != -1) { out.write(buffer, 0, c); } session.fsync(out); in.close(); out.close(); session.commit(createIntentSender(context, sessionId)); return true; } private static IntentSender createIntentSender(Context context, int sessionId) { PendingIntent pendingIntent = PendingIntent.getBroadcast( context, sessionId, new Intent(ACTION_INSTALL_COMPLETE), 0 ); return pendingIntent.getIntentSender(); } 你可以检查这个问题。您可能需要INSTALL_PACKAGES权限。 使用 PM 包管理器: pm install /sdcard/com.twitter.android-1.apk 有用的命令 我认为您想要的最后一种方法是手动复制所有文件。为了解释这一点,我将翻译这篇文章In Depth: Android Package Manager and Package Installer 什么是包管理器和包安装程序? PackageInstaller 是用于交互式安装普通包的默认 Android 应用程序。PackageInstaller 提供了一个用户界面来管理应用程序/包。PackageInstaller 调用 InstallAppProgress 活动以接收来自用户的指令。InstallAppProgress 将要求包管理器通过 installd 安装包。源代码位于/packages/apps/PackageInstaller。 installd 守护进程的主要作用是通过 Linux 域套接字 /dev/socket/installed 接收来自 Package Manager Service 的请求。Installd 运行一系列步骤来安装具有 root 权限的 APK。 Package Manager是一个 API,用于管理应用程序的安装、卸载和更新。当我们安装 APK 文件时,包管理器会解析包文件 (APK) 并显示确认信息。当用户点击 OK 按钮时,Package Manager 使用这四个参数 { uri、installFlags、observer、installPackageName } 调用名为“installPackage”的方法。包管理器启动一个名为“包”的服务,现在所有的安装过程都在那里发生。Package Manager 服务运行在 system_service 进程中,安装守护进程(installd)作为本机进程运行。两者都在系统启动时启动。 APK安装过程详细是怎样的? 以下过程在包管理器服务中运行。 预计 将包添加到安装过程的队列中 确定合适的包安装位置 确定安装/更新是否合适 将apk文件复制到给定目录 确定应用程序的 UID 请求已安装的守护进程 创建应用目录并设置权限 将dex代码解压到缓存目录 在 packages.list/system/data/packages.xml 中反映已安装应用程序的最新状态 将 BroadCast 连同安装名称一起发送到系统。它们可以是 Intent.ACTION_PACKAGE_ADDED:如果是新的或 intent.ACTION_PACKAGE_REPLACED 如果是更新。 包管理器源代码位于 android 存储库中。包解析器 源代码。包安装程序 源代码。 如果您想手动执行此操作,则必须使用您自己的代码遵循相同的过程。生成app的uid,创建用户、目录和文件,更新保存已安装应用记录的文件,最后生成广播事件,让监听包安装事件的程序更新。.like三星的 Touchwiz 或 android 设置应用程序。 其他链接。 如何构建和运行 Android 应用程序 如何在 android 的后台安装应用程序 当我安装一个 android 应用程序时会发生什么? PS:您必须有权访问ROOT(以及暗示的一切),并且不同版本的Android之间可能不兼容相同的过程。而且我还没有尝试过这样做,因为它需要太多时间而且因为我不是那么任性:P 即便如此,参与Android源代码也很有趣:P A. Cedano 2020-03-05T17:41:32+08:002020-03-05T17:41:32+08:00 此过程称为侧载。 能够做到这一点的一个重要步骤是激活设备上的未知来源选项卡。 根据品牌,此选项卡将位于: inglés: Menu -> Settings -> Applications español: Menu -> Configuración -> Aplicaciones 或在 español: Menu -> Ajustes -> Ajustes adicionales -> Privacidad 或在 español: otro sitio -> te tocará a ti -> encontrarla :) 然后按照其他答案中的说明安装APK,直接打开APK文件,或者通过ADB,或者通过其他方法。 笔记: 使用侧载可能很危险,因为可以安装带有恶意代码的应用程序。
将 dex 或 .apk(实际上只需要 .apk)复制到内部存储并尝试以编程方式安装它可能是不可能的。
选项是:
https://www.asus.com/support/faq/1006430
通过 adb 安装它:
adb install path_to_apk
https://developer.android.com/studio/command-line/adb.html#move
如果您在外部存储中有 .apk ,则可以通过这种方式完成,定义它所在的文件夹和 .apk 文件的名称:
可以从另一个应用程序安装应用程序(商店中有应用程序可以安装,也可以备份其他应用程序)。有几种方法可以做到这一点,具体取决于 Android 的版本。
打开 APK 文件的意图。
您可以尝试按如下方式安装该应用程序:
您可以在此答案中找到完整代码。
包管理器
还有一个名为Package Installer的类,它提供了安装应用程序的能力。为此,代码如下所示:
你可以检查这个问题。您可能需要INSTALL_PACKAGES权限。
使用 PM 包管理器:
有用的命令
我认为您想要的最后一种方法是手动复制所有文件。为了解释这一点,我将翻译这篇文章In Depth: Android Package Manager and Package Installer
包管理器源代码位于 android 存储库中。包解析器
源代码。包安装程序 源代码。
如果您想手动执行此操作,则必须使用您自己的代码遵循相同的过程。生成app的uid,创建用户、目录和文件,更新保存已安装应用记录的文件,最后生成广播事件,让监听包安装事件的程序更新。.like三星的 Touchwiz 或 android 设置应用程序。
其他链接。
如何构建和运行 Android 应用程序
如何在 android 的后台安装应用程序
当我安装一个 android 应用程序时会发生什么?
PS:您必须有权访问ROOT(以及暗示的一切),并且不同版本的Android之间可能不兼容相同的过程。而且我还没有尝试过这样做,因为它需要太多时间而且因为我不是那么任性:P 即便如此,参与Android源代码也很有趣:P
此过程称为侧载。
能够做到这一点的一个重要步骤是激活设备上的未知来源选项卡。
根据品牌,此选项卡将位于:
或在
或在
然后按照其他答案中的说明安装APK,直接打开APK文件,或者通过ADB,或者通过其他方法。
笔记: