APK篇
2016-05-24 11:40
531 查看
对apk的安装与卸载:
import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; /** * 对apk进行安装卸载 * @author hudi * */ public class ApkUtils { public ApkUtils() { /* cannot be instantiated */ throw new UnsupportedOperationException("cannot be instantiated"); } /** * 查找versioncode * @param context * @return */ public static int GetLocalVersionCode(Context context){ try { return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode; } catch (NameNotFoundException e) { e.printStackTrace(); } return -1; } /** * 获取应用程序名称 */ public static String getAppName(Context context) { try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo( context.getPackageName(), 0); int labelRes = packageInfo.applicationInfo.labelRes; return context.getResources().getString(labelRes); } catch (NameNotFoundException e) { e.printStackTrace(); } return null; } /** * [获取应用程序版本名称信息] * * @param context * @return 当前应用的版本名称 */ public static String getVersionName(Context context) { try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo( context.getPackageName(), 0); return packageInfo.versionName; } catch (NameNotFoundException e) { e.printStackTrace(); } return null; } /** * 获取应用运行的最大内存 * * @return 最大内存 */ public static long getMaxMemory() { return Runtime.getRuntime().maxMemory() / 1024; } /** * 获取设备的可用内存大小 * * @param context 应用上下文对象context * @return 当前内存大小 */ public static int getDeviceUsableMemory(Context context) { ActivityManager am = (ActivityManager) context.getSystemService( Context.ACTIVITY_SERVICE); MemoryInfo mi = new MemoryInfo(); am.getMemoryInfo(mi); // 返回当前系统的可用内存 return (int) (mi.availMem / (1024 * 1024)); } /** * 获取应用签名 * * @param context 上下文 * @param pkgName 包名 * @return 返回应用的签名 */ public static String getSign(Context context, String pkgName) { try { PackageInfo pis = context.getPackageManager() .getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); return hexdigest(pis.signatures[0].toByteArray()); } catch (NameNotFoundException e) { e.printStackTrace(); return null; } } /** * 将签名字符串转换成需要的32位签名 * * @param paramArrayOfByte 签名byte数组 * @return 32位签名字符串 */ private static String hexdigest(byte[] paramArrayOfByte) { final char[] hexDigits = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 }; try { MessageDigest localMessageDigest = MessageDigest.getInstance("MD5"); localMessageDigest.update(paramArrayOfByte); byte[] arrayOfByte = localMessageDigest.digest(); char[] arrayOfChar = new char[32]; for (int i = 0, j = 0; ; i++, j++) { if (i >= 16) { return new String(arrayOfChar); } int k = arrayOfByte[i]; arrayOfChar[j] = hexDigits[(0xF & k >>> 4)]; arrayOfChar[++j] = hexDigits[(k & 0xF)]; } } catch (Exception e) { e.printStackTrace(); } return ""; } /** * 获取手机系统SDK版本 * * @return 如API 17 则返回 17 */ public static int getSDKVersion() { return android.os.Build.VERSION.SDK_INT; } /** * 是否Dalvik模式 * * @return 结果 */ public static boolean isDalvik() { return "Dalvik".equals(getCurrentRuntimeValue()); } /** * 是否ART模式 * * @return 结果 */ public static boolean isART() { String currentRuntime = getCurrentRuntimeValue(); return "ART".equals(currentRuntime) || "ART debug build".equals(currentRuntime); } /** * 获取手机当前的Runtime * * @return 正常情况下可能取值Dalvik, ART, ART debug build; */ public static String getCurrentRuntimeValue() { try { Class<?> systemProperties = Class.forName( "android.os.SystemProperties"); try { Method get = systemProperties.getMethod("get", String.class, String.class); if (get == null) { return "WTF?!"; } try { final String value = (String) get.invoke(systemProperties, "persist.sys.dalvik.vm.lib", /* Assuming default is */"Dalvik"); if ("libdvm.so".equals(value)) { return "Dalvik"; } else if ("libart.so".equals(value)) { return "ART"; } else if ("libartd.so".equals(value)) { return "ART debug build"; } return value; } catch (IllegalAccessException e) { return "IllegalAccessException"; } catch (IllegalArgumentException e) { return "IllegalArgumentException"; } catch (InvocationTargetException e) { return "InvocationTargetException"; } } catch (NoSuchMethodException e) { return "SystemProperties.get(String key, String def) method is not found"; } } catch (ClassNotFoundException e) { return "SystemProperties class is not found"; } } private final static X500Principal DEBUG_DN = new X500Principal( "CN=Android Debug,O=Android,C=US"); /** * 检测当前应用是否是Debug版本 * * @param ctx 上下文 * @return 是否是Debug版本 */ public static boolean isDebuggable(Context ctx) { boolean debuggable = false; try { PackageInfo pinfo = ctx.getPackageManager() .getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES); Signature signatures[] = pinfo.signatures; for (int i = 0; i < signatures.length; i++) { CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream stream = new ByteArrayInputStream( signatures[i].toByteArray()); X509Certificate cert = (X509Certificate) cf.generateCertificate( stream); debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN); if (debuggable) break; } } catch (NameNotFoundException e) { } catch (CertificateException e) { } return debuggable; } /** * 描述: 安装 * 根据root权限分静默安装及正常安装 * @param apkPath 文件路径 * @param context * @return */ 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; } } /** * 描述: 卸载 * 根据root权限分静默卸载及正常卸载 * @param packageName 安装包名 * @param context * @return */ 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权限 * @return boolean */ 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; } /** * 启动app * @param packageName com.exmaple.client * @param activityName com.exmaple.client.MainActivity * @return boolean */ 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; } /** * 静默卸载 * @param packageName 应用包名 * @return boolean */ 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; } /** * 静默安装 * @param apkPath * @return */ private 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; } /** * true or false * @param value int * @return */ private static boolean returnResult(int value){ // 代表成功 if (value == 0) { return true; } else if (value == 1) { // 失败 return false; } else { // 未知情况 return false; } } /** * 静默安装 * @param file 文件夹路径 * 注意:静默安装的前提是设备有ROOT权限 * 注意代码中pm install -r 前面的LD_LIBRARY_PATH=/vendor/lib:/system/lib,在4.0版本以上必须加上,不然会无法安装 * @return */ public static boolean slientInstall(File file) { boolean result = false; Process process = null; OutputStream out = null; try { process = Runtime.getRuntime().exec("su"); out = process.getOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(out); dataOutputStream.writeBytes("chmod 777 " + file.getPath() + "\n"); dataOutputStream.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " +file.getPath()); // 提交命令 dataOutputStream.flush(); // 关闭流操�? dataOutputStream.close(); out.close(); int value = process.waitFor(); return returnResult(value); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return false; } }
相关文章推荐
- C语言变量作用域
- 字符串处理
- 移动端适用小技巧
- 定制班第13课Spark Streaming之Driver容错安全性
- 下面来谈谈asp.net MD5加密技术
- android ListView 几个重要属性
- JSP页面标签
- java 获取系统信息及CPU的使用率(转)
- fatal error: vector: No such file or directory #include <vector>
- 运动结构重构
- fatal error: invalid virtual filesystem overlay file '/[Path]/all-product-headers.yaml
- 表单提交中get和post方式的区别
- mysql/Java服务端对emoji的支持
- 栈和队的应用
- Set判断重复,TreeSet排序
- 使用不完全填满数组的实现的循环FIFO(队列)
- ceph存储 基于pglog的一致性协议
- [几何]判断两个线段是否相交(多语言实现)
- 动态语言和静态语言两者的区别
- python爬虫抓手机号+java客户端小程序3