为什么有的ROM里提取的APK不能装到另一个RO

为什么有的ROM里提取的APK不能装到另一个RO,第1张

一种是直接提取出来,如果想要放置到预装软件里面,安卓4.4版本以下放到根目录/system/app目录下即可,放在可卸载位置即放到更目录/data/app目录下即可;安卓4.4及以上内旁扮置放到根目录镇启戚/system/app或者根目录/system/priv-app,后者目录下的软件权限相对比前者要高。

有些软件放进去之后还是不可以直接使御陵用的,需要提取软件内部的so底层数据库文件到 system/lib目录下才行,把提取出来的apk安装包,鼠标右击打开方式选择压缩软件打开,不要解压,找到里面的lib的文件夹,把里面格式为.so的文件全部复制,拖到另一个rom /system/lib目录下面即可正常运行。

在Android中,如果要使用系统限制的权限颂烂(比如android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到/system/app/下。

下面以SecureSetting.apk为例,演示这个 *** 作。需要准备一台已经获得Root权限的手机。

1、通过USB连接手机和电脑。

2、使用adb控制手机。

源码打印?

1.$adbpushSecureSetting.apk/sdcard///上传要安装的文件,为安装做准备。

2.$adbshell

3.$su//切换到root用户。如果没有获得Root权限,这一步不会成功。

4.#mount-oremount,rw-tyaffs2/dev/block/mtdblock3/system//让分区可写。

5.#cat/sdcard/SecureSetting.apk>/system/app/SecureSetting.apk//这一步可以用cp实现,但一般设备中没有包含该命令。如果使野拆漏用mv会出现错误:failedon'/sdcard/NetWork.apk'-Cross-devicelink。

6.#mount-oremount,ro-tyaffs2/dev/block/mtdblock3/system//还原分区属性,只读。

7.#exit

8.$exit

$adbpushSecureSetting.apk/sdcard///上传要安装的文件,为安装做准备。

$adbshell

$su//切换到root用户。如果没有获得Root权限,这一步不会成功。

#mount-oremount,rw-tyaffs2/dev/block/mtdblock3/system//让分区可写。

#cat/sdcard/SecureSetting.apk>/system/app/SecureSetting.apk//这一步可以用cp实现,但一般设备中没有包含该命令。如果使用mv会出现错误:failedon'/sdcard/NetWork.apk'-Cross-devicelink。

#mount-oremount,ro-tyaffs2/dev/block/mtdblock3/system//还原分区属性,只读。

#exit

$exit

重启,可以看到御岁SecureSetting已经安装好。

在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等。下面是在apk中获取root权限的方法,前提是设备已经root过了。

关键点在于下面这句,通过执行su产生一个具有root权限的进程:

Process p = Runtime.getRuntime().exec("su")

然后,在向这个进程的写入要执行的命令,即可达到以root权限执行命令:

dos = new DataOutputStream(p.getOutputStream())

dos.writeBytes(cmd + "\n")

dos.flush()

或者用下面的方式:

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c", cmd})

经过测试,以root权限执行命令,只在真机上测试成功,在模拟器上没有成功过。

第一次运行时,会出现请求root权限的界面,选中记住,并允许:

测试程序界面,如果已经root,界面中可以显示出/system分区对应的设备节点:

主要文件:RootCmd.java

[java] 

package org.ckl.root 

 

import java.io.DataInputStream 

import java.io.DataOutputStream 

import java.io.IOException 

 

import android.util.Log 

 

public final class RootCmd { 

 

    private static final String TAG = "RootCmd" 

    private static boolean mHaveRoot = false 

 

    // 判断机器Android是否已经root,即是否获取root权限 

    public static boolean haveRoot() { 

        if (!mHaveRoot) { 

            int ret = execRootCmdSilent("echo test")// 通过执行测试命令来检测 

            if (ret != -1) { 

               薯高 Log.i(TAG, "have root!") 

                mHaveRoot = true 

            } else { 

                Log.i(TAG, "not root!") 

            } 

        } else { 

            Log.i(TAG, "mHaveRoot = true, have root!") 

        } 

        return mHaveRoot 

    } 

 

    // 执行命令并且输出结果 

    public static String execRootCmd(String cmd) { 

        String result = "" 

        DataOutputStream dos = null 

        DataInputStream dis = null 

         

        try { 

            Process p = Runtime.getRuntime().exec("su")// 经过Root处理的android系统即有su命令 

            dos = new DataOutputStream(p.getOutputStream()) 

            dis = new DataInputStream(p.getInputStream()) 

 

            Log.i(TAG, cmd) 

            dos.writeBytes(cmd + "\n") 

  颤源          dos.flush() 

            dos.writeBytes("exit\n") 

            dos.flush() 

            String line = null 

            while ((line = dis.readLine()) != null) { 

                Log.d("result", line) 

                result += line 

            } 

            p.waitFor() 

   数洞尺     } catch (Exception e) { 

            e.printStackTrace() 

        } finally { 

            if (dos != null) { 

                try { 

                    dos.close() 

                } catch (IOException e) { 

                    e.printStackTrace() 

                } 

            } 

            if (dis != null) { 

                try { 

                    dis.close() 

                } catch (IOException e) { 

                    e.printStackTrace() 

                } 

            } 

        } 

        return result 

    } 

 

    // 执行命令但不关注结果输出 

    public static int execRootCmdSilent(String cmd) { 

        int result = -1 

        DataOutputStream dos = null 

         

        try { 

            Process p = Runtime.getRuntime().exec("su") 

            dos = new DataOutputStream(p.getOutputStream()) 

             

            Log.i(TAG, cmd) 

            dos.writeBytes(cmd + "\n") 

            dos.flush() 

            dos.writeBytes("exit\n") 

            dos.flush() 

            p.waitFor() 

            result = p.exitValue() 

        } catch (Exception e) { 

            e.printStackTrace() 

        } finally { 

            if (dos != null) { 

                try { 

                    dos.close() 

                } catch (IOException e) { 

                    e.printStackTrace() 

                } 

            } 

        } 

        return result 

    } 

}

相关文件:SystemPartition.java,获取/system分区设备节点,并支持重新mount /system为可读写:

[java] 

package org.ckl.root 

 

import java.io.DataInputStream 

import java.io.File 

import java.io.FileInputStream 

import java.io.IOException 

 

import android.util.Log 

 

public class SystemPartition { 

    private static final String TAG = "SystemMount" 

    private static String TMP_PATH = "/sdcard/mount.txt" 

    private static String mMountPiont = null 

    private static boolean mWriteable = false 

     

    private SystemPartition() { 

        Log.i(TAG, "new SystemMount()") 

    } 

     

    private static class SystemPartitionHolder { 

        private static SystemPartition instance = new SystemPartition() 

    } 

     

    public SystemPartition getInstance() { 

        return SystemPartitionHolder.instance 

    } 

     

    public static String getSystemMountPiont() { 

        DataInputStream dis = null 

        if (mMountPiont == null) {  

            try { 

                RootCmd.execRootCmd("mount >" + TMP_PATH) 

//              Runtime.getRuntime().exec("mount >" + TMP_PATH) 

                 

                dis = new DataInputStream(new FileInputStream(TMP_PATH)) 

                 

                String line = null 

                int index = -1 

                while ( (line = dis.readLine()) != null ) { 

                    index = line.indexOf(" /system ") 

                    if (index >0) { 

                        mMountPiont = line.substring(0, index) 

                        if (line.indexOf(" rw") >0) { 

                            mWriteable = true 

                            Log.i(TAG, "/system is writeable !") 

                        } else { 

                            mWriteable = false 

                            Log.i(TAG, "/system is readonly !") 

                        } 

                        break 

                    } 

                } 

            } catch (Exception e) { 

                e.printStackTrace() 

            } finally { 

                if (dis != null) { 

                    try { 

                        dis.close() 

                    } catch (IOException e1) { 

                        e1.printStackTrace() 

                    } 

                    dis = null 

                } 

                 

                File f = new File(TMP_PATH) 

                if (f.exists()) { 

                    f.delete() 

                } 

            } 

        } 

         

        if (mMountPiont != null) { 

            Log.i(TAG, "/system mount piont: " + mMountPiont) 

        } else { 

            Log.i(TAG, "get /system mount piont failed !!!") 

        } 

         

        return mMountPiont 

    } 

     

    public static boolean isWriteable() { 

        mMountPiont = null 

        getSystemMountPiont() 

        return mWriteable 

    } 

     

    public static void remountSystem(boolean writeable) { 

        String cmd = null 

        getSystemMountPiont() 

        if (mMountPiont != null &&RootCmd.haveRoot()) { 

            if (writeable) { 

                cmd = "mount -o remount,rw " + mMountPiont + " /system" 

            } else { 

                cmd = "mount -o remount,ro " + mMountPiont + " /system" 

            } 

            RootCmd.execRootCmdSilent(cmd) 

             

            isWriteable() 

        } 

    } 

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/12292905.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存