美文网首页
Android编译期动态添加assets

Android编译期动态添加assets

作者: 风云不羁 | 来源:发表于2022-08-18 14:31 被阅读0次

背景

开发过程中会有这样一种需求:app需要从远程获取部分前置资源(比如接口配置信息)。通常做法是打包前手动内置到assets中,但这种方式比较低效,今天我们就来讨论一种自动化的过程

自定义Gradle插件获取远程资源并配置到sourceSets中

class PreloadAssetsPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        // 判断是否为主工程
        if (target.plugins.hasPlugin("com.android.application")) {
            val pathSeparator = File.separator
            // 自定义asset目录
            val tmpAssetDir = "${target.rootDir}${pathSeparator}tmpasset${pathSeparator}PreloadPlugin${pathSeparator}assets"
            val assetDir = File(tmpAssetDir)
            println(tmpAssetDir)
            // 执行网络请求,获取预加载信息
            if (!assetDir.exists()) {
                assetDir.mkdirs()
            }

            // 缓存文件
            val cacheFile = File(tmpAssetDir, "app_service_api.json")

            // 执行网络请求
            val okHttpClient = OkHttpClient()
            val request = Request.Builder().url("https://api.uomg.com/api/rand.qinghua?format=json")
                .get().build()

            val response = okHttpClient.newCall(request).execute().body?.string()

            // 写入缓存文件
            FileUtils.writeStringToFile(cacheFile, response, "utf-8")

            target.afterEvaluate { project ->
                val android = project.extensions.getByName("android") as AppExtension
                val mainSourceSet = android.sourceSets.getByName("main")
                // 动态添加asset目录
                mainSourceSet.assets.srcDirs(tmpAssetDir)
                println("source assets = ${mainSourceSet.assets.srcDirs}")
            }
        } else {
            throw IllegalStateException("只能在主工程模块中使用资源预加载插件!")
        }
    }
}

使用

应用了该插件build之后,会在项目跟目录生成我们指定的assets目录以及文件


9D9EF183-29A7-4860-A7D4-8AA04EFDF775.png

最终也会打包到app里


2EF39414-FE1A-440d-888A-0B2E976CE8EC.png

最后

上面的demo只是一个思路,最终形态还有需要完善的地方:

  • 临时目录需要配置ignore,避免污染项目代码
  • 文件缓存的策略?每次都需要下载?

相关文章

  • Android编译期动态添加assets

    背景 开发过程中会有这样一种需求:app需要从远程获取部分前置资源(比如接口配置信息)。通常做法是打包前手动内置到...

  • Assets

    Android项目在编译时,Assets下文件不被编译。Assets下的文件除了 html文件可以直接在项目中使用...

  • Android Studio 添加Assets目录

    Android Studio 添加Assets目录: folder and navigate to the Ass...

  • Android Studio下添加assets目录

    在Android Studio中添加assets目录,目录的位置在 XXX\src\main\assets XXX...

  • Android Studio常见操作

    一、 添加assets文件夹 Let Android Studio do it for you.In Androi...

  • 01__JVM(3)线程共享区

    JVM(3)线程共享区 方法区 类信息 常量 静态变量 及时编译期编译后的代码(运行时编译的 如:动态代理添加的)...

  • 百度地图

    1.权限 2.添加assets 3.初始化___在清单文件中添加--------android:name=".Ba...

  • Flutter动态化探索

    前言 Flutter的动态化,对于Android而言,一个很清晰的思路就是动态替换flutter_assets的所...

  • android JNI 报错:error: undefined

    编译报错 报错原因:jnigraphics库没有动态链接 解决 Cmake编译解决添加动态链接库 jnigraph...

  • Android 编译到运行APK过程总结

    APK编译过程 Android通过AAPT工具将.xml资源文件编译成R.java的二进制文件,除了assets、...

网友评论

      本文标题:Android编译期动态添加assets

      本文链接:https://www.haomeiwen.com/subject/rwlugrtx.html