
一种是直接提取出来,如果想要放置到预装软件里面,安卓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()
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)