/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the “License”);
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an “AS IS” BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package com.android.commands.tm;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.helloworld.android.tvapi.common.TvManager;
import com.helloworld.android.tvapi.common.PictureManager;
import com.helloworld.android.tvapi.common.AudioManager;
import com.helloworld.android.tvapi.common.CecManager;
import com.helloworld.android.tvapi.common.ChannelManager;
import com.helloworld.android.tvapi.common.DatabaseManager;
import com.helloworld.android.tvapi.common.LogoManager;
import com.helloworld.android.tvapi.common.MhlManager;
import com.helloworld.android.tvapi.common.ParentalcontrolManager;
import com.helloworld.android.tvapi.common.PipManager;
import com.helloworld.android.tvapi.common.PvrManager;
import com.helloworld.android.tvapi.common.TimerManager;
import com.helloworld.android.tvapi.factory.FactoryManager;

public class Tm {

private static final String CLASSNAME = "--class=";private static final String METHOD = "--method=";private static final String STATIC_METHOD = "--static=";private static final String ARGS_INT = "-i";private static final String ARGS_CHAR = "-c";private static final String ARGS_SHORT = "-s";private static final String ARGS_DOUBLE = "-d";private static final String ARGS_STRING = "-S";private static final String ARGS_BOOLEAN = "-b";private static final String ARGS_ENUM = "-e";private static final String ARGS_LONG = "-l";private static final String CLASS_NAME_TVMANAGER = "com.helloworld.android.tvapi.common.TvManager";private static final String CLASS_NAME_PICTUREMANAGER = "com.helloworld.android.tvapi.common.PictureManager";private static final String CLASS_NAME_AUDIOMANAGER = "com.helloworld.android.tvapi.common.AudioManager";private static final String CLASS_NAME_CECMANAGER = "com.helloworld.android.tvapi.common.CecManager";private static final String CLASS_NAME_ChannelManager = "com.helloworld.android.tvapi.common.ChannelManager";private static final String CLASS_NAME_DatabaseManager = "com.helloworld.android.tvapi.common.DatabaseManager";private static final String CLASS_NAME_MhlManager = "com.helloworld.android.tvapi.common.MhlManager";private static final String CLASS_NAME_ParentalcontrolManager = "com.helloworld.android.tvapi.common.ParentalcontrolManager";private static final String CLASS_NAME_PipManager = "com.helloworld.android.tvapi.common.PipManager";private static final String CLASS_NAME_PvrManager = "com.helloworld.android.tvapi.common.PvrManager";private static final String CLASS_NAME_TimerManager = "com.helloworld.android.tvapi.common.TimerManager";private static final String CLASS_NAME_FactoryManager = "com.helloworld.android.tvapi.factory.FactoryManager";private HashMap<String, Object> allObjs = new HashMap<String, Object>();public Tm() {allObjs.put(CLASS_NAME_TVMANAGER, TvManager.getInstance());allObjs.put(CLASS_NAME_PICTUREMANAGER, PictureManager.getInstance());allObjs.put(CLASS_NAME_AUDIOMANAGER, TvManager.getInstance().getAudioManager());allObjs.put(CLASS_NAME_CECMANAGER, TvManager.getInstance().getCecManager());allObjs.put(CLASS_NAME_ChannelManager, TvManager.getInstance().getChannelManager());allObjs.put(CLASS_NAME_DatabaseManager, TvManager.getInstance().getDatabaseManager());allObjs.put(CLASS_NAME_MhlManager, TvManager.getInstance().getMhlManager());allObjs.put(CLASS_NAME_ParentalcontrolManager, TvManager.getInstance().getParentalcontrolManager());allObjs.put(CLASS_NAME_PipManager, TvManager.getInstance().getPipManager());allObjs.put(CLASS_NAME_PvrManager, TvManager.getInstance().getPvrManager());allObjs.put(CLASS_NAME_TimerManager, TvManager.getInstance().getTimerManager());allObjs.put(CLASS_NAME_FactoryManager,TvManager.getInstance().getFactoryManager());}public static void main(String[] args) {try {(new Tm()).run(args);} catch (Exception e) {e.printStackTrace();}}private void run(String[] args) throws Exception {dumpArgs(args);if (args.length < 2) {showUsage();return;}int index = 0;String command = args[index];String hasClassName = null;String hasMethodName = null;String hasStaticMethod = null;boolean hasArgs = false;String[] argsArray = null;int argsCount = 0;if (args.length > 2) {hasArgs = true;argsArray = new String[args.length - 2];}for (int i = 0; i < args.length; i++) {if (args[i].startsWith(CLASSNAME)) {hasClassName = args[i].substring(CLASSNAME.length());} else if (args[i].startsWith(METHOD)) {hasMethodName = args[i].substring(METHOD.length());} else if (args[i].startsWith(STATIC_METHOD)) {hasStaticMethod = args[i].substring(STATIC_METHOD.length());} else {if (argsArray != null) {argsArray[argsCount++] = args[i];}}}System.out.println("ClassName : " + hasClassName + "Method : "+ hasMethodName + " StaticMethod : " + hasStaticMethod);System.out.println("dump Args :");dumpArgs(argsArray);if ((hasClassName == null)|| ((hasClassName != null) && (hasMethodName == null) && (hasStaticMethod == null))) {System.out.println("Error ClassName : " + hasClassName+ "Method : " + hasMethodName + " StaticMethod : "+ hasStaticMethod);}Object[] argsObjArray = null;Class[] argsClassArray = null;if (hasArgs) {argsObjArray = getObjectArrayForString(argsArray);argsClassArray = getClassArrayForString(argsArray);if (argsObjArray.length != argsClassArray.length) {System.out.println("dismatched args");}}dumpArgs(argsObjArray);dumpArgs(argsClassArray);Class cls = null;try {cls = Class.forName(hasClassName);} catch (ClassNotFoundException e) {e.printStackTrace();cls = null;System.out.println(hasClassName + " not found");}if (cls == null) {return;}Constructor[] constructors = cls.getDeclaredConstructors();if (constructors == null || constructors.length == 0)return;Method[] allMethod = null;try {allMethod = cls.getDeclaredMethods();} catch (Exception e) {e.printStackTrace();System.out.println("this object has no method");}setAllMethodAccessible(allMethod);Field[] allField = null;try {allField = cls.getDeclaredFields();} catch (Exception e) {e.printStackTrace();System.out.println("this object has no field");}setAllFieldAccessible(allField);Object obj = getObjectForClassName(hasClassName);Method method = cls.getDeclaredMethod(hasMethodName, argsClassArray);Object result = method.invoke(obj, argsObjArray);System.out.println(hasClassName + "." + hasMethodName + " return "+ result);}private Object getObjectForClassName(String classname) {return allObjs.get(classname);
}private void setAllMethodAccessible(Method[] methods) {if (methods == null || methods.length <= 0)return;for (Method method : methods) {method.setAccessible(true);}
}private void setAllFieldAccessible(Field[] fields) {if (fields == null || fields.length <= 0)return;for (Field field : fields) {field.setAccessible(true);}
}private Object[] getObjectArrayForString(String args[]) throws Exception {if (args == null || args.length < 1)return (Object[]) null;Object[] tmp = new Object[args.length];for (int i = 0; i < args.length; i++) {String arg = args[i];if ((arg == null) || (arg.length() <= 2) || (!arg.startsWith("-"))|| (!isObjectTypeLegal(arg.charAt(1)))) {throw (new Exception("args nor right"));} else {Object obj = getObjectForString(arg);if (obj == null)throw (new Exception("args nor right"));tmp[i] = obj;}}return tmp;}private Class[] getClassArrayForString(String[] args) throws Exception {if (args == null || args.length < 1)return (Class[]) null;Class[] tmp = new Class[args.length];for (int i = 0; i < args.length; i++) {tmp[i] = getClassForString(args[i]);if(tmp[i] == null){throw (new Exception("args nor right,can't find class"));}}return tmp;
}private boolean isObjectTypeLegal(char type) {if (type == 'i' || type == 'c' || type == 's' || type == 'd'|| type == 'S' || type == 'b' || type == 'e')return true;return false;
}private Class getClassForString(String arg) {if ((arg == null) || (arg.length() <= 2))return null;if (arg.startsWith(ARGS_BOOLEAN)) {return boolean.class;}if (arg.startsWith(ARGS_CHAR)) {return char.class;}if (arg.startsWith(ARGS_DOUBLE)) {return double.class;}if (arg.startsWith(ARGS_INT)) {return int.class;}if (arg.startsWith(ARGS_SHORT)) {return short.class;}if (arg.startsWith(ARGS_STRING)) {return String.class;}if (arg.startsWith(ARGS_LONG)) {return long.class;}if(arg.startsWith(ARGS_ENUM)){String tmp = convertString(arg.substring(2));String enumClassName = tmp.substring(0, tmp.lastIndexOf("."));Class cls =null;try {cls = Class.forName(enumClassName);} catch (ClassNotFoundException e) {e.printStackTrace();cls= null;}return cls;}return null;}private String convertString(String source){if(source != null)return source.replace("*", "$");return null;
}private Object getObjectForString(String arg) {if ((arg == null) || (arg.length() <= 2))return null;if (arg.startsWith(ARGS_BOOLEAN)) {String tmp = arg.substring(2);if ("true".equals(tmp) || "1".equals(tmp)) {return true;}if ("false".equals(tmp) || "0".equals(tmp)) {return false;}return null;}if (arg.startsWith(ARGS_CHAR)) {char tmp = arg.charAt(2);return tmp;}if (arg.startsWith(ARGS_DOUBLE)) {String tmp = arg.substring(2);return new Double(tmp);}if (arg.startsWith(ARGS_INT)) {String tmp = arg.substring(2);return Integer.parseInt(tmp);}if (arg.startsWith(ARGS_SHORT)) {String tmp = arg.substring(2);return Short.parseShort(tmp);}if (arg.startsWith(ARGS_STRING)) {String tmp = arg.substring(2);return tmp;}if (arg.startsWith(ARGS_LONG)) {String tmp = arg.substring(2);return Long.parseLong(tmp);}if (arg.startsWith(ARGS_ENUM)) {String tmp = convertString(arg.substring(2));String enumClassName = tmp.substring(0, tmp.lastIndexOf("."));String enumName = tmp.substring(tmp.lastIndexOf(".") + 1);Class cls =null;try {cls = Class.forName(enumClassName);} catch (ClassNotFoundException e) {e.printStackTrace();cls= null;}if(cls == null) return null;System.out.println("enumClassName="+enumClassName + " enumName="+enumName);return Enum.valueOf(cls, enumName);}return null;}private void dumpArgs(Object[] args) {if (args != null) {for (Object tmp : args) {System.out.print(tmp + "|");}}System.out.println();}private void showUsage() {//tm --class=com.helloworld.android.tvapi.common.PictureManager --method=setBacklight -i10 //tm --class=com.helloworld.android.tvapi.common.PictureManager --method=setMfc -ecom.helloworld.android.tvapi.common.vo.EnumMfcMode.E_OFFSystem.out.println("tm --class=com.helloworld.xxx --method=xxx [-iXXX -cXXX -sXXX -dXXX -SXXX -bXXX -eXXX -lXXX]");System.out.println("--method you can append your class argument after --class,such as --class=com.helloworld.android.tvapi.common.PictureManager");System.out.println("--method you can append your method argument after --method,such as --method=setBacklight");System.out.println("-iXXX you can append an int argument after -i,such as -i10");System.out.println("-cXXX you can append an char argument after -c,such as -ic");System.out.println("i represents integer, c represents char, s represents shot, S represents String, d represent double, b reprents bool , e reprements enum, l represents long");System.out.println("-e is a little complex, for example public final void setMfc(EnumMfcMode mfcMode), you should use like follow");System.out.println("tm --class=com.helloworld.android.tvapi.common.PictureManager --method=setMfc -ecom.helloworld.android.tvapi.common.vo.EnumMfcMode.E_OFF");System.err.println();
}

}

app_process 自定义类似am pm命令相关推荐

  1. Android pm 命令详解

    一.pm命令介绍与包名信息查询 1.pm命令介绍 pm工具为包管理(package manager)的简称 可以使用pm工具来执行应用的安装和查询应用宝的信息.系统权限.控制应用 pm工具是Andro ...

  2. android 命令使用详解,Android下pm 命令详解

    作者:Sam (甄峰) sam_code@hotmail.com Sam在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这 ...

  3. Android下pm命令详解

    在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之. 0. Usage: ...

  4. Android pm命令详解

    在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之. 0. Usage: ...

  5. android工具am的用法,Android am/pm命令用法

    am命令的参数介绍: usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging se ...

  6. Android am/pm命令用法

    am命令的参数介绍: usage: am [subcommand] [options] start an Activity: am start [-D] <INTENT>-D: enabl ...

  7. Android之在ubuntu上常用的am、pm命令的总结

    adb shell am instrument [options] <COMPONENT> 作用:启动对instrument实例的监视. 参数[options]: -e <key&g ...

  8. Android自定义类似ProgressDialog效果的Dialog

    2019独角兽企业重金招聘Python工程师标准>>> Android自定义类似ProgressDialog效果的Dialog. 方法如下: 1.首先准备两张自己要定义成哪样子的效果 ...

  9. android pm命令用法

    原址 一.Pm命令 命令格式: pm <command> 命令列表: 命令 功能 实现方法 list packages 列举app包信息 PMS.getInstalledPackages ...

最新文章

  1. 程序员的比较工具大杂烩
  2. 《C程序设计语言》(第二版)要点总结
  3. Inside Spring - learning notes - Jerry Wang的Spring学习笔记
  4. matlab delete、clf、cla、close、closereq删除对象
  5. 天猫整站SSM-分页-limit(做个人学习笔记整理用)
  6. postgresql 高可用 etcd + patroni 之六 callback bind vip
  7. hpcp5225设置linux网络,惠普HP color laserjet CP5225打印机驱动
  8. java 正方形_java-确定正方形和矩形之间的关系的算法
  9. Go语言基础之10--面向对象编程2之方法
  10. asp.net C#实现下载文件的六种方法实例
  11. 2.windows-and-mac在控制台创建ASP.NET-Core应用程序
  12. RabbitMQ入门:主题路由器(Topic Exchange)
  13. SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
  14. [buuctf.reverse] 33到50题
  15. LoadRunner性能测试培训大纲
  16. AAPT: error: reso 1. mavenCentral():2. jcenter():3. mavenLocal():
  17. 探索推荐引擎内部的秘密 - 推荐引擎初探
  18. 王子回家-第12届蓝桥杯Scratch省赛2真题第3题
  19. 数组概念、定义、初始化
  20. Qt三维图表模块 -- Data Visualization 学习记录

热门文章

  1. 对cross-env的理解
  2. 皮卡车行业调研报告 - 市场现状分析与发展前景预测
  3. 按图搜索淘宝商品-item_search_img (拍立淘)
  4. DbVisualizer解决中文乱码问题
  5. 翻倍增长!C-V2X商业化“提速”,新一代模组加速“助跑”
  6. 用python写注册登录界面web_用Python实现web端用户登录和注册功能
  7. eslint报“Extra semicolon“错误的解决
  8. 浅谈Android中的异步加载之ListView中图片的缓存及优化三
  9. JS 获取第一个和最后一个,子节点、子元素
  10. linux 进程 ksoftirqd/n 占用cpu 100%