Android - изменение системных настроек рутированного устройства из приложения - PullRequest
4 голосов
/ 12 сентября 2011

Я пытаюсь изменить лимит смс, описанный здесь внутри приложения.Предполагается, что приложение работает на рутированном устройстве.Я использую RootTools , чтобы проверить, рутировано ли устройство или нет.Я пытаюсь выяснить, как записать фактическую настройку в settings.db.Любое предложение, которое может помочь мне в этом, высоко ценится.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 16 сентября 2011

Я решил это, выполнив следующее:

  • скопируйте /data/data/com.android.providers.settings/databases/settings.db в папку моего приложения /data/data/my_app_directory/.
  • обновить таблицу в базе данных, используя класс SQLiteDatabase.
  • скопировать обратно базу данных из /data/data/my_app_directory/settings.db в /data/data/com.android.providers.settings/databases/

Операции копирования были выполнены с использованием RootTools.sendShell

1 голос
/ 02 ноября 2017

Да, вы можете сделать это, если у вас есть root-доступ.Это длительный процесс, но вы можете сделать это:

Шаг: 1 копия settings.db из /data/data/com.android.providers.settings/databases/ с использованием RootBrowser с устройства и затем изменить значение с помощью sqliteBrowser, которое вы хотите обновить, чем обновитьsettings.db и поместите в assets пакет вашего проекта

Шаг 2. Скопируйте этот файл в папку вашего приложения (в любое место, где вы можете получить к нему доступ), используя asset manager, для чего вам нужно

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

эта функция будет копировать файл из активов

public static void copyAssets(Context context, String assetPath, String outFilename) {
        AssetManager assetManager = context.getAssets();
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(assetPath);
            File outFile = new File(context.getExternalFilesDir(null), outFilename);

            out = new FileOutputStream(outFile);
            copyFile(in, out);
        } catch (IOException e) {
            Log.e(TAG, "Failed to copy asset: " + outFilename, e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
    }

public static void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
    }

Шаг 3: перезаписать систему settings.db Путь к файловой системе (destPath) равен /data/data/com.android.providers.settings/databases/

public static void copyToSystem(final String sourceFilePath, final String destPath) {
        Thread background = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Process process = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(process.getOutputStream());
//                    
                    os.writeBytes("cp -f " + sourceFilePath + " " + destPath + "\n");
                    os.flush();
                    os.writeBytes("exit\n");
                    os.flush();
                    process.waitFor();
                    process.waitFor();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                }
            }
        });
        background.start();
    }

Шаг 4: перезагрузить устройство

Вот и все.

0 голосов
/ 04 января 2019

Поздний ответ, но вам не нужно копировать settings.db, вы можете обновить его с помощью RootTools, например

CommandCapture commandLogcat = new CommandCapture(0, "sqlite3 /data/data/com.android.providers.settings/databases/settings.db \"UPDATE secure SET value = '192.168.2.140' WHERE name = 'eth_ip';\"");
RootTools.getShell(true).add(commandLogcat).getExitCode();
...