`

获得外部Apk资源的实体类[转]

阅读更多

获取外部Apk资源的实体类:

public class ForeignPackage {
 
 public final static String TAG = "ForeignPackage";
 
 private String packageName;
 private Context foreignCtx;

 public ForeignPackage(Context ctx, String packageName) throws NameNotFoundException{
  this.packageName = packageName;
  foreignCtx = ctx.createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
 }
 
 //获取该apk的上下文
 public Context getContext(){
  return foreignCtx;
 }
 
 //获取该apk的asset
 public AssetManager getAssets(){
  return foreignCtx.getAssets();
 }
 
 //获取该apk的Class
 public Class<?> loadClass(String className) throws ClassNotFoundException{
  return foreignCtx.getClassLoader().loadClass(className);
 }
 
 //ID: 形如R.layout.main
 public int getResourceID(String sID){
  int mID = -1;
  if(sID.indexOf('.') == -1 || sID.indexOf('.') == sID.length() - 1){
   return -1;
  }
  
  //String className = "com.apktest.R$attr";
  String className = packageName + "." + sID.substring(0, sID.lastIndexOf('.')).replace('.', '$');
  String idName = sID.substring(sID.lastIndexOf('.') + 1);
  try {
   Class<?> c = loadClass(className);
   Field field = c.getField(idName);
   mID = field.getInt(null);
  } catch (ClassNotFoundException e) {
   Log.e(TAG, "className Not Found:" + className);
   return -1;
  } catch (SecurityException e) {
   Log.e(TAG, "SecurityException:" + sID);
   return -1;
  } catch (NoSuchFieldException e) {
   Log.e(TAG, "The Field Not Found:" + idName);
   return -1;
  } catch (Exception e) {
   Log.e(TAG, "Exception:" + e);
   return -1;
  } 
  
  return mID;
 }
 
 //获取该apk包中的string资源
 public String getString(String id){
  int mID = getResourceID(id);
  if(mID == -1){
   return null;
  }
  
  String s = null;
  try {
   s = foreignCtx.getResources().getString(mID);
  } catch (Exception e) {
   Log.e(TAG, "Exception:" + e);
  }
  
  return s;
 }
 
 //获取该apk包中的color资源
 public int getColor(String id){
  int mID = getResourceID(id);
  if(mID == -1){
   return -1;
  }
  
  int color = -1;
  try {
   color = foreignCtx.getResources().getColor(mID);
  } catch (Exception e) {
   Log.e(TAG, "Exception:" + e);
  }
  
  return color;
 }
 
 //获取该apk包中的drawable资源
 public Drawable getDrawable(String id){
  int mID = getResourceID(id);
  if(mID == -1){
   return null;
  }
  
  Drawable d = null;
  try {
   d = foreignCtx.getResources().getDrawable(mID);
  } catch (Exception e) {
   Log.e(TAG, "Exception:" + e);
  }
  
  return d;
 }
 
 //获取该apk包中的layout资源
 public View getLayout(String id){
  int mID = getResourceID(id);
  if(mID == -1){
   return null;
  }
  
  LayoutInflater inflate  = (LayoutInflater)foreignCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  return inflate.inflate(mID, null);
 }
 
 //获取该apk包中的animation资源
 public Animation getAnimation(String id){
  int mID = getResourceID(id);
  if(mID == -1){
   return null;
  }
  
  Animation a = null;
  try {
   a = AnimationUtils.loadAnimation(foreignCtx, mID);
  } catch (Exception e) {
   Log.e(TAG, "Exception:" + e);
  }
  
  return a;
 }

 //获取该apk包中的类实力,className为类名,args为类的构造函数参数
 public Object getClassInstance(String className, Object...args) throws ClassNotFoundException{
  Class<?> c = loadClass(className);
  try {
   Class<?>[] cs = new Class<?>[args.length];
   int i = 0;
   for(Object arg : args){
    cs[i++] = InstanceMapping.classTypeFormat(arg.getClass());
   }
   Constructor<?> ct = c.getConstructor(cs);
   return ct.newInstance(args);
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  }
  return null;
 }
}

分享到:
评论

相关推荐

    EXE转APK资源转换器

    相比之下,.apk文件是Android应用的打包形式,它包含了Dex字节码(Java类的机器码)、资源文件、XML配置以及签名信息等,用于在Android系统中运行。 转换过程涉及多个步骤,通常包括以下关键知识点: 1. **解析....

    android插件化加载并启动外部apk

    3. **插件加载**:安装完成后,DroidPlugin框架会解析插件apk的资源和类,将其注入到主应用的运行环境中。这涉及到类加载器的定制,使得主应用能够识别和执行插件中的代码。 4. **权限处理**:由于插件是在运行时...

    IPA转apk超级工具

    IPA转apk工具的工作原理主要是解压IPA文件,提取其中的.app文件,然后使用特定的方法将其转换为Android可识别的Dalvik虚拟机(DEX)格式,同时处理资源文件和清单文件以适应Android环境。最后,将所有内容重新打包...

    Android动态加载(下)——加载已安装APK中的类和资源

    要加载外部APK的资源,我们需要利用Resources类和AssetManager。首先,通过AssetManager的addAssetPath()方法添加目标APK的路径,然后创建一个新的Resources对象。代码如下: ```java AssetManager assetManager = ...

    android加载未安装apk资源

    当APK被安装到设备上,Android系统会解析APK,将资源加载到Android Asset Packaging Tool (AAPT)生成的R类中,便于程序访问。然而,如果我们想要在不安装APK的情况下访问其资源,就需要绕过常规的R类加载方式。 1. ...

    安卓APK资源混淆加密重签名工具1.2.0

    安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度, 防止APK被篡改,重签名...

    APK资源提取神器

    在IT行业中,APK资源提取是一项非常实用的技术,尤其对于开发者和设计师来说。"APK资源提取神器"正如其名,是一款能够帮助我们从APK应用包中提取出各种资源的工具,包括图片、XML布局文件、字体、音频等。这使得我们...

    安卓插件机制相关-android插件化加载并启动外部apk采用360提供的DroidPlugin方案通过插件化加载安装并启动外部apk。需要为插件预申请对应权限.rar

    android插件化加载并启动外部apk采用360提供的DroidPlugin方案,通过插件化加载安装,并启动外部apk。需要为插件预申请对应权限.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...

    apk包解包工具,可以用来获取游戏包中的资源

    这类工具允许用户查看、修改或提取APK文件内的图片、音频、布局文件等资源,对于开发者而言,它们是调试、逆向工程或二次开发的重要辅助工具。描述中的“用来解压apk资源”进一步强调了这个工具的主要功能,即解包和...

    apk转crx测试demo

    【apk转crx测试demo】是一个关于将Android的APK应用程序转换为Chrome浏览器扩展CRX格式的实践示例。这个测试用例以一个名为“2048-测试demo”的2048游戏应用为例,它包括原始的APK文件以及转换后的CRX文件。 首先,...

    android动态加载外部资源文件

    总结,动态加载外部资源文件是Android高级开发中的一个重要技术,它允许应用在运行时灵活地获取和使用外部apk中的图片、文字和颜色等资源,提高了应用的可维护性和用户体验。然而,这也需要开发者对Android的资源...

    apk转jar工具

    这个过程涉及到APK的解包、DEX文件(Dalvik字节码)的转换以及资源的提取。以下将详细介绍如何使用工具“dex2jar”来实现这一转换。 “dex2jar”是一个用于处理Android DEX文件的开源工具,它可以将DEX文件转换为可...

    换肤:两个apk直接互相调用资源

    确保应用有读取外部存储或文件系统的权限,以便加载其他APK的资源。 4. **类的调用**: - 类的调用不仅涉及类加载,还可能需要处理反射和接口调用。通过反射,可以在运行时动态创建和调用其他APK中的类,但请注意...

    apktool Android的apk资源提取器

    **Android APK资源提取详解** 在Android开发中,APK文件是应用程序的打包格式,它包含了应用的代码、资源、库和配置文件等。有时开发者或逆向工程师需要深入探究APK内部结构,这时就需要借助工具进行资源提取。本文...

    apk反编译工具获得apk资源代码

    在Android开发领域,有时我们需要对已有的APK文件进行逆向工程,以便了解其工作原理、提取资源或学习他人的编程技巧。APK反编译工具在此过程中扮演了关键角色。本文将详细介绍如何使用给定的三个工具——Apktool、...

    一键给apk资源文件添加资源混淆

    一键给apk资源文件添加资源混淆

    XAPK安装程序.apk

    亲测可用,安装到Android手机或平板,打卡XAPK安装程序,会自动手撕鸡手机或平板中的Xapk格式文件,点击即可安装Xapk格式的APP。

    解析apk资源的aar包,并附带关键代码

    在Android开发中,APK文件是应用程序的二进制包,包含了应用的所有资源、代码、配置等信息。而AAR(Android Archive)文件则是Android库项目的一种打包格式,类似于Java的JAR包,但包含了资源文件和AndroidManifest....

    安卓APK混淆加密重签名工具1.5.0

    安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度,防止误报毒等功能. 主要...

    加载未安装资源apk里面的资源文件

    APK文件包含AndroidManifest.xml、资源文件(res/目录)和其他类文件等。解析APK时,我们主要关注AndroidManifest.xml,因为它包含了应用的元数据,包括Activity、Service等组件的定义,以及资源的引用。 2. **提取...

Global site tag (gtag.js) - Google Analytics