【问题标题】:How to make my app become system app?如何让我的应用成为系统应用?
【发布时间】:2012-02-03 21:48:02
【问题描述】:

我想让我的应用程序成为系统应用程序。我设法用root和busybox在我的手机上做到了。知道如何在没有busybox的情况下实现这一目标吗?

Runtime.getRuntime().exec(new String[] { "su", "-c", "mount -o rw,remount -t yaffs2 /system; " +
                "cp `ls /data/app/xxx*` /system/app; " +
                "rm /data/app/xxx*; " +
                "mount -o ro,remount -t yaffs2 /system; " +
                "reboot" });

除此之外,我还面临另一个问题。如果我从系统应用程序>用户应用程序切换回我的应用程序并重新启动。 Android 系统仍将我的应用识别为系统应用,即使该应用已驻留在 /data/app 中。

我使用下面的代码来检查我的应用是否是系统应用:

android.content.pm.ApplicationInfo.FLAG_SYSTEM

【问题讨论】:

  • 我认为你可以在没有busybox的情况下使用cat命令。我认为它和 cp 一样
  • 注意到了,“rm”呢。这是busybox命令还是默认android自带的?
  • 我认为rm 是busybox,但我不确定。您可以在模拟器上使用 adb shell 来找出答案。

标签: android system android-applicationinfo


【解决方案1】:

参考以下代码,借助 RootTools 方法将用户应用 apk 移动到 root 设备中的系统应用 apk 中。

    PackageInfo paramPackageInfo = null;
        try {
            paramPackageInfo = this.getPackageManager().getPackageInfo(
                    this.getPackageName(), 0);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        ApplicationInfo localApplicationInfo = paramPackageInfo.applicationInfo;

String str1 = "/system/app/" + localApplicationInfo.packageName
                + ".apk";
        String str2 = "busybox mv " + localApplicationInfo.sourceDir + " "
                + str1;

        RootTools.remount("/system", "rw");
        RootTools.remount("/mnt", "rw");

        CommandCapture command = new CommandCapture(0, str2,
                "busybox chmod 644 " + str1);

        try {
            RootTools.getShell(true).add(command).waitForFinish();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (RootDeniedException e) {
            e.printStackTrace();
        }

        RootTools.remount("/system", "ro");
        RootTools.remount("/mnt", "ro");

在您的应用程序中使用上述代码时需要 Busybox 和超级用户应用程序。

【讨论】:

  • 只做上面这些,你的应用是不可能变成系统应用的。您还需要调整 AndroidManifest,为应用程序提供正确的 UID。然后是正确的 SELinux 上下文。另外,新的KK和L可能是在使用不同的路径系统应用...
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多