将andriod应用安装为系统应用
来源:互联网 发布:蒸汽巴士八戒有淘宝店 编辑:程序博客网 时间:2024/06/06 18:47
package com.example.bnoainstaller;
import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.content.pm.ActivityInfo;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);hasRoot();setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}private void hasRoot() {int i = execRootCmdSilent("echo test"); // 通过执行测试命令来检测Log.e("BNOAInstaller", "in hasRoot method, i is : " + i);if (i != -1) {if(this.checkAppExists()) {appExistsHandler();} else {installApp();}} else {hasNoRootPrivilegesHandler();}} // 执行linux命令但不关注结果输出protected static int execRootCmdSilent(String paramString) {try {Process localProcess = Runtime.getRuntime().exec("su");Object localObject = localProcess.getOutputStream();DataOutputStream localDataOutputStream = new DataOutputStream((OutputStream) localObject);String str = String.valueOf(paramString);localObject = str + "\n";localDataOutputStream.writeBytes((String) localObject);localDataOutputStream.flush();localDataOutputStream.writeBytes("exit\n");localDataOutputStream.flush();localProcess.waitFor();int result = localProcess.exitValue();return (Integer) result;} catch (Exception localException) {localException.printStackTrace();return -1;}}private void hasNoRootPrivilegesHandler() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("您没有获得root权限");builder.setPositiveButton("确认", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {dialog.dismiss();MainActivity.this.finish();} });builder.show();}private void installApp() {try {copyApp2SDCard("bnoa.apk");Log.e("BNOAInstaller", "Copy app file to sdcard successfully");copyApp2SystemAppDir();afterInstalling();} catch (Exception e) {e.printStackTrace();Log.e("BNOAInstaller", e.getMessage());Log.e("BNOAInstaller", "Copy file failed");installFailed();}}private void afterInstalling() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setMessage("安装程序已将<应用>安装到您的手机了,但需要重启手机,应用才可以使用。是否重启?");builder.setTitle("提示");//builder.setNegativeButton("取消", new OnClickListener() {//@Override//public void onClick(DialogInterface dialog, int arg1) {//dialog.dismiss();// MainActivity.this.finish();//}//});builder.setPositiveButton("重启", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {rebootDevice();} });builder.show();}private void installFailed() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("安装应用<应用>出错");builder.setPositiveButton("确认", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); MainActivity.this.finish();} });builder.show();}private void copyApp2SDCard(String fileName) throws Exception {Log.e("BNOAInstaller", "In copy app to system directory");// 获取assets下的数据库文件流 InputStream is = this.getBaseContext().getAssets().open(fileName); // 获取应用包名 String appPath = new File("/sdcard").getAbsolutePath() + "/" + fileName; Log.e("BNOAInstaller", "Create file in sdcard success"); File app = new File(appPath); Log.e("BNOAInstaller", "after create file : " + appPath); if (app.exists()) { app.delete(); } app.createNewFile(); Log.e("BNOAInstaller", "Create file bnoa.apk in sdcard, file path: " + appPath); FileOutputStream fos = new FileOutputStream(app, true); Log.e("BNOAInstaller", "After create output stream of fos"); byte[] buffer = new byte[1024]; int count = 0; while ((count = is.read(buffer)) != -1) { fos.write(buffer, 0, count); } Log.e("BNOAInstaller", "Write bnoa.apk to sdcard complete"); app = null; fos.close(); is.close(); }private void copyApp2SystemAppDir() throws Exception {Log.e("BNOAInstaller", "In copyApp2SystemAppDir()...");//String rwCommand = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system\n";String rwCommand = "mount -o remount,rw /system\n";//String copyCommand = "cat /sdcard/bnoa.apk > /system/app/bnoa.apk\n";String copyCommand = "cat /sdcard/bnoa.apk > /system/app/bnoa.apk\n";/** * 下面的chmod64Command命令非常重要,如果没有 * 这句命令,那么有的手机在bnoa.apk复制到/system/app下后,经过重启, * 应用图标也不会在屏幕上出现,应用本身也不会在系统后台运行。 * chmod 是给应用设置访问权限的 ,是linux的权限设置命令: * chod 664: -rw-r--r-- (644) 只有属主有读写权限;而属组用户和其他用户只有读权限。 */String chmod64Command = "chmod 644 /system/app/bnoa.apk\n";String rmAppFileCommand = "rm /sdcard/bnoa.apk\n";//删除sd卡上的APP文件//String roCommand = "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system\n";String roCommand = "mount -o remount,ro /system\n";//String lsCommand = "ls /system/app";Process proc = Runtime.getRuntime().exec("su"); Log.e("BNOAInstaller", "After command: su"); DataOutputStream os = new DataOutputStream(proc.getOutputStream()); os.writeBytes(rwCommand); Log.e("BNOAInstaller", "After command: mount -o remount,rw /system"); os.writeBytes(copyCommand); Log.e("BNOAInstaller", "After command: cat /sdcard/bnoa.apk > /system/app/bnoa.apk"); os.writeBytes(chmod64Command); Log.e("BNOAInstaller", "After command: chmod 644 /system/app/bnoa.apk"); os.writeBytes(rmAppFileCommand); Log.e("BNOAInstaller", "After command: rm /sdcard/bnoa.apk"); os.writeBytes(roCommand); Log.e("BNOAInstaller", "After command: mount -o remount,ro /system"); os.writeBytes("exit\n"); Log.e("BNOAInstaller", "After command: exit"); os.flush(); proc.waitFor();}private boolean checkAppExists() {try {//StringBuffer outputInfo = new StringBuffer();Process proc = Runtime.getRuntime().exec("ls /system/app"); proc.waitFor();BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); String appName = ""; while ((appName = reader.readLine())!= null) {// outputInfo.append(appName + "\n");// Log.e("BNOAInstaller_readLine: ", appName); appName = appName.trim(); if(appName.equals("bnoa.apk")) { return true; } }} catch (Exception e) {e.printStackTrace();Log.e("BNOAInstaller", e.getMessage());}return false;}private void appExistsHandler() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("版纳OA移动端已安装,是否卸载?");builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();MainActivity.this.finish();}});builder.setPositiveButton("残忍卸载", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {uninstallApp();} });builder.show();}private void uninstallApp() {try {//String rwCommand = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system\n";String rwCommand = "mount -o remount,rw /system\n";String rmCommand = "rm /system/app/bnoa.apk\n";String rmDataCommand = "rm -r /data/data/com.eruipan.bnoaapp\n";//删除已用生成的数据//String roCommand = "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system\n";String roCommand = "mount -o remount,ro /system\n";Process proc = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(proc.getOutputStream()); os.writeBytes(rwCommand); os.writeBytes(rmCommand); os.writeBytes(rmDataCommand); os.writeBytes(roCommand); os.writeBytes("exit\n"); os.flush(); proc.waitFor();uninstallAppOverHandler();} catch (Exception e) {Log.e("BNOAInstaller", e.getMessage());uninstallAppFail();}}private void uninstallAppOverHandler() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("卸载完成");builder.setPositiveButton("确认", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {dialog.dismiss();MainActivity.this.finish();} });builder.show();}private void uninstallAppFail() {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("卸载出错");builder.setPositiveButton("确认", new OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {dialog.dismiss();MainActivity.this.finish();} });builder.show();}private void rebootDevice() {try{ Process proc = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(proc.getOutputStream()); os.writeBytes("reboot\n"); os.writeBytes("exit\n"); os.flush();}catch(Exception e) {Log.e("BNOAInstaller", "reboot device exception : " + e.getMessage());}}}
0 0
- 将andriod应用安装为系统应用
- 将一个应用安装为系统应用
- 如何将APP预置为系统应用
- 获取已安装应用信息,判断是否为系统应用
- 在Andriod模拟器中安装应用
- 将应用打包为 Snaps
- Android4.4以上系统选择将第三方短信应用设置为默认短信应用方法
- andriod查看应用签名
- android 将个人应用改为系统应用
- android 将个人应用改为系统应用
- android 将个人应用改为系统应用
- 将android应用弄成系统应用
- Andriod和Zigbee在智能家居系统中的应用
- android 添加应用为系统应用
- android系统应用安装
- 删除系统应用,安装系统应用
- Android Tips: 如何判断所安装的应用是否为系统应用
- android为模拟器安装应用
- 怎么实现word与PDF文档的转换
- Apache 无法启动 err_log提示SSL Library Error: -8181 Certificate has expired
- 中文分词算法 之 基于词典的全切分算法(有点儿柱搜索的味道)
- 同一台服务器上部署多个tomcat程序
- java根据时间生成唯一ID
- 将andriod应用安装为系统应用
- IAR 编译器下如何生成*.Lib文件
- 《Linux实践及应用》
- Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- Eclipse快捷键 10个最有用的快捷键
- 如何使用开源的图表库MPAndroidChart
- 常见的软件测试概念
- python学习之路19-文件IO