Android - Kotlin 文件在编译后存在于 apk 中

Posted

技术标签:

【中文标题】Android - Kotlin 文件在编译后存在于 apk 中【英文标题】:Android - Kotlin files are present in apk after compilation 【发布时间】:2018-11-14 21:43:30 【问题描述】:

我有一个包含 java 和 kotlin 文件的 android 项目。

编译后,当我解压生成的apk文件时,我可以在他们的包路径中看到我项目的所有Kotlin文件。 但是 Java 文件不存在。

我该如何解决这个问题,并阻止将 Koltin 文件添加到 apk 中?

谢谢

我的 build.gradle:

构建脚本 ext.kotlin_version = '1.2.71' 存储库 中心() maven url 'https://maven.fabric.io/public' 谷歌() 依赖 类路径'com.android.tools.build:gradle:3.1.3' 类路径“org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version” 应用插件:'com.android.application' 应用插件:'kotlin-android' 应用插件:'kotlin-android-extensions' 应用插件:'kotlin-kapt' 应用插件:'com.google.gms.google-services' 存储库 maven url "https://jitpack.io" mavenCentral() 中心() 平面目录 目录'库' 依赖 实现文件树(目录:'libs',包括:'*.jar') /* 一堆依赖 */ 安卓 compileSdkVersion 27 buildToolsVersion '27.0.3' 默认配置 minSdkVersion 19 targetSdkVersion 27 multiDexEnabled 真 setOutputPath applicationVariants, goevent["outputDir"], goevent["outputName"] setOutputPath testVariants, goevent["outputDir"], goevent["outputNameTest"] 数据绑定 启用 = 真 包装选项 排除“元信息/依赖项” 排除“元信息/许可证” 排除“元信息/通知” 排除“主/AndroidManifest.xml” pickFirst 'META-INF/maven/com.squareup.okio/okio/pom.properties' pickFirst 'META-INF/maven/com.squareup.okio/okio/pom.xml' 源集 主要的 manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['库'] androidTest.setRoot('测试') debug.setRoot('构建类型/调试') release.setRoot('build-types/release') 签名配置 发布 //获取签名文件 文件 signFile = rootProject.file('signing.properties') //读取签名属性文件 属性属性 = 新属性() properties.load(new FileInputStream(signFile)) if (properties['signingKeystorePath'] && properties['signingKeystorePassword'] && properties['signingKeyAlias'] && properties['signingKeyPassword']) 字符串 toolsPath = System.getenv("TOOLS") 如果(工具路径!= null) storeFile 文件(toolsPath + 属性['signingKeystorePath']) storePassword 属性['signingKeystorePassword'] keyAlias 属性['signingKeyAlias'] keyPassword 属性['signingKeyPassword'] 别的 //如果签名文件不存在或者属性没有设置 if (project.hasProperty("signingKeystorePath")) storeFile file("$signingKeystorePath") storePassword 签名KeystorePassword keyAlias 签名KeyAlias keyPassword 签名KeyPassword lintOptions 中止错误错误 构建类型 发布 缩小启用真 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.pro' 签名配置 签名配置.release zipAlignEnabled 真 dex 选项 巨型模式 = 真 def setOutputPath(变量,目录,名称) 变种.all 变种-> variant.outputs.all 输出 -> def relativeRootDir = output.packageApplication.outputDirectory.toPath() .relativize(rootDir.toPath()).toFile() output.outputFileName = new File("$relativeRootDir/$dir", name)

【问题讨论】:

您可以使用 proguard 来混淆您的代码。只需打开它 int build.gradle 文件:android buildTypes release minifyEnabled true ... 请详细解释“我可以看到我所有的 Kotlin 文件”是什么意思。例如,您可能希望显示 APK 分析器的输出或 unzip 或演示您所看到的内容。 @p.alexey Proguard 似乎已正确打开,我可以在构建 apk 时看到一些关于 Proguard 的警告 @CommonsWare 我编辑了我的问题并添加了解压后的 apk 输出截图 这里发生了一些相当奇怪的事情。这不正常。您是否对该模块的 build.gradle 文件进行了重大更改? 【参考方案1】:

终于找到问题了:

我不得不从源集中删除resources.srcDirs = ['src']

这是复制 src 文件夹下包含的所有非 java 文件

【讨论】:

以上是关于Android - Kotlin 文件在编译后存在于 apk 中的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin NullPointer Exception Android [关闭]

在 Kotlin Android 中将值传递给函数时进行编译时间检查

错误记录记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )

Android开发基础——Kotlin简介

Android 编译优化探索3

Kotlin基础初探