Kevik
Kevik

Reputation: 9351

How to use more than one package name?

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" >

Upvotes: 2

Views: 2503

Answers (4)

Franci Penov
Franci Penov

Reputation: 75982

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.

Upvotes: 3

JRowan
JRowan

Reputation: 7104

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

Upvotes: 0

chenchuangfeng
chenchuangfeng

Reputation: 1

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!

Upvotes: 0

Kony2013
Kony2013

Reputation: 171

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.

Upvotes: 1

Related Questions