Может ли приложение Android копировать себя в системный каталог на корневом устройстве?

У меня есть приложение, которое нужно установить на system directory. Я видел несколько способов, которые используют adb commands для этого. Я думаю это надо делать с помощью adb shell на пк и usb кабеля. Но есть ли способ для приложения скопировать себя из каталога Data в каталог system без использования ПК?

Насколько я знаю, мы можем запускать команды в приложении для Android, используя Runtime. Итак, я попробовал этот код в onCreate, но он не копирует файл .apk. Это код:

boolean isSystemApp = (getApplicationInfo().flags
            & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0;
    if (!isSystemApp) {
        Toast.makeText(getApplicationContext (), "not system app", Toast.LENGTH_LONG).show();
        try {

            String [] commandsOldVersions = {"adb shell\n", "su\n", "mount -o rw,remount /system\n",
                    "adb push eyedetection.apk /sdcard/\n", "adb shell\n","su cd /sdcard\n"
            , "mv eyedetection.apk /system/app\n","su chmod 644/system/app/eyedetection.apk\n" };

            String [] commandsNewVersions = {"adb shell\n", "su\n", "mount -o rw,remount /system\n",
                    "adb push eyedetection.apk /sdcard/\n", "adb shell\n","su cd /sdcard\n"
            , "mv eyedetection.apk /system/priv-app\n", "su chmod 644/system/priv-app/eyedetection.apk\n" };

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                // for 4.3 and higher versions, execute the following line (because they've changed their system files hierarchies):
                Process process = Runtime.getRuntime().exec(commandsNewVersions);
                BufferedReader br= new BufferedReader(new InputStreamReader(process.getInputStream()));
                Log.i("cmd", br.readLine());

            }//end if
            else {
                //for older version, execute this line instead
                Process process= Runtime.getRuntime().exec(commandsOldVersions);
                BufferedReader br= new BufferedReader(new InputStreamReader(process.getInputStream()));
                Log.i("cmd", br.readLine());
            }//end else.

            Runtime.getRuntime().exec("adb reboot");


        }//end try.

        catch (IOException e) {
            Log.i("eyedetection", "error in executing adb commands");
        }//end catch.
    }//end if the app is not system app.

    else {
        Toast.makeText(getApplicationContext (), "It's system app", Toast.LENGTH_LONG).show();

    }

Приложение не вылетает, но я получаю эти строки в логарифме:

03-24 22:28:37.661 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve virtual method 143: Landroid/app/Notification$Builder;.setPriority (I)Landroid/app/Notification$Builder;
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x6e at 0x0042
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection I/dalvikvm: Could not find method android.app.Notification$Builder.setLocalOnly, referenced from method com.google.android.gms.common.os.b
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve virtual method 142: Landroid/app/Notification$Builder;.setLocalOnly (Z)Landroid/app/Notification$Builder;
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x6e at 0x00ce
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection E/dalvikvm: Could not find class 'android.app.Notification$BigTextStyle', referenced from method com.google.android.gms.common.os.b
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve new-instance 42 (Landroid/app/Notification$BigTextStyle;) in Lcom/google/android/gms/common/os;
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x22 at 0x00d7
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: couldn't find field Landroid/app/Notification;.extras
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve instance field 10
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x54 at 0x00ed
03-24 22:28:37.661 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: unable to opt direct call 0x0084 at 0x4c in Lcom/google/android/gms/common/os;.b
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: unable to opt direct call 0x0084 at 0xd9 in Lcom/google/android/gms/common/os;.b
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection E/dalvikvm: Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.ou.a
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve check-cast 30 (Landroid/app/AppOpsManager;) in Lcom/google/android/gms/common/ou;
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x1f at 0x0010
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection I/dalvikvm: Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.ou.a
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve virtual method 430: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
03-24 22:28:37.669 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x6e at 0x000d
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection E/dalvikvm: Could not find class 'android.os.UserManager', referenced from method com.google.android.gms.common.ou.p
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve check-cast 235 (Landroid/os/UserManager;) in Lcom/google/android/gms/common/ou;
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x1f at 0x000e
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: couldn't find static field Landroid/os/Build;.SUPPORTED_64_BIT_ABIS
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve static field 119 (SUPPORTED_64_BIT_ABIS) in Landroid/os/Build;
03-24 22:28:37.677 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x62 at 0x000d
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: couldn't find static field Landroid/os/Build;.SUPPORTED_ABIS
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve static field 120 (SUPPORTED_ABIS) in Landroid/os/Build;
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x62 at 0x0008
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: couldn't find static field Landroid/os/Build;.SUPPORTED_32_BIT_ABIS
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve static field 118 (SUPPORTED_32_BIT_ABIS) in Landroid/os/Build;
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection D/dalvikvm: VFY: replacing opcode 0x62 at 0x0008
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection D/dalvikvm: DexOpt: couldn't find static field Landroid/os/Build;.SUPPORTED_64_BIT_ABIS
03-24 22:28:37.685 22576-22576/com.project.android.eyedetection W/dalvikvm: VFY: unable to resolve static field 119 (SUPPORTED_64_BIT_ABIS) in Landroid/os/Build;

Также эти строки:

03-24 22:29:54.388 23305-23305/com.project.android.eyedetection E/GMPM: GoogleService failed to initialize, status: 10, Missing an expected resource: 'R.string.google_app_id' for initializing Google services.  Possible causes are missing google-services.json or com.google.gms.google-services gradle plugin.
03-24 22:29:54.388 23305-23305/com.project.android.eyedetection E/GMPM: Scheduler not set. Not logging error/warn.
03-24 22:29:54.403 23305-23335/com.project.android.eyedetection E/GMPM: Uploading is not possible. App measurement disabled

Я не мог понять проблему из logcat. Почему код не работает? Можно ли позволить приложению копировать себя в другую папку на корневом устройстве, или мы должны использовать usb кабель?


person Dania    schedule 25.03.2016    source источник
comment
Вы не можете получить доступ к системному каталогу, если у вас нет root-доступа.   -  person Shahzeb    schedule 25.03.2016
comment
Что вы подразумеваете под корневым доступом? Мое устройство рутировано, и я могу запустить su, есть ли какие-либо другие требования? Благодарю.   -  person Dania    schedule 25.03.2016
comment
@Shahzeb Я думаю, он прямо сказал, что может сделать это вручную с помощью adb, но ему нужно сделать это программно. то есть приложение делает это само.   -  person usamazf    schedule 25.03.2016
comment
@Shahzeb, спасибо, но, как сказал Усама, мне нужно, чтобы это произошло программно. Насколько я знаю, есть приложение, которое позволяет преобразовать любое приложение в системное, я думаю, оно называется ES File Explorer, так что, возможно, есть какой-то программный метод. Есть ли вообще для этого?   -  person Dania    schedule 25.03.2016
comment
@UsamaZafar да, это то, что я ищу. Есть ли способ сделать это из самого приложения? Спасибо.   -  person Dania    schedule 25.03.2016
comment
@Dania, посмотри на эту тему. Надеюсь, поможет. stackoverflow.com/questions/10691485 /   -  person usamazf    schedule 25.03.2016
comment
@UsamaZafar большое спасибо, я проверю.   -  person Dania    schedule 25.03.2016
comment
Когда вы используете exec(commands), вы запускаете эти команды непосредственно в shell, поэтому вы не можете использовать команды adb (которые выполняются на ПК). Удалите все свои команды adb и используйте обычную команду linux только для копирования файла APK.   -  person TDG    schedule 25.03.2016
comment
@TDG большое спасибо, я попробую и дам вам знать   -  person Dania    schedule 25.03.2016


Ответы (1)


Команду adb xxx можно использовать только в оболочке ПК, но не в оболочке Android/Linux.
То есть вы должны использовать

  • Runtime.getRuntime().exec("reboot")

вместо

  • Runtime.getRuntime().exec("adb reboot").
person Swing    schedule 26.03.2016
comment
Спасибо, я удалил все ключевые слова adb, но все равно не работает. Приложение не падает, но я получаю ошибки, показанные в логарифме, опубликованном в вопросе. Скажите, пожалуйста, связаны ли эти ошибки и как их решить? - person Dania; 26.03.2016