【问题标题】:android - changing the system settings of a rooted device from inside the appandroid - 从应用程序内部更改有根设备的系统设置
【发布时间】:2022-02-21 13:17:18
【问题描述】:

我正在尝试从应用程序内部更改here 描述的短信限制。假定应用程序在有根设备上运行。我正在使用RootTools 检查设备是否已植根。我试图弄清楚如何将实际设置写入settings.db。非常感谢任何可以帮助我的建议。

提前致谢。

【问题讨论】:

  • 如果 settingd.db 是 sqlite db 文件,那么你可以用任何 sqlite 工具打开这个文件并手动修改它。
  • 我想从应用程序内部进行。
  • 如果访问“/data/data/com.android.providers.settings/databases/settings.db”这个路径来修改数据库助手类中的数据会怎样?
  • 好的,我看不到你的链接,你能在这里发布你的错误吗?
  • t 返回错误。您可以查看openDatabase 方法 [此处][1] 了解更多详细信息 [1]:developer.android.com/reference/android/database/sqlite/…

标签: android root


【解决方案1】:

我通过这样做解决了这个问题:

  • 将/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完成的

【讨论】:

  • 不错。现在有什么问题吗?
  • 不可以直接在原来的settings.db上操作吗?
  • AFAIK,这是不可能的。
  • 我做到了。请检查我的答案。
【解决方案2】:

迟到的答案,但你不需要复制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();

【讨论】:

    【解决方案3】:

    是的,如果您具有 root 访问权限,则可以执行此操作。这是一个漫长的过程,但您可以这样做:

    第 1 步: 使用设备中的RootBrowser 从/data/data/com.android.providers.settings/databases/ 复制settings.db,然后使用要更新的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);
            }
        }
    

    第三步:覆盖系统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 步:重启设备

    到此为止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2011-07-09
      • 2019-07-29
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多