Topwo博客
首页
博客
项目
您现在的位置是:
Topwo博客
>>
Android
文章
缓存ndk编译生成文件的方法
发布时间:2021-11-25
作者:Topwo
来源:原创
点击:326
ndkBuildHelper.gradle ```groovy import java.security.MessageDigest; println "开始配置${buildscript.sourceFile.getName()}" // 计算文件md5 def calcFileMD5(File file) { MessageDigest digest = MessageDigest.getInstance("MD5"); file.eachByte 4096, {bytes, size -> digest.update(bytes, 0, size); } return new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0'); } def curApplicationMkMd5 = calcFileMD5(new File("${projectDir}/jni/Application.mk")); if(!file("${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/Application.mk").exists() || curApplicationMkMd5 != calcFileMD5(new File("${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/Application.mk"))){ println "开始备份[${projectDir}/jni/Application.mk]到[${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/Application.mk]" copy { from "${projectDir}/jni/Application.mk" into "${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild" } println "备份Application.mk完成" } android { buildTypes { debug { externalNativeBuild { if (PROP_BUILD_TYPE == 'ndk-build') { ndkBuild { arguments "NDK_APPLICATION_MK=${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/Application.mk" arguments "NDK_OUT=${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/debug/obj" } } } } release { externalNativeBuild { if (PROP_BUILD_TYPE == 'ndk-build') { ndkBuild { arguments "NDK_APPLICATION_MK=${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/Application.mk" arguments "NDK_OUT=${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/release/obj" } } } } } } project.tasks.create("copyNdkBuildDebugObj").doLast { println "开始拷贝NDK_OUT指定的编译生成文件到[${projectDir}/build/intermediates/ndkBuild/debug/obj]" copy { from "${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/debug/obj" into "${projectDir}/build/intermediates/ndkBuild/debug/obj" include '**/*.so' include '**/*.a' include '**/*.o' } println "Debug编译生成文件拷贝完成" } project.tasks.create("copyNdkBuildReleaseObj").doLast { println "开始拷贝NDK_OUT指定的编译生成文件到[${projectDir}/build/intermediates/ndkBuild/release/obj]" copy { from "${buildscript.sourceFile.getParent()}/${curApplicationMkMd5}.ndkBuild/release/obj" into "${projectDir}/build/intermediates/ndkBuild/release/obj" include '**/*.so' include '**/*.a' include '**/*.o' } println "Release编译生成文件拷贝完成" } afterEvaluate { // if(file("${rootDir}/app/jni/Application.mk").exists()){ // File oldMkFile = new File("${rootDir}/app/jni/Application.mk"); // oldMkFile.deleteDir(); // } // projectDir.renameTo("${projectDir}/../${curApplicationMkMd5}"); // 1. 找到需要依赖自己 Task的构建流程的Task def externalNativeBuildDebugTask = tasks.findByName("externalNativeBuildDebug") if(externalNativeBuildDebugTask){ println "externalNativeBuildDebugTask=$externalNativeBuildDebugTask" // 2. 通过 finalizedBy 方法,插入到指定Task之后 externalNativeBuildDebugTask.finalizedBy(copyNdkBuildDebugObj) // 3. 通过 dependsOn 方法,插入到指定Task之之前 // externalNativeBuildDebugTask.dependsOn(taskName) } // 1. 找到需要依赖自己 Task的构建流程的Task def externalNativeBuildReleaseTask = tasks.findByName("externalNativeBuildRelease") if(externalNativeBuildReleaseTask){ println "externalNativeBuildReleaseTask=$externalNativeBuildReleaseTask" // 2. 通过 finalizedBy 方法,插入到指定Task之后 externalNativeBuildReleaseTask.finalizedBy(copyNdkBuildReleaseObj) // 3. 通过 dependsOn 方法,插入到指定Task之之前 // externalNativeBuildDebugTask.dependsOn(taskName) } } println "${buildscript.sourceFile.getName()}配置完成" ``` 在项目的build.gradle引用 ```groovy apply from: file('../../ndkbuildout/ndkBuildHelper.gradle') ```
上一篇:
adb命令
下一篇:
Android打包流程Gradle Plugin 主要 Task 分析