在APK打包之前运行已编译的Java代码

时间:2019-07-13 19:50:29

标签: android android-studio gradle android-gradle

我的应用程序显示了从APK中包含的静态XML文件创建的项目列表。为了加快速度,我的应用在首次加载时会缓存数据的二进制版本。该应用程序在读取缓存的二进制数据而不是XML时,启动速度提高了约300毫秒。

您可以猜到这是怎么回事:构建应用程序时,我想预先计算二进制版本并将其粘贴到assets目录中。我想保留XML加载器,因为用户可以选择其他XML文件并在应用程序中显示它们。因此,我不想将加载程序移到buildSrc中,也不想通过构建单独的项目来依赖构建脚本和应用程序的工作。

我已经成功地将缓存代码作为一个单独的目标运行,但是我不知道在哪个Android生成任务上声明doLast才能使其在常规生成期间发生。

我应该声明哪个任务依赖项,以便在运行构建时就生成依赖项?我已经尝试过preBuildpackageDebugpackageRelease

task writeBinary() {
    doFirst {
        print("Writing binary file")
        javaexec {
            classpath += files("build/intermediates/classes/debug")
            classpath += files("build_libs/xpp3-1.1.4c.jar")
            main = "ehues.tome.loader.BinaryReaderWriter"
            args = ['src/main/assets/standard/my.xml', 'src/main/assets/standard/my.bin']
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这通常是一个有问题的方法;只是不要使用assetsres/raw并由AAPT2自动处理您的资源-而不是尝试重新发明轮子。

重点是assetsres/raw未被处理,仅被复制。

如果您真的想创建二进制格式,可以通过运行aapt2aapt2.exe来完成。 Gradle Exec任务可以运行终端命令-然后可以将该任务添加到图形中:

aapt2 compile path-to-input-files [options] -o output-directory/

但是,提供适当的资源XML格式会使它自己处理所有这些事情。