在项目的过程中,有可能会要实现类似360优化大师、安卓优化大师的软件搬家、静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS、MOVE_PACKAGE 等需要系统的权限,必须要有系统签名。
咱们拿 软件搬家 来当例子(通过获取系统权限,而不是弹出系统的应用管理界面来搬家):
实现方式:
1、想办法获取系统权限,但是这个一般办不到,因为不同厂家出厂的手机系统签名都不一样
(
可以看看我很早的时候提的问题:
android系统权限SET_PREFERRED_APPLICATIONS怎么获取
)
2、在已经root过得手机,获取root权限(有root权限就可以为所欲为啦,嘿嘿)
第一种办法暂时不考虑,想了解的童鞋可以google android如何获取系统权限。
我们说说第二种办法,
在已经root过得手机上获取root权限,简单
- Process process = Runtime.getRuntime().exec("su");
- Process process = Runtime.getRuntime().exec("su");
执行这一句,superuser.apk就会弹出授权对话框。
但是这样做就可以了吗.....肯定没这么简单啦!
当执行需要系统权限的操作时,系统还是回去检查应用程序是否拥有该权限。
所以我们要想办法绕过过系统检查权限这道关卡!
至于办法 可以参考下以下两篇博客:
1、android应用搬家的实现
2、如何在Android中启动java程序
大概思路是:
通过app_process 命令启动java程序(想了解app_process更多资料,请自行google),
可是app_process 命令需要root权限才能执行,所以要配合上面所讲的su命令啦。
这么做是可以实现绕过系统检查权限的大门,
但是每次执行的时候都要先请求下root权限(那种弹框和toast会让用户感觉到很不安)
不要忘了咱们的标题:Android应用程序永久获取root权限方法。
永久获取root权限,就是获取过一次root权限后,以后再也不需要去请求root权限
实际上,像一些软件管家:安卓优化大师、360优化大师,都是这么做的
(不信你可以试试其软件搬家功能,即使你的手机解除root,它们还是具有root权限)
原理可以看下以下链接:
安卓应用程序永久获取Root权限的方法
(下载该文章需要money,明天我再上传该文档,一时找不到了.......)
大概思路:
自己编译一个类似su的可执行程序(以下以main为代号),在main中调用app_process命令,
然后在第一次获取root权限的时候将其push到/system/bin/目录下,再chmod 4755 可执行程序,
修改其访问权限,使执行该命令的进程能够暂时获得root权限
(4755 也请google下吧 linux文件权限)。
以后咱们要是需要root权限的话就调用mian命令,不用去调用su来请求root权限啦
至于为什么要这么做:也是为了让root授权的对话框和toast不在显示
插一句,想要知道su和superuser.apk的关系,请点开下面的链接
android superuser.apk 管理root权限原理分析
综上:我们所做的就是绕过su命令,用我们自己编写的可执行程序main开实现su的功能。
自己编译可执行程序main的时候,需要注意一点,请参考su源码,
我在这一步就卡了很久,
大概意思:
main的uid是继承的父类的uid,而且它有root权限,但是在main中执行system(cmd),
(这里的cmd 调用app_process 来启动实现了软件搬家的java程序),
假如system()是通过sh 命令来实现,但在main中开启的sh的uid也是继承main的uid,
也就是应用程序的uid,但是这个uid并没有权限执行相关root命令;
所以需要先将main的uid设置为root,为了使sh的uid也为root,从而使sh 能够执行
需要root权限的app_process命令
关键代码在你的main 方法中加入
- int uid = 0;
- int gid = 0;
- if(setgid(gid) || setuid(uid))
- return permissionDenied();
- int uid = 0;
- int gid = 0;
- if(setgid(gid) || setuid(uid))
- return permissionDenied();
可以参考su的源码 (su的源码会在我上传的压缩包中)
大概思路就是这样。
PS:
在我上传的压缩包中有我自己写的demo,实现的是软件搬家的功能,
操作很简单:
1、安装Movepkgdemo.apk,并执行
2、点击 install com.zl.hw 按钮 来 安装一个helloword android程序,
3、点击 get root 按钮,来第一次获取root权限,
4、点击第三个按钮,来移动helloword程序
PPS:
1、编译可执行程序main(注意main只是个代号,在Movepkgdemo中 是 放在Movepkgdemo项目的 /res/ raw/ 目录下的zlsu文件)
2、将main.c文件成可执行文件会需要linux编译环境,你可以自己在linux上编译,也可以在windows下来编译
windows方法:使用cygwin 来进行NDK开发(搭建该环境可能需要话费比较多时间,主要是要下载cygwin)
cygwin环境配置文档也在上传的压缩包中,虽说花了打功夫,但是搭建好NDK环境,以后也能方便咱做NDK开发。
NDK环境搭建需要cygwin在安装的时候安装必需的一些项目(请查看以下链接):
Cygwin安装
最后总结一下总体思路:
1、在java代码中实现需要root权限的功能,并提供一个包含入口函数main的类
2、通过app_process命令来启动1中的java模块,但是app_process需要root权限,所以看第3步
3、通过在第一次获取root权限的时候,向/system/bin/注入自写的类似su的二进制可执行程序
main,并且和su的访问权限也一样(chmod 4755)(main功能和su一样,唯一不一样就是去除了su中与superuser.apk 交互的代码),即main命令执行app_process命令,这样可以做到:
一旦拥有root权限,以后再也不需要去请求root权限
如何使用Git上传项目代码到github
这是我第一次应用git,以下仅供git的初学者参考。
github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。这对于一般人来说公共仓库就已经足够了。
1.注册账户以及创建仓库
要想使用github第一步当然是注册github账号了。之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。
2.安装客户端tortoiseGit
github是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用TortoiseGit,他给我们提供了图形界面的操作。在安装之前首先需要安装git,下载地址http://msysgit.github.com/,TortoiseGit下载地址:
http://code.google.com/p/tortoisegit/
装完后右键鼠标会多出一些选项来,在本地仓库里右键选择Git Init Here,会多出来一个.git文件夹,这就表示本地git创建成功。右键Git Bash进入git命令行,为了把本地的仓库传到github,还需要配置ssh key。
3.配置Git
(1) 首先在本地创建ssh key;
$ ssh-keygen -t rsa -C "[email protected]"
后面的[email protected]改为你的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。回到github,进入Account Settings,左边选择SSH Keys,Add SSH Key,title随便填,粘贴key。
(2)为了验证是否成功,在git bash下输入:
$ ssh -T [email protected]
如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。
(3)接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。
$ git config --global user.name "your name"
$ git config --global user.name "your name"$ git config --global user.email "[email protected]"
(4)进入要上传的仓库,右键git bash,添加远程地址:
$ git remote add origin [email protected]:yourName/yourRepo.git
后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。
4.提交、上传
(1)接下来在本地仓库里添加一些文件,比如README,
$ git add README
$ git add README$ git commit -m "first commit"
(2)上传到github:
$ git push origin master
git push命令会将本地仓库推送到远程服务器。
git pull命令则相反。
修改完代码后,使用git status可以查看文件的差别,使用git add 添加要commit的文件,也可以用git add -i来智能添加文件。之后git commit提交本次修改,git push上传到github。
5.gitignore文件
.gitignore顾名思义就是告诉git需要忽略的文件,这是一个很重要并且很实用的文件。一般我们写完代码后会执行编译、调试等操作,这期间会产生很多中间文件和可执行文件,这些都不是代码文件,是不需要git来管理的。我们在git status的时候会看到很多这样的文件,如果用git add -A来添加的话会把他们都加进去,而手动一个个添加的话也太麻烦了。这时我们就需要.gitignore了。比如一般c#的项目我的.gitignore是这样写的:
bin
.suo
obj
bin和obj是编译目录,里面都不是源代码,忽略;suo文件是vs2010的配置文件,不需要。这样你在git status的时候就只会看到源代码文件了,就可以放心的git add -A了。