android 动态切换aar_Android应用开发之动态更改AndroidManifest.xml中节点属性操作教程...

本文将带你了解Android应用开发之动态更改AndroidManifest.xml中节点属性操作教程,希望本文对大家学Android有所帮助。

在Android使用Gradle进行编译打包时,有时候需要动态更改AndroidManifest.xml中application、activity等节点属性,大多数情况下一般通过占位符替换即可完成相应的功能,但存在一些比较复杂的情况,如果还是采用占位符替换,显得就不再方便或者不能达到所想要的目的。下面我将介绍另一种通过Groovy动态更改AndroidManifest.xml节点属性的方法。

先说一下我遇到的问题,我的问题是我想打两种不同的aar包,给不同应用使用,其中一个需要包用来跨进程使用,因此需要给AndroidManifest中的一些activity、service等增加android:process属性,正常情况下肯定不能打包的时候手动修改增加改属性,所以希望通过控制开关或者属性来动态控制打包结果。这里如果使用占位符的方式来做,就需要在所有需要多进程的activity或者service等中都需要添加android:process属性,这不方便阅读和后续版本开发,因为如果这样去做,开发的时候都需要注意添加这个属性,觉得很不方便,类似这样的需求还有例如替换theme等等。面对这样的需求如果能够在打包编译的时候动态替换那就即可以完成需求又能解决后续开发存在的问题。

通过参考网上的一些资料和gradle编译过程,了解到在打包生成变体时会在processManifest时生成一个缓存AndroidManifest.xml文件,然后打包时使用的manifest文件就是该文件,因此在该task执行完成之后通过解析改XML文件,然后动态添加和替换属性即可。代码如下:

?12345678910111213141516171819202122232425262728293031android.getLibraryVariants().all   { variant ->    variant.outputs.each()   {        //single_process   用于控制独立进程开关        it.processManifest.doLast   { task   ->            if(project.hasProperty("single_process")   &&   project.property("single_process").equals("2")){                //受gradle版本影响,AndroidManifest.xml文件位置有所不同                def   manifestFile = new File("${buildDir}/intermediates/bundles/${it.dirName}/AndroidManifest.xml")                if(!manifestFile.exists()){                    def   dir=''                    it.baseName.split('-').each   {                        dir=dir+it+'/'                    }                    manifestFile=new   File("${buildDir}/intermediates/manifests/full/${dir}AndroidManifest.xml")                }                def   XmlParser = new   XmlParser()                def   manifest =   XmlParser.parse(manifestFile)                def   processTag =   "android:process"                def   android = new Namespace('http://schemas.android.com/apk/res/android',   'android')                def   nodes=manifest.application[0].'*'.findAll{                    (it.name()=='activity'||it.name()=='service')&&it.attribute(android.process)==null   //选择要修改的节点                }                nodes.each{                    it.attributes().put(processTag,":wallet_sdk")                }                PrintWriter   pw = new   PrintWriter(manifestFile)                pw.write(groovy.xml.XmlUtil.serialize(manifest))                pw.close()            }        }    }}

值得注意的是,受gradle版本问题,所以打aar包时manifest的文件位置存在不一致,我曾测试使用3.1.2的代码放到2.2中发现找不到manifest文件,同时it.dirName属性(product   flavor输出目录)也在3.1.2中获取为空值。如果是想对打包APK时进行替换,AndroidManifest.xml都能在intermediates/manifests/full目录下找到,需要修改的是因plugin不同对应的variant不一样,将getLibraryVariants()替换成applicationVariants,如下:

?1234567android.applicationVariants.all { variant   -> variant.outputs.each() {  it.processManifest.doLast {   task ->//manifest操作  } }}

关于Groovy对XML更多的操作,可查看相关文档。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANSYS Workbench对称建模

ANSYS Workbench对称建模 (使用版本为ANSYS 2020R2) 一、循环对称建模 1、建立三维模型。拖出一个静力学分析模块,材料保持系统默认,在Design Modeler中建立圆盘的1/4模型。外圆半径20m,内圆半径10m,厚度5m…

毕业论文排版之Word 中公式居中,编号靠右该怎么设置(针对左右不对称页边距)

首先感谢博主这篇,大家基本可以参照这个: http://t.csdn.cn/s0FY7; http://t.csdn.cn/FjmbH; 但是由于博主的是规规整整的页面边距,一篇为上下左右均为2cm,另一篇上下2.54cm左右3.18cm。ps:如果你为以上的页…

python opencv报错_OpenCV in Python 入门问题,python报错 -问答-阿里云开发者社区-阿里云...

OpenCV是Intel开源计算机视觉库。它由一系列 C 函数和少量 C 类构成,实现了图像处理和计算机视觉方面的很多通用算法。在这篇文章(译自 http://glowingpython.blogspot.com/2011/10/beginning-with-opencv-in-python.html) 中将介绍如何使用 Python 版的 OpenCV。 下…

workbench出现“Unable to start the geometry editor”

今天上午打开workbench遇到这个“Unable to start the geometry editor”问题,但是重启软件还是没用,所以网上找了下。 方法1、来源百度——大向日葵爱太阳: 我刚出现这样的问题,解答办法是将你安装主程序下的破解文件的路径改一…

ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

点击上方“早起Python”,关注并“星标”每日接收Python干货!本文含 3321 字,9代码片段建议阅读 8 分钟前言 在我们写爬虫的过程中,目标网站常见的干扰手段就是设置验证码等,本就将基于Selenium实战讲解如何处理弹窗和验…

如何写计算机会议的rebuttal

其实最好的教材就是实例,恰好NIPS会议会把往年所有论文的Rebuttal都贴出来。。。,见这里:http://papers.nips.cc/ 同时,圈内同行也总结了不少经验,下面转帖其他人的经验 如下转自:http://qiyuhua.github.io…

一建机电实务教材电子版_20年一建其实并不难,官方出版:复习题集(精修),速做速提90分...

20年一建其实并不难,官方出版:复习题集(精修),速做速提90分一建法规管理经济建筑市政机电水利等根据《一-级建造师执业资格考试大纲》(2018 年版) 和《2020年版全国一级建造师执业资格考试用书》,组织全国著…

C#在dataGridView中遍历,寻找相同的数据并定位

1、 C#在dataGridView中遍历&#xff0c;寻找相同的数据并定位 [c-sharp] view plain copy int row dataGridView1.Rows.Count;//得到总行数 int celldataGridView1.Rows[1].Cells.Count;//得到总列数 for (int i 0; i < row; i)//得到总行数并在之内循环 { for (int j 0…

pcb板子开窗_PCB 层定义

PCB 层定义在EDA软件的专门术语中&#xff0c;有很多不是有相同定义的。以下就字面上可能的意义来解释。 Mechnical: 一般多指板型机械加工尺寸标注层 。Keepoutlayer: 定义不能走线、打穿孔(via)或摆零件的区域。这几个限制可以独立分开定义。 Topoverlay: 无法从字面得知其意…

上的img表示什么_方向盘上的SET、RES和CNL,表示什么意思?别弄错了

很多人买车都希望能买到一款称心如意的车型&#xff0c;包括价格、配置、性能以及质量都符合自己的需求。当然&#xff0c;不管是什么东西都不可能做到完美&#xff0c;就拿汽车来说&#xff0c;即便是几百万上千万的豪车也是有缺点的&#xff0c;更何况普通的十几万的家用车。…

Mysql编辑工具中使用(Navicat查询结果显示行号)

Mysql编辑工具中使用(Navicat查询结果显示行号) select rownum:rownum1 as rownum,a.roleId from base_userroles a,(select rownum:0) t where a.roleIdadmin; 转载于:https://www.cnblogs.com/xrhou12326/p/5345522.html

python的web可视化_Python的Web可视化框架Dash(8)---核心组件

本节介绍Dash应用的常用核心组件&#xff0c;导入本节用到的所有包import pandas as pdimport plotly.graph_objs as goimport dashimport dash_core_components as dcc # 交互式组件import dash_html_components as html # 代码转htmlfrom dash.dependencies import Input, Ou…

【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析

作者 : 韩曙亮转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083一. 相关方法简单介绍1. 状态保存方法演示样例package com.example.octopus_saveinstance;import android.app.Activity; import android.os.Bundle;public class MainActivity exten…

python 机器视觉测量_用Opencv python实现精密测量

实际上&#xff0c;我正在使用OpenCV和Python开发一个机器视觉项目。目标&#xff1a;项目的目标是以高精度测量组件的尺寸。主要硬件&#xff1a;巴斯勒5MP照相机(aca-2500-14gm)一个红色背光灯(100毫米x 100毫米)(我的组件大小约为60毫米)实验因为我正在考虑非常严格的公差限…

ireport 循环_ireport5.6.0分组显示

一&#xff0c;ireport中分组二&#xff0c;java调用实现分组一&#xff0c;ireport中分组&#xff1a;1&#xff0c;新建模板文件&#xff0c;纸张随意&#xff0c;名称随意&#xff0c;路径随意2&#xff0c;连接要分组的数据源3&#xff0c;添加测试表和数据CREATE TABLEyan…

数学题 HDOJ——2086 简单归纳

哎 真的是懒得动脑子还是怎么滴。。。 题目如下 Problem Description有如下方程&#xff1a;Ai (Ai-1 Ai1)/2 - Ci (i 1, 2, 3, .... n).若给出A0, An1, 和 C1, C2, .....Cn.请编程计算A1 ?参考网上题解。。。因为&#xff1a;Ai(Ai-1Ai1)/2 - Ci, A1(A0 A2 )/2 - C1;A2…

python正则匹配html标签_Python正则获取、过滤或者替换HTML标签的方法

本文实例介绍了Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法&#xff0c;具体内容如下python正则表达式关键内容:python正则表达式转义符:. 匹配除换行符以外的任意字符\w 匹配字母或数字或下划线或汉字\s 匹配任意的空白符\d 匹配数字\b 匹配单词的开始或结…

海选女主角

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40591 Accepted Submission(s): 18214 Problem Descriptionpotato老师尽管非常喜欢教书&#xff0c;可是迫于生活压力。不得不想办法在业余时间挣点外快以养家糊…

python图片保存为txt文件_python + opencv实现提取png图像的像素信息并存储到txt文件中(附安装指导)...

相关库安装指导&#xff1a;这里我们需要 opencv_python&#xff0c;numpy&#xff0c;matplotlib库&#xff0c;另外我用的是python3.6.1版本。一般库大家都是用pip install命令安装的&#xff0c;不过不知道为啥这里的opencv_python库总是抽风&#xff0c;就是安装不了(起码我…

最大联通子数组的和

最大联通子数组的和 在几次“迭代”开发数组的项目之后老师又布置了这个“联通数组”的任务&#xff0c;当然&#xff0c;此次任务依旧是“结对编程”&#xff0c;要求如下&#xff1a; 1、题目&#xff1a;返回一个二维数整数组中最大联通子数组的和&#xff1b; 2、数组中有正…