Theres three main ways ..
1) A pnd that installs the stuff into the filesystem .. given your filesystem has the space (questionable on NAND, especially if you have multiple installers to nand of stuff)
2) A pnd that contains the stuff, and stays open until you kill it somehow; ie: say it opens up a shell, and when that shell exits, the pnd closes down; piece of cake really.
3) using a native packager like opkg, or apt-get for debian installs, etc.
We'd always intended to build a robust other option, for stuff like jhava, or to add shared libs into the system, or add dictionairy packs, and so on .. a special kind of pnd that has PXML that flags it as a long term mountable, that mounts into the filesystem instead of into /mnt/utmp/...., but theres a lot of goofy 'interfacing with the user' questions no one has really thought out and resolved, so that subsystem never got moved on.
ie:
It'd be cool to drop java_foo.pnd into your SD, and then have a pair of options appear in the menu (say) -- System -> Enable-java and System -> Disabnle java, and then the user could activate/deactivate as needed.
A little cumbersome though; so then you add PXML dependancies, so that one PXML can refer to another, and then when you need to run one app, it can implicitly cause running of another app. And using a recent and fixed pnd_run.sh so more than 9 pnds can run p[roperly, it might be work.. but you could very quickly trun into problems if one app depends on 3 other mounts, and any of those depend on mounts... suddenly, you're mounting up 20 pnds just to run something. Hmm.
If you're booting from SD and have GBs of space, its not an issue, but all this dependancy nastiness is a tough nut to crack well, in a limited RAM and limited NAND sort of situation, and we of course want pnd-magic to 'just work, nice and easy' ..
jeff