What Do You Do with All of Your Old Photos?

Smartphone cameras have advanced so tremendously over the past few years that they have … more

Diving into the April 2015 Material Design Update

Before the release of Android 5.0 Lollipop, the Holo Design guidelines served as the … more

New Cyanogen Partnerships Bring Privacy Concerns

New Privacy concerns have emerged regarding Cyanogen’s latest announcements, … more

PSA: Google Play Services Wakelock Affects Many 5.x ROMs

Wakelocks are the bane of the battery conscious, and this wakelock bug has been … more
Post Reply Subscribe to Thread Email Thread

Access resources from the module itself

4th July 2014, 08:45 PM |#1  
OP Senior Member
Flag Pune
Thanks Meter: 56
 
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, 10:23 PM |#2  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 8,119
 
6,194 posts
Join Date:Joined: Aug 2012
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, 08:02 AM |#3  
OP Senior Member
Flag Pune
Thanks Meter: 56
 
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, 09:54 AM |#4  
rovo89's Avatar
Senior Recognized Developer
Thanks Meter: 30,403
 
2,431 posts
Join Date:Joined: Jan 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.

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 2 Users Say Thank You to rovo89 For This Useful Post: [ View ]
5th July 2014, 10:09 AM |#5  
OP Senior Member
Flag Pune
Thanks Meter: 56
 
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, 10:18 AM |#6  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 8,119
 
6,194 posts
Join Date:Joined: Aug 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.

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