背景
由于项目需求,需要在打出apk包前读取assets目录下的文件,以及修改打出的apk包的AndroidManifest.xml文件的权限
过程
- 新建一个library模块,改写build.gradle
apply plugin: 'groovy'
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
resources {
srcDir 'src/main/resources'
}
}
}
dependencies {
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
implementation "com.android.tools.build:gradle:4.0.2"
}
- 新建一个groovy类,继承org.gradle.api.Plugin类
class MyPlugin implements Plugin<Project> {
private List variantNames = new ArrayList()
void apply(Project project) {
getAllVariantManifestTask(project)
MyTaskUtil.config(project, variantNames)
}
//获取所有的构建变体名称
void getAllVariantManifestTask(Project project) {
project.extensions.findByType(AppExtension.class)
.variantFilter {
variantNames.add(it.name)
}
}
}
- 配置自定义task,动态添加AndroidManifest.xml的android.permission.REQUEST_INSTALL_PACKAGES权限及读取assets目录
class MyTaskUtil{
static boolean canProcessManifest = false
static void config(Project project, List variantNames) {
//在项目配置完成后,添加自定义Task
project.afterEvaluate {
variantNames.each {
try {
def variantName = it.capitalize()
Task mergeAssetsTask = project.getTasks().getByName(String.format("merge%sAssets", variantName))
CheckAssetsTask assetsTask = project.getTasks().create(String.format("CheckAssets%sTask", variantName), CheckAssetsTask)
assetsTask.setMergeAssetsTask(mergeAssetsTask)
executeAddPermissionToManifestTask(project, variantName)
}catch(Exception e1){
PrintUtil.print("handle assets---error:" + e1)
}
}
}
}
static void executeAddPermissionToManifestTask(Project project, String variantName){
try {
def mergeResourcesTask = project.getTasks().getByName(String.format("merge%sResources", variantName))
File mainManifestFile = new File(project.buildDir, "/intermediates/merged_manifests/" + variantName.uncapitalize() + "/AndroidManifest.xml")
mergeResourcesTask.doLast {
def root = new XmlParser().parseText(mainManifestFile.text)
root.appendNode("uses-permission", ["xmlns:android": "http://schemas.android.com/apk/res/android", "android:name" : "android.permission.REQUEST_INSTALL_PACKAGES"])
def updateXmlContent = XmlUtil.serialize(root)
mainManifestFile.write(updateXmlContent)
}
}catch(Exception e){
}
}
}
- 自定义task,读取assets目录
class CheckAssetsTask extends DefaultTask {
Task mergeAssetsTask
@TaskAction
void run(){
def outputs = mergeAssetsTask.getOutputs()
def files = outputs.files.getFiles()
files.find{
def childFile = it.listFiles()
childFile.find{
if (it.toString().contains("xxx")){
//可读取到合并后的assets的某个文件
}
}
}
}
void setMergeAssetsTask(Task task){
mergeAssetsTask = task
}
}