Amazon Fire TV Stick vs Chromecast – XDA TV

There is no doubt that Amazon is a huge player in many markets, and they want to be a huge … more

Fight the Heat and Conserve Battery with EaseUS Coolphone

Memory hungry Android applications are often responsible for making our device … more

Battery Charged in 30 Seconds? Maybe in 2016

Phones and tablets are getting more and more power hungry with each passing generation. Their … more

ZArchive Manages Your File Archives

Today smartphones are quite powerful devices that can handle multiple processes at once. In fact, some of … more

Welcome to XDA

Search to go directly to your device's forum

Register an account

Unlock full posting privileges

Ask a question

No registration required
Post Reply

Access resources from the module itself

OP perseus0807

4th July 2014, 09:45 PM   |  #1  
OP Senior Member
Flag Pune
Thanks Meter: 55
 
129 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Okay, so I have some resources in my module/app. Say, a Drawable. Unfortunately, when I try to use them (to create a UI, say) from within handleLoadPackage, well, I can't. I can access R.drawable.abc just fine; but for some reason, all I get is a strange white rectangle instead of the actual Drawable.

How do I work around this issue? Thank you!
4th July 2014, 11:23 PM   |  #2  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 7,218
 
5,869 posts
Join Date:Joined: Aug 2012
Donate to Me
More
This is because your hook is not really part of your app - it runs in the hooked app. To access your own resources, you need to create a context for your app first.

You're going to need a general context first. If you can't get any from the class you're hooking, you can try AndroidAppHelper.currentApplication(). Then, use that context to create a context for your own app (see Context.createContext(...)). You can then access your resources using that context.
5th July 2014, 09:02 AM   |  #3  
OP Senior Member
Flag Pune
Thanks Meter: 55
 
129 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Quote:
Originally Posted by GermainZ

This is because your hook is not really part of your app - it runs in the hooked app. To access your own resources, you need to create a context for your app first.

You're going to need a general context first. If you can't get any from the class you're hooking, you can try AndroidAppHelper.currentApplication(). Then, use that context to create a context for your own app (see Context.createContext(...)). You can then access your resources using that context.

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.
5th July 2014, 10:54 AM   |  #4  
rovo89's Avatar
Senior Recognized Developer
Thanks Meter: 15,022
 
2,383 posts
Join Date:Joined: Jan 2012
More
Quote:
Originally Posted by perseus0807

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.

Yeah, but that resource ID will always be resolved using the target app's resources. If you can't use the the drawable directly, you can try this:
Code:
private static String MODULE_PATH = null;
private int mFakeId = 0;

public void initZygote(StartupParam startupParam) throws Throwable {
	MODULE_PATH = startupParam.modulePath;
}

public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
	if (!resparam.packageName.equals("your.target.app"))
		return;

	XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
	mFakeId = resparam.res.addResource(modRes, R.drawable.ic_launcher);
}
Then use mFakeId in your callback, which should run after the resources have been initialized. addResource() generates an ID for you an sets up a resource replacement for that non-existent ID to the item in your own resources.
The Following User Says Thank You to rovo89 For This Useful Post: [ View ]
5th July 2014, 11:09 AM   |  #5  
OP Senior Member
Flag Pune
Thanks Meter: 55
 
129 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Quote:
Originally Posted by rovo89

Yeah, but that resource ID will always be resolved using the target app's resources. If you can't use the the drawable directly, you can try this:

Code:
private static String MODULE_PATH = null;
private int mFakeId = 0;

public void initZygote(StartupParam startupParam) throws Throwable {
	MODULE_PATH = startupParam.modulePath;
}

public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
	if (!resparam.packageName.equals("your.target.app"))
		return;

	XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
	mFakeId = resparam.res.addResource(modRes, R.drawable.ic_launcher);
}
Then use mFakeId in your callback, which should run after the resources have been initialized. addResource() generates an ID for you an sets up a resource replacement for that non-existent ID to the item in your own resources.

This works, thank you so much! Bit stupid of me, I should have inferred this from the tutorial.
5th July 2014, 11:18 AM   |  #6  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 7,218
 
5,869 posts
Join Date:Joined: Aug 2012
Donate to Me
More
Quote:
Originally Posted by perseus0807

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.

To add to what rovo said, you could've use getDrawable() instead of getIdentifier() here, which would've given you Drawable (that you can then use) instead of a resource ID that won't work in the hooked app.
Post Reply Subscribe to Thread

Tags
drawable, resource, resources, xposed
Previous Thread Next Thread
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes