获取外部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;
}
}
分享到:
相关推荐
相比之下,.apk文件是Android应用的打包形式,它包含了Dex字节码(Java类的机器码)、资源文件、XML配置以及签名信息等,用于在Android系统中运行。 转换过程涉及多个步骤,通常包括以下关键知识点: 1. **解析....
3. **插件加载**:安装完成后,DroidPlugin框架会解析插件apk的资源和类,将其注入到主应用的运行环境中。这涉及到类加载器的定制,使得主应用能够识别和执行插件中的代码。 4. **权限处理**:由于插件是在运行时...
IPA转apk工具的工作原理主要是解压IPA文件,提取其中的.app文件,然后使用特定的方法将其转换为Android可识别的Dalvik虚拟机(DEX)格式,同时处理资源文件和清单文件以适应Android环境。最后,将所有内容重新打包...
要加载外部APK的资源,我们需要利用Resources类和AssetManager。首先,通过AssetManager的addAssetPath()方法添加目标APK的路径,然后创建一个新的Resources对象。代码如下: ```java AssetManager assetManager = ...
当APK被安装到设备上,Android系统会解析APK,将资源加载到Android Asset Packaging Tool (AAPT)生成的R类中,便于程序访问。然而,如果我们想要在不安装APK的情况下访问其资源,就需要绕过常规的R类加载方式。 1. ...
安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度, 防止APK被篡改,重签名...
在IT行业中,APK资源提取是一项非常实用的技术,尤其对于开发者和设计师来说。"APK资源提取神器"正如其名,是一款能够帮助我们从APK应用包中提取出各种资源的工具,包括图片、XML布局文件、字体、音频等。这使得我们...
android插件化加载并启动外部apk采用360提供的DroidPlugin方案,通过插件化加载安装,并启动外部apk。需要为插件预申请对应权限.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
这类工具允许用户查看、修改或提取APK文件内的图片、音频、布局文件等资源,对于开发者而言,它们是调试、逆向工程或二次开发的重要辅助工具。描述中的“用来解压apk资源”进一步强调了这个工具的主要功能,即解包和...
【apk转crx测试demo】是一个关于将Android的APK应用程序转换为Chrome浏览器扩展CRX格式的实践示例。这个测试用例以一个名为“2048-测试demo”的2048游戏应用为例,它包括原始的APK文件以及转换后的CRX文件。 首先,...
总结,动态加载外部资源文件是Android高级开发中的一个重要技术,它允许应用在运行时灵活地获取和使用外部apk中的图片、文字和颜色等资源,提高了应用的可维护性和用户体验。然而,这也需要开发者对Android的资源...
这个过程涉及到APK的解包、DEX文件(Dalvik字节码)的转换以及资源的提取。以下将详细介绍如何使用工具“dex2jar”来实现这一转换。 “dex2jar”是一个用于处理Android DEX文件的开源工具,它可以将DEX文件转换为可...
确保应用有读取外部存储或文件系统的权限,以便加载其他APK的资源。 4. **类的调用**: - 类的调用不仅涉及类加载,还可能需要处理反射和接口调用。通过反射,可以在运行时动态创建和调用其他APK中的类,但请注意...
**Android APK资源提取详解** 在Android开发中,APK文件是应用程序的打包格式,它包含了应用的代码、资源、库和配置文件等。有时开发者或逆向工程师需要深入探究APK内部结构,这时就需要借助工具进行资源提取。本文...
在Android开发领域,有时我们需要对已有的APK文件进行逆向工程,以便了解其工作原理、提取资源或学习他人的编程技巧。APK反编译工具在此过程中扮演了关键角色。本文将详细介绍如何使用给定的三个工具——Apktool、...
一键给apk资源文件添加资源混淆
亲测可用,安装到Android手机或平板,打卡XAPK安装程序,会自动手撕鸡手机或平板中的Xapk格式文件,点击即可安装Xapk格式的APP。
在Android开发中,APK文件是应用程序的二进制包,包含了应用的所有资源、代码、配置等信息。而AAR(Android Archive)文件则是Android库项目的一种打包格式,类似于Java的JAR包,但包含了资源文件和AndroidManifest....
安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度,防止误报毒等功能. 主要...
APK文件包含AndroidManifest.xml、资源文件(res/目录)和其他类文件等。解析APK时,我们主要关注AndroidManifest.xml,因为它包含了应用的元数据,包括Activity、Service等组件的定义,以及资源的引用。 2. **提取...