创新5 1声卡驱动下载-联想官网软件下载
2023年4月3日发(作者:helio x30)
通过gradle动态修改⽂件
前⾔
在Android使⽤Gradle进⾏编译打包时,有时候需要动态更改中application、activity、meta-data等节点属性,⼤多数
情况下⼀般通过productFlavors占位符替换即可完成相应的功能,但存在⼀些⽐较复杂的情况,⽐如说引⽤了⼀些第三⽅aar或者sdk,⾥⾯的⼀
些节点属性我们不需要、或者是需要采⽤占位符替换,显得就不再⽅便或者不能达到所想要的⽬的。下⾯介绍另⼀种通过Groovy动态更改
节点属性的⽅法。
通过Gradle动态修改Manifest⽂件
1、在项⽬配置结束的task中,找到⽣成Release的manifest的task
2、通过该task找到输出的manifest⽂件并读取⽂本内容
3、使⽤Groovy的XmlApi对manifest进⾏修改
4、修改后重新写,输出⾄原始⽬录
例如:在release包manifest中动态添加标签为meta-data的渠道号channel
android:value=“yingyongbao"/>
引⽤第三⽅sdk⾥⾯有⼀些多申请的权限,我们也可以在这边直接剔除掉,这⾥选择的切⼊点在processResources的任务执⾏之前,代码如
下:
{variant->
{output->
t{pm->
StringmanifestPath=stFile
println"=====testmanifestPath=====$manifestPath"
defmanifestContent=file(manifestPath).getText()
manifestContent=e('
defxml=newXmlParser().parseText(manifestContent)
println"=====testxml=====$xml"
ation[0].appendNode("meta-data",['android:name':'channel','android:value':'yingyongbao'])
defserialize=ize(xml)
file(manifestPath).write(serialize)
defoutputFile=File
if(outputFile!=null&&th(".apk")){
deffileName="Android_"
FileName=fileName
}
}
}
}
另外⼀种写法,在这⾥我们直接找到build⾥⾯manifest的具体路径,⼜不不同gradle的版本不⼀样,manifest的位置会有所区别,具体写法如
下:
{variant->
StringvariantName=lize()
defprocessManifestTask=ame("process${variantName}Manifest")
println"=====testprocessManifestTask=====$processManifestTask"
{pmt->
defmanifestPath=newFile("${buildDir}/intermediates/bundle_manifest/${e}/process${e}Manifest/bundle-manifest/")
println"=====testmanifestPath=====$manifestPath"
defmanifest=file(manifestPath).getText()
.replaceAll('
defxml=newXmlParser().parseText(manifest)
println"=====testxml=====$xml"
ation[0].appendNode("meta-data",['android:name':'channel','android:value':'yingyongbao'])
defserialize=ize(xml)
file(manifestPath).write(serialize)
defoutputFile=File
if(outputFile!=null&&th(".apk")){
deffileName="Android_"
FileName=fileName
}
}
}
//有些版本的gradle的manifest路径在这下⾯
//defmanifestPath="${buildDir}/intermediates/manifests/full/${e}/"
这⾥我们就处理掉项⽬中的BLUETOOTH权限,前提是项⽬中没有使⽤到蓝⽛权限,并且我们还在manifest⾥⾯添加了⼀个meta-data,包含了
渠道。
补充
由于在gradle3.3版本
processResources
提⽰已过期,这⾥我们根据系统提⽰使⽤了⼀种新的⽅式,代码如下:
{variant->
{output->
ManifestProcessorTaskprocessorTask=ull()
{ManifestProcessorTasktask->
defdirectory=dleManifestOutputDirectory()
println"=====testdirectory=====$directory"
defmanifestPath="$directory/"
println"=====testmanifestPath=====$manifestPath"
defmanifestContent=file(manifestPath).getText()
println"=====testmanifestContent=====$manifestContent"
manifestContent=e('
defxml=newXmlParser().parseText(manifestContent)
println"=====testxml=====$xml"
ation[0].appendNode("meta-data",['android:name':'channel','android:value':'yingyongbao'])
defserialize=ize(xml)
file(manifestPath).write(serialize)
defoutputFile=File
if(outputFile!=null&&th(".apk")){
deffileName="Android_"
FileName=fileName
}
}
}
}
更多推荐
manifest文件
发布评论