Android清单文件详解(五)----<application>的属性详解(一)

简介: Android清单文件详解(五)----<application>的属性详解(一)

前面第三篇,第四篇博文虽然讲解了application节点的几个属性,但是还不够完全,本着对专业执着的精神,有必要深挖下去。


1.android:allowBackup


它表示是否允许应用程序参与备份。如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作,而整个系统备份能导致所有应用程序数据通过ADB来保存。该属性必须是一个布尔值,或为true,或为false,其默认值为true。


现在,我们就对前面的HelloWorld实例进行修改。在工程的AndroidManifest.xml文件中添加allowBackup属性,并将其设置为false。该属性属于<application>节点,如下图所示的代码:


65.png


编译并安装应用程序,完成后运行应用程序。


单击“myBackup”按钮,并执行adb shell bmgr run命令来执行一次备份操作,这样操作后看到的日志如下所示:


66.png


如上图所示,我们没有看到任何执行应用程序备份的日志输出,这说明android:allowBackup限制了备份的执行。


2.allowTaskReparenting


android:allowTaskReparenting是任务调整属性,它表明这个任务重新被送到前台的时候,该应用程序所定义的Activity是否可以从被启动的任务中转移到有相同亲和力的任务中。


这个属性的数据类型是布尔型,它的取值只有true和false两种。它不是必须指定的属性,如果我们没有显示指定这个属性,那么它将被指定为默认值false。


<application>和<activity>节点上都有这个属性可以配置。如果将该属性配置在<application>节点上,并且没有在<activity>节点上配置的情况下,<application>节点上的值将会应用到每一个<activity>节点上。反之,如果<activity>节点上配置了这个属性,则以<activity>节点上的值为准。


3.android:killAfterRestore


这个属性是指在一个完整的系统恢复操作之后应用程序是否被终止。单个应用程序的恢复操作不会引起应用程序的终止。完整的系统恢复操作一般仅在手机首次安装时才会发生一次。第三方应用通常都不需要使用该属性。


该属性的默认值为true,意为在完整的系统恢复期间,应用程序在结束处理其数据之后将被终止。


4.android:restoreAnyVersion


它指是否允许恢复任意版本的备份数据来恢复应用程序的数据,即使备份明显来自于当前安装在设备上的应用程序的更新版本。将该属性设置为true,则将允许备份管理器尝试恢复操作,有的时候版本不匹配表明数据是不兼容的,这个时候如果可以恢复到不同版本的数据,那么应用程序将承受很大的风险,所以请谨慎使用此属性


它必须是布尔值,或为true,或为false,默认值为false。


5.android:debuggable


这是一个布尔型标志,它的取值是true或false,这个标志指示应用程序在用户模式的设备上是否可以调试。如果为true,则表示应用程序可以被调试;如果为false,则表示应用程序不可以被调试。它的默认值是false。使用这个标志唯一需要注意的是,它只在用户模式的机器上生效,用户模式既是买着用的android手机,而虚拟机一般都是工程模式。


当你创建一个项目的时候,一般这个属性没有配置,但它有默认值,为false。


要发挥极客精神,就有必要对这个只是深挖,下面就来介绍这个标志是如何生效的。


首先,在安装一个应用程序的APK到设备中时,包管理服务(PackageManagerService)会调用自己的解析器(PackageParser)去解析应用程序的"AndroidManifest.xml"文件,从而形成包信息。它的解析入口函数位于“/frameworks/base/core/java/android/content/pm/PackageParser.java”的parsePackage()方法中,该方法的关键代码如下所示:

public Package parsePackage(File source,String destCodePath,DisplayMetrics metrics,int false){
.......
//打开AndroidManifest.xml文件
parser=assmgr.openXmlResourceParser(cookie,ANDROID_MANIFES_FILENAME);
........
try{
//开始解析AndroidManifest.xml文件
pkg=parserPackage(res,parser,flags,errorText);
}catch(Exception e){
......
}
//返回包信息
return pkg;
}


这里pkg=parserPackage(res,parser,flags,errorText);;负责解析整个AndroidManifest.xml文件。由于android:debuggable是<application>节点的属性之一,这里将通过parseApplication()方法解析整个<application>节点,其中包括自身属性,<service>节点,<activity>节点等的处理。对于android:debuggable属性,它是这样处理的:

private boolean parseApplication(Package owner,Resources res,XmlPullParser parser,AttributeSet attrs,int flags,String[] outError)throws XmlPullParserException,IOException{
final ApplicationInfo ai=owner.applicationInfo;
final String pkgName=owner.applicationInfo.packageName;
.....
if(sa.getBoolean(com.android.internal.R.sytleable.AndroidManifestApplication_debuggable,false)){
ai.flags|=ApplicationInfo.FLAG_DEBUGGABLE;
}
.....
return true;
}


如果将android:debuggable设置为true,就将应用程序信息标志序列的第2位设置为1,这个标志对于应用程序的进程特征起了关键的作用。


最后,当我们试图启动这个应用程序时,这个标志序列中的一些位将转换为参数信息来帮助孵化出应用程序的进程。关键代码如下所示:

/dalvik/vm/native/dalvik_system_Zygote.cpp::enableDebugFeatures(u4 debugFlags)
static void enableDebugFeatures(u4 debugFlags){
......
#iifdef HAVE_ANDROID_OS
IF((debugFlags & DEBUG_ENABLE_DEBUGGER)!=0){
if(prct1(PR_SET_DUMPABLE,1,0,0,0)<0){
.......
}else{
.......
}
}
#endif
.......
}


其中prct1(PR_SET_DUMPABLE,1,0,0,0)设定了进程的可转储属性为1。这样设置之后,这个应用程序的进程就变为“可调试”状态了。


6.android:description


这个属性是描述应用程序的,它是一个用户只读的文本,比应用程序标签android:label的描述更长,更详细。但需要注意的是,这里必须配置为一个字符串资源的引用,不能像应用程序标签那样设置为一个字符串。它没有默认值。


首先,我们要知道为什么Android要给这个限制(这里必须配置为一个字符串资源的引用),下面对比一下Android对android:label和android:description属性的差异:

<attr name="label" format="reference|string"/>
<attr name="description" format="reference"/>


上面两行代码是对这两个属性的定义,其中label的format为reference|string,这表示它支持资源引用和字符串两种格式,而description的format仅为reference,这表示当配置android:description属性时,它只能是一个引用。


7.android:enabled


默认情况下,Android系统会自行实例化每一个应用程序的组件,包括Android四大组件,但如果我们需要自己完成这些事情的话,就需要使用android:enabled属性来限制Android系统的行为。这个属性表明Android系统是否可以被实例化应用程序组件,如果其值为true,则说明应用程序组件可以被Android系统自动实例化;如果为false,则说明实例化组件的工作需要手工完成。该属性的默认值为true。每一个组件都可以单独定义自己的enabled属性。如果这个属性定义在<application>节点中,那么它会默认将每个组件的enabled属性设置为相同的值。如果每一个组件单独定义了这个属性,那么<application>节点上定义的属性对此组件不再生效,就由自己的enabled属性决定。

相关文章
|
4月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
4月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
390 19
|
4月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1065 2
|
7月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
674 83
|
11月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
907 1
|
11月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
595 0
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
477 1
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
446 0
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
204 0