14

我有一个问题,是否可以在 AndroidManifest.xml 中读取包名

我是说

我有一个 AndroidManifest.xml 如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackagename"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

....

</manifest>

现在我必须添加一个权限(用于 GCM)

<permission
        android:name="MYPACKAGENAME.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

是否可以在上述权限标签中动态地用 com.mypackagename 替换 MYPACKAGENAME。

4

6 回答 6

25

您可以删除名称的包名称部分:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackagename">
    ...

    <permission
        android:name=".permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    ...
</manifest>

当您以 . 开头的权限名称时。它会自动以包名称为前缀。

您不能动态更改包名称,但您可以通过在 build.gradle 中定义 applicationId 并在 android manifest 中使用 ${applicationId} 作为前缀来做某些事情。

在 build.gradle 中:

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.2"
    productFlavors {
       development {
           applicationId = "com.mypackage.development"
       }
    }
}

然后在你的 AndroidManifest.xml 中有:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackagename">
    ...

    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    ...
</manifest>

您可以从这里找到更多信息:http ://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

稍后的方法将允许您与生产版本并排运行您的应用程序的开发风格。我希望这有帮助。

于 2014-08-07T15:32:44.607 回答
7

您可以使用${applicationId}替换您的包名称,例如。

<permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
于 2017-02-24T01:01:45.710 回答
5

尚未在此处发布的替代方法是"${packageName}". 这很有用,例如,如果您正在开发具有特定包名称的库,但使用该库的应用程序将具有不同的包名称和/或应用程序 ID:"${packageName}"在库的清单中将扩展为库的包姓名。

于 2018-06-20T16:06:12.993 回答
0

您可以使用相对用法。

静止的 :

<permission
        android:name="com.mypackagename.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

相对的 :

<permission
        android:name=".permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

当名称以点开头时就像把 MYPACKAGENAME 声明在

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackagename"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

....

</manifest>
于 2015-09-28T21:19:45.417 回答
-1

AndroidManifest.xml(顾名思义)用于声明和显示事物。

在您的应用程序中动态读取您的包名称是可能的,因为它在您的清单文件中声明。

从理论上讲,您无法在 AndroidManifest 中读取或传递值。您将需要在应用程序中执行动态操作。

于 2013-05-08T11:43:19.353 回答
-2

你的答案是否定的..

一旦您发布了您的应用程序,您就无法更改包名称。包名定义了你的应用程序的身份,所以如果你改变它,那么它被认为是一个不同的应用程序,以前版本的用户不能更新到新版本。

换句话说

Android将具有不同包名的应用程序视为完全不同的应用程序

编辑:

Context.getPackageName()你在寻找

于 2013-05-08T11:13:15.667 回答