What is the correct way to use more than one package in one Android application?
If there is more than one package, is it correct to put all the names in the manifest tag, like in the example below?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.application"
package="com.example.pack2"
package="com.example.pack3"
android:versionCode="1"
android:versionName="1.0" >
The Android package in the manifest and the Java packages of the classes you use are separate concepts. They happen to be the same by default, for convenience. However, they can be completely different and unrelated.
When you declare your activities, services, content provider, and broadcast listener, you can specify the component class name in on of the following three ways (assuming your Android package is org.example.myapp)
Class name, i.e. MyActivity. The OS will assume your class is in Java package that has the same name as your Android package, and will resolve it to a fully qualified class name as org.example.myapp.MyActivity. Note, this form is equivalent to .MainActivity, which is a...
Relative class name, i.e. .ui.MyActivity. The OS will assume your class is in Java package that is inside of a Java package with the same name as your Android package, and will resolve it to a fully qualified class name as org.example.myapp.ui.MyActivity. Note the leading ., it is important! Otherwise you'll fall through to...
Fully qualified, i.e. com.android.example.myapp.MyActivity. The OS will use this as the exact name of the class it needs to load, and will ignore the Android package name.
The confusion between Android package name and Java package name is due to using the same term for two independent concepts. The documentation for ComponentName does not make it any easier, as it calls its two components package and class, whereas they are really Android package and Java class (where any of the three variants above are acceptable).
With that longer preamble, the answer to your question is simple:
You can't declare more than one packages in the manifest. However, you also don't need to. The Android package name is in reality the identity of your application as far as the OS is concerned, and nothing more. You can use any Java packages in your code.
Warning:
The auto-generated R class that contains the identifiers for all your resources is generated by default in a Java package with the same name as your Android package. Therefore, if your Android package name and your Java package name are different, you have two options:
Explicitly import the R class from the Java package with the name of your Android package
Use the appt tool from the command line and the --custom-package option to generate the R file into your main Java package. (I am linking to eLinux, because the Android documentation does not have much about the tool. But it is part of the Android SDK)
While this might seem as a proof that the two package names are relate, it's again mere convenience adopted by the tools. Sadly, while the aapt tool allows explicit setting of the target Java package for the R class, both Eclipse and IntelliJ hide that option, which makes the confusion more complete.
You would just simply import the package.
However, if I remember correctly, the classes in the other packages would not be seen by default. You will have to include
import <app-package>.R;
with app-package being the name of the application package. (without the brackets)
Also make sure that any import statements you have refers to the correct projects R file.
I think it can not be. You can do like this ,if package="com.example.pack2" and you want to declare a Activity which is the package package="com.example.pack3" ,you must use a full path
like com.example.pack3.Activity!
i got an app on the market with 5 packages in it and i only put the package with the activitys in it in the manifest and i havent gotten any problems with it if that helps any
and if your going to put your app on google play it wont accept package names starting with
com.example.
that is a reserved package name
Related
When I create application in Eclipse, I use default designer, and get application in namespace:
com.example.MyName
Now I try to upload app to Google Play, but getting error "Package Name "com.example" unacceptable. Please try another."
If I change name to com.MyName, I get a lot of error, like:
R cannot be resolved to a variable
What can I do?
You will need to change the package in at least 2, maybe more places depending on how complex your app is:
Change the package in the package attribute of the <manifest> element in your AndroidManifest.xml.
Change the package name in the src folder by right clicking on the old package, Going to Refactor -> Rename and typing in the same name you used in #1.
Beyond that, if your XML files use custom Views, you will need to update their class name as well. Additionally, you will need to update any other place where you've used a fully qualified domain name, like when launching an Intent from a component name.
Make sure your manifest is up to date.
Make sure your source code moved to the correct package.
Clean your project (Project > Clean). it will recompile your code and the R.java file.
Google Play does not accept the default com.example package name (to prevent everyone is going to use it, I suppose). Changing it to com is even worse!
Use a package with your name, company, application name, nickname, etc. to come up with something unique.
When you change the package of a class, you need to update the import-statements to the class and in the class (and possible other references to it, like the ones in the AndroidManifest.xml).
Just to be sure: you can clean your project to regenerate the automatically generated source files and recompile all classes.
I want to change the package name for an app which is not yet published in the Market. Is there a way to use the new package name as the uniqueId on Market/Play and while still using the old package name in my code?
Changing the package name in the manifest will change how Google Play reads your package name. You don't need to change the package name anywhere else to accomplish that. In Eclipse, the package name for classes can be changed independently (directly under src).
As zapl mentions, you may need to handle a few manual items if your application package name differs from that of the classes within (shortcuts that assume everything is in the same package don't always work in that case). For example, using ".classname" may need to change to a fully qualified classname in the manifest and elsewhere.
If you're looking for a way to change the package name to be different in Google Play than it is in the manifest, then no you can't (it wouldn't be a good idea anyway). You can, however, use library projects to create a new app with the new package name without changing the original code or manifest. Minimal code/xml would need to be written.
In the manifest I have:
... package="com.domain.app.multimedia"
which then names the application/activity with:
... activity android:name=".MultiMedia"
Eclipse, in turn, generates R.java in the package/path:
... com.domain.app
This package/path name may be a legacy of prior package renamings/refactoring - don't know.
I presumed (a mistake, or not) that R.java generation would follow the package name declared in the manifest. It would be a treat to find out how the gen chose the path/package name it uses. And more to the point, what is the rule for the manifest package name (other than the standard precaution of uniqueness, and relating to an owned domain).
Otherwise, I can live with this (an easy solution where forcing what appears to be an arbitrary import statement solves it all as far as getting a runtime).
Cheers,
Richard
Generally speaking, when you change the package name in your AndroidManifest.xml file, you are prompted with a question if you'd like to change the configuration to reflect the new package.
If you haven't clicked yes, you can always right click on the project -> Android Tools -> Rename application package
I am looking for ways to release two android apps with same source code without any changes but with two different package name without refactoring.
How do I do this?
You need to:
Refactor code to change package name in a IDE (like a Idea or Eclipse)
Change package name in AndroidManifest.xml
Build an sign the application.
What exactly is causing a problem?
when ever you change package name to Refactor but in R file will not package name so and android market consider R file package name.
Change package name in AndroidManifest.xml file now R package name will automatic change. now change old src package name new one. make sure activity is proper mapping.
What is bothering you? Just go ahead and release it with different package names. Make sure you make suitable refactoring in the code as well.
I need to publish two applications in android market which are similar in functionality and uses similar code base. The only places where these apps differ is client specific icons and some strings.
When trying to publish, it looks like my apps are getting package conflict. What should I do to avoid package conflict. I did some search on net and it looks like I have to change base package of my classes which just sounds weird. Is there any other option that I am missing.
The app is identified by the package name. Therefor the package name needs to be unique. Thats why everybody uses some domain names for that to create a unique package (domains are unique, too).
My packages looks like:
org.shufflecity.android;
org.shufflecity.server;
You can also add a subpackage for each client you have:
org.shufflecity.clientname.android
That should do the trick...
Only thing you need to change as package attribute in your manifest:
<manifest package="com.example.project" . . . >
Don't forget to fix all your staff in manifest file according to the new package name.
The package name HAS to be unique on the market. That said, you can still reuse the code you produce simply by making the common code an Android Library. Then each client subproject would have a different manifest specifying different package names.
Don't forget to create that package and to specify absolute package names for your activities in the manifest.