android开发,关于android app实现静默安装自己(系统签名)
产品需求,木有办法。android系统是跟厂商定制的,保证系统开机就运行我们的app,并且实现自己静默安装,完全自动化,无需人工操作。
网上有很多办法,
1、要么要通过android 源码拿到密钥文件,参考:http://www.cnblogs.com/brucenan/archive/2012/10/04/2711817.html
2、通过root权限,可以参考代码(已测试安装别人的apk可以,但是不能安装自己):
- import java.io.File;
- import java.io.PrintWriter;
- import android.content.Context;
- import android.content.Intent;
- import android.net.Uri;
- import android.util.Log;
- public class ApkController {
- /**
- * 描述: 安装
- */
- public static boolean install(String apkPath,Context context){
- // 先判断手机是否有root权限
- if(hasRootPerssion()){
- // 有root权限,利用静默安装实现
- return clientInstall(apkPath);
- }else{
- // 没有root权限,利用意图进行安装
- File file = new File(apkPath);
- if(!file.exists())
- return false;
- Intent intent = new Intent();
- intent.setAction("android.intent.action.VIEW");
- intent.addCategory("android.intent.category.DEFAULT");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
- context.startActivity(intent);
- return true;
- }
- }
- /**
- * 描述: 卸载
- */
- public static boolean uninstall(String packageName,Context context){
- if(hasRootPerssion()){
- // 有root权限,利用静默卸载实现
- return clientUninstall(packageName);
- }else{
- Uri packageURI = Uri.parse("package:" + packageName);
- Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,packageURI);
- uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(uninstallIntent);
- return true;
- }
- }
- /**
- * 判断手机是否有root权限
- */
- public static boolean hasRootPerssion(){
- PrintWriter PrintWriter = null;
- Process process = null;
- try {
- process = Runtime.getRuntime().exec("su");
- PrintWriter = new PrintWriter(process.getOutputStream());
- PrintWriter.flush();
- PrintWriter.close();
- int value = process.waitFor();
- return returnResult(value);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(process!=null){
- process.destroy();
- }
- }
- return false;
- }
- /**
- * 静默安装
- */
- public static boolean clientInstall(String apkPath){
- PrintWriter PrintWriter = null;
- Process process = null;
- try {
- process = Runtime.getRuntime().exec("su");
- PrintWriter = new PrintWriter(process.getOutputStream());
- PrintWriter.println("chmod 777 "+apkPath);
- PrintWriter.println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
- PrintWriter.println("pm install -r "+apkPath);
- // PrintWriter.println("exit");
- PrintWriter.flush();
- PrintWriter.close();
- int value = process.waitFor();
- return returnResult(value);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(process!=null){
- process.destroy();
- }
- }
- return false;
- }
- /**
- * 静默卸载
- */
- public static boolean clientUninstall(String packageName){
- PrintWriter PrintWriter = null;
- Process process = null;
- try {
- process = Runtime.getRuntime().exec("su");
- PrintWriter = new PrintWriter(process.getOutputStream());
- PrintWriter.println("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");
- PrintWriter.println("pm uninstall "+packageName);
- PrintWriter.flush();
- PrintWriter.close();
- int value = process.waitFor();
- return returnResult(value);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(process!=null){
- process.destroy();
- }
- }
- return false;
- }
- /**
- * 启动app
- * com.exmaple.client/.MainActivity
- * com.exmaple.client/com.exmaple.client.MainActivity
- */
- public static boolean startApp(String packageName,String activityName){
- boolean isSuccess = false;
- String cmd = "am start -n " + packageName + "/" + activityName + " \n";
- Process process = null;
- try {
- process = Runtime.getRuntime().exec(cmd);
- int value = process.waitFor();
- return returnResult(value);
- } catch (Exception e) {
- e.printStackTrace();
- } finally{
- if(process!=null){
- process.destroy();
- }
- }
- return isSuccess;
- }
- private static boolean returnResult(int value){
- // 代表成功
- if (value == 0) {
- return true;
- } else if (value == 1) { // 失败
- return false;
- } else { // 未知情况
- return false;
- }
- }
- }
3、通过走系统应用的方法(因为机器是我们定制生产,所以可以将app预置到system/app目录下,无需安装,直接重启,可以看到系统再次开机时会显示系统升级,然后就可以看到我们的app安装成功),可以试着先adb命令执行,再复制到代码中去执行。注意,如果app的lib中有.so文件,则还需要将.so文件拷贝到system/libs目录,否则报错(我的解决办法是暂时将用到.so文件的地方注释掉,等有时间再做)
adb 命令:
- $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
- $ adb shell $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
- # mount //显示当前mount情况
- # mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
- # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。
- chmod 777 chetou.apk
- # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
- # exit $ exit
代码执行:
- /**
- * 将文件复制到system/app 目录
- * @param apkPath 特别注意格式:该路径不能是:/storage/emulated/0/app/QDemoTest4.apk 需要是:/sdcard/app/QDemoTest4.apk
- * @return
- */
- public static boolean copy2SystemApp(String apkPath){
- PrintWriter PrintWriter = null;
- Process process = null;
- String appName = "test.apk",cmd;
- try {
- process = Runtime.getRuntime().exec("su");
- PrintWriter = new PrintWriter(process.getOutputStream());
- cmd = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system";
- Log.e("copy2SystemApp", cmd);
- PrintWriter.println(cmd);
- cmd = "cat "+apkPath+" > /system/app/"+appName;
- Log.e("copy2SystemApp", cmd);
- PrintWriter.println(cmd);
- cmd = "chmod 777 /system/app/"+appName +" -R";
- Log.e("copy2SystemApp", cmd);
- PrintWriter.println(cmd);
- cmd = "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system";
- Log.e("copy2SystemApp", cmd);
- PrintWriter.println(cmd);
- PrintWriter.println("reboot"); //重启
- PrintWriter.println("exit");
- PrintWriter.flush();
- PrintWriter.close();
- int value = process.waitFor();
- return returnResult(value);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(process!=null){
- process.destroy();
- }
- }
- return false;
- }
注意代码里有差异性,因为需要给文件 chmod 777权限,否则不会自动升级安装。流程可以参考:http://blog.163.com/wwj0925@126/blog/static/19120110201522242241563/
android开发,关于android app实现静默安装自己(系统签名)的更多相关文章
- 基于Android开发的天气预报app(源码下载)
原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...
- AllJoyn+Android开发案例-android跨设备调用方法
AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...
- CSharp程序员学Android开发---3.Android内部元素不填充BUG
最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...
- Android开发之定义app在手机的安装位置
定义app在手机的安装位置,可以通过在清单文件中添加属性 android:installLocation="" 该属性有三个值:auto(自动),preferExternal(外部 ...
- Android PackageManager源码浅析以及静默安装实现方式
Aandroid应用管理 >http://blog.csdn.net/sk719887916/article/details/50314017 skay整理. >201 ...
- Android获取Root权限之后的静默安装实现代码示例分析
转:http://blog.csdn.net/jiankeufo/article/details/43795015 Adroid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但 ...
- 搭建Android开发环境附图详解+模拟器安装(JDK+Eclipse+SDK+ADT)
——搭建android开发环境的方式有多种,比如:JDK+Eclipse+SDK+ADT或者JDK+Eclipse+捆绑好的AndroidSDK或者Android Studio. Google 决定将 ...
- Android为TV端助力 apk静默安装
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢 ...
- Android开发最强模拟器Genymotion的安装及使用教程。附注释图详解
前沿 呵呵,笔者第一次在公开的博客网站写心得,想让自己的Android开发生涯留下点足迹,并且为自己做点笔记,如果该文章能帮到广大的Android小白朋友最好了(其实我也是一小白,(●'◡'●)) ...
随机推荐
- 【Linux】程序内获取文件系统挂载信息
Linux shell可通过查看/etc/mtab或者/proc/mounts文件来获取当前文件系统挂载信息,示例: 程序内读取/etc/mtab或者/proc/mounts,解析字符串较为繁琐,可以 ...
- css半透明
filter:alpha(opacity=80); /*支持 IE 浏览器*/-moz-opacity:0.80; /*支持 FireFox 浏览器*/opacity:0.80; /*支持 Chrom ...
- zend studio导入thinkphp的乱码问题
刚刚导入thinkphp有乱码还有错误怎么办? windows -> preference -> Work space -> text file encodeing设置为 UTF-8 ...
- WinForm程序安装、发布流程
一 签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...
- VS2010 自动关闭的问题解决方法
分为如下几个解决方法: 没有安装VS2010的SP1,安装后,问题解决了 自定义设置,出现了不正确的情况,执行 devenv.exe /resetsettings 可以排除故障 使用 devenv.e ...
- js构造函数,索引数组和属性的属性
本文主要介绍和小结js的构造函数,关联数组的实现方式和使用,及不可变对象和它的实现方式及他们使用过程中要注意的点 <script> function p(){ var len=argume ...
- 【转】MYISAM表批量压缩
关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档 ...
- PHP 把GBK编码转换为UTF8
//把GBK编码转换为UTF8 $name="勿以善小而不为"; $name=iconv("GBK", "UTF-8", $name);
- Moses manual 中Basline System 2.3.4节用IRSTLM创建语言模型的命令有误
手册里写到: ~/irstlm/bin/compile-lm \ --text yes \ news-commentary-v8.fr-en.lm.en.gz \ news-commentary-v8 ...
- 在SQL Server 2012中新建用户
一.问题描述 在最开始装SQL Server 2012时我选择的是Windows身份认证方式,现在想添加一个用户采用SQL Server身份验证. 二.具体思路 1.新建用户 2.将新建的用户添加到相 ...