采用反射获取包名
来源:互联网 发布:c高性能编程 pdf 编辑:程序博客网 时间:2024/05/17 06:52
反射获取包名的方法:
/** * <br>功能简述:采用反射获取包名 * <br>功能详细描述: * <br>注意: * @param ctx * @param apkPath * @return */private static HashMap<String, String> sApkPathMap;public static String getApkFileInfoFromReflect(Context ctx, String apkPath) { File apkFile = new File(apkPath); if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) { return null; } if (sApkPathMap != null) {synchronized (sApkPathMap) {Iterator iter = sApkPathMap.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue();if (val != null && ((String) val).equals(apkPath)) {return (String) key;}}}} String PATH_PackageParser = "android.content.pm.PackageParser"; String PATH_AssetManager = "android.content.res.AssetManager"; try { // 反射得到pkgParserCls对象并实例化,有参数 // apk包的文件路径 // 这是一个Package 申明器, 是隐蔽的 // 构造函数的参数只有一个, apk文件的路径 Class<?> pkgParserCls = Class.forName(PATH_PackageParser); Class<?>[] typeArgs = { String.class }; Constructor<?> pkgParserCt = pkgParserCls.getConstructor(typeArgs); Object[] valueArgs = { apkPath }; Object pkgParser = pkgParserCt.newInstance(valueArgs); // 从pkgParserCls类得到parsePackage方法 // 这个是与显示有关的, 里面涉及到一些像素显示等等 DisplayMetrics metrics = new DisplayMetrics(); metrics.setToDefaults(); // 这个是与显示有关的, 这边使用默认 typeArgs = new Class<?>[] { File.class, String.class, DisplayMetrics.class, int.class }; Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage", typeArgs); valueArgs = new Object[] { new File(apkPath), apkPath, metrics, 0 }; // 执行pkgParser_parsePackageMtd方法并返回 Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs); // 从返回的对象得到名为"applicationInfo"的字段对象 if (pkgParserPkg == null) { return null; } Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo"); // 从对象"pkgParserPkg"得到字段"appInfoFld"的值 if (appInfoFld.get(pkgParserPkg) == null) { return null; } ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg); Log.d("ANDROID_LAB", "pkg:" + info.packageName + " uid=" + info.uid);if (sApkPathMap == null) {sApkPathMap = new HashMap<String, String>();} if (info.packageName != null) { sApkPathMap.put(info.packageName, apkPath);} return info.packageName; } catch (Exception e) { e.printStackTrace(); } return null; }
其他地方调用此方法获取包名:
String packageName = getApkFileInfoFromReflect(Const.ZIP_PATH + fileName);
0 0
- 采用反射获取包名
- 根据包名利用反射获取缓存信息
- 反射获取类名
- 通过构造函数反射--通过一个对象获取一个完整的包名和类名
- 获取apk包名
- 用反射获取接口名
- JAVA 采用反射机制 获取构造方法
- 通过包名获取程序名类
- android中获取包名,类名
- 获取apk的包名
- 获取App的包名
- aapt获取应用包名
- Java反射机制获取当前类名
- java 反射通过类名获取对象
- 反射获取属性名和属性值
- 反射如何获取函数的参数名
- Android获取包名、版本号、包名、meta-data
- 反射获取方法名及参数名,反射获取参数作为对象使用
- C/C++字符串查找函数
- C#中ListBox控件设置Item字体并居中显示
- sdut Find a girl friend(结构体的二级排序)
- 内存分配——静态存储区 栈 堆
- Web前端应用常用技术大盘点
- 采用反射获取包名
- 業務システムの開発ドキュメント標準化 第2回:機能一覧表とI/O関連図
- 几种常见的排序算法(java实现)
- CSS技巧和经验列表
- 升级android sdk到5.0时,创建项目出现错误:No resource found that matches the given name 'android:Widget.Material.A
- List集合中的对象根据属性排序
- GA埋点,统计网站流量
- android中设计模式之单例模式
- jion优化基础一