本文迁移自旧站,保留当时的学习记录;涉及版本与实践结论的内容会在后续复查中逐步更新。
AndroidManifest清单文件(一)
概念
清单文件用于向 Android 构建工具、Android 操作系统和 Google Play 描述应用的基本信息
划重点,清单文件需声明以下内容:
-
声明包名、icon、SDK等等应用信息: 应用的软件包名称,其通常与代码的命名空间相匹配。 构建项目时,Android 构建工具会使用此信息来确定代码实体的位置。 打包应用时,构建工具会使用 Gradle 构建文件中的应用 ID 来替换此值,而此 ID 则用作系统和 Google Play 上的唯一应用标识符。
-
注册四大组件: 应用的组件,包括所有 Activity、Service、Broadcast reciver和Content provider。 每个组件都必须定义基本属性,例如其 Kotlin 或 Java 类的名称。 清单文件还能声明一些功能,例如其所能处理的设备配置,以及描述组件如何启动的 Intent 过滤器。
-
申请必要的权限: 应用为访问系统或其他应用的受保护部分所需的权限。 如果其他应用想要访问此应用的内容,则清单文件还会声明其必须拥有的权限。
-
应用需要的硬件和软件功能: 这些功能会影响哪些设备能够从 Google Play 安装应用
标签
官方文档 对于在应用中创建的每个应用组件,您必须在清单文件中声明相应的 XML 元素:
-
用于 ```Activity``` 的每个子类。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57- ```<service>``` 用于 ```Service``` 的每个子类。
- ```<receiver>``` 用于 ```BroadcastReceiver``` 的每个子类。
- ```<provider>``` 用于 ```ContentProvider``` 的每个子类。
**如果您创建此类组件的任何子类,但未在清单文件中对其进行声明,则系统便无法启动该子类。**
这是一份从unity导出的Android工程中的清单文件
```xml
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools">
<application android:isGame="true">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="sensorPortrait" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:resizeableActivity="false" android:hardwareAccelerated="false" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.notch_support" android:value="true" />
</activity>
<meta-data android:name="unity.splash-mode" android:value="0" />
<meta-data android:name="unity.splash-enable" android:value="True" />
<meta-data android:name="unity.allow-resizable-window" android:value="False" />
<meta-data android:name="notch.config" android:value="portrait|landscape" />
<meta-data android:name="unity.build-id" android:value="20d9d69c-7bcf-4746-ac6b-9dff6c6c7753" />
<!-- Google Play Services -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<!--添加Google AdMob App ID-->
<!--官方测试APPID,正式上线更换-->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="xxxxxxxxxxxxxxxxxxxxxx"/>
<!--AppLovin -->
<!--添加您的Applovin SDK Key-->
<meta-data
android:name="applovin.sdk.key"
android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
</application>
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>
applicaltion标签
二级标签,配置项目级的参数,如 debuggable、enabled、description 和 allowClearUserData,或者为组件属性设置全局默认值,且组件可以再自己的标签内定义覆盖,比如icon、label等。
一般情况下不需要更改
咱们也可以自定义一个 MyApplication 类继承自 Application 类来在应用启动时做些业务,然后在清单中applicaltion标签下设置 android:name=.MyApplication属性来告诉系统用自定义的application类启动
包含于:
1 | <manifest> |
可包含:
1 | <activity> |
activity标签
如果是由Unity导出,默认只会有一个UnityPlayerActivity作为启动Activity,咱们游戏的主要业务都会在这个activity中
但是通常会定义一个SplashActivity作为启动的Activity,用于在进入到游戏业务前做一些业务,比如第三方sdk的初始化,权限申请,原生androidAPI调用之类的工作,然后再跳转到UnityPlayerActivity
而UnityPlayerActivity这个类是不建议修改的,但是某些业务游戏要在UnityPlayerActivity生命周期中添加业务代码,尤其是第三方sdk的业务,这个时候就需要定义一个MainActivity继承自UnityPlayerActivity,然后在MainActivity中重写生命周期方法,添加自己的业务代码,同时别忘了在清单中注册MainActivity
<activity> 包含于 <application>
1 |
|
以上面清单中的activity标签为例
1 | <activity |
1 |
|
元数据标签,可以包含于任意组件标签且可以有任意数量
主要作用就是存储信息,整个应用都可以访问,有点类似配置表,最常见是就是在接入第三方sdk时会要求加入 meta-data 标签记录 APPKEY
那怎么读取呢
1 | ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); |