Kotlin多平台库支持iOS位码。

11

我们使用Kotlin来在Android和iOS之间共享一个库。

我们已经准备好了所有的东西,但是在iOS端我需要启用Bitcode。经过一番研究,我找到了解决方案:

kotlin {
targets {
    fromPreset(presets.jvm, 'jvm') {
        mavenPublication {
            artifactId = 'my-lib-name'
        }
    }
    // Switch here to presets.iosArm64 to build library for iPhone device || iosX64 for emulator
    fromPreset(presets.iosArm64, 'iOS') {
        compilations.main.outputKinds('FRAMEWORK')
        compilations.main.extraOpts '-Xembed-bitcode' // for release binaries
        compilations.main.extraOpts '-Xembed-bitcode-marker'//  for debug binaries
    }
  }
}

现在的问题是,我是否拥有并且如果有,如何区分发布版本和调试版本的二进制文件以及特定的标志?我可以简单地添加两个标志而没有任何缺点吗?

也许有人可以启发我,谢谢。

3个回答

10

自Kotlin 1.3.20版本起,iOS框架的位码嵌入功能已经可以直接使用。如果需要,您还可以手动配置嵌入功能:

kotlin {
    iosArm64("ios") {
        binaries {
            framework {
                // The following embedding modes are available:
                //   - "marker"  - Embed placeholder LLVM IR data as a marker.
                //                 Has the same effect as '-Xembed-bitcode-marker.'
                //   - "bitcode" - Embed LLVM IR bitcode as data.
                //                 Has the same effect as the '-Xembed-bitcode'.
                //   - "disable" - Don't embed LLVM IR bitcode.
                embedBitcode("marker")
            }
        }
    }
}

我如何在1.3.20中使用Groovy禁用位码生成? - Pavel

5

目前,同一iOS目标的所有二进制链接任务共享编译器和链接器选项,因此无法单独为它们设置选项。请关注KT-26887以获取更新。

如果您可以负担运行几个具有不同选项的构建,则可以有条件地设置选项并使用标志运行构建:

compilations.main.outputKinds('FRAMEWORK')

if (project.findProperty("releaseFramework") == "true")
    compilations.main.extraOpts '-Xembed-bitcode' // for release binaries
else
    compilations.main.extraOpts '-Xembed-bitcode-marker'//  for debug binaries

然后分别使用带有或不带有标志的方式运行构建:

./gradlew linkDebugFrameworkIOS

并且

./gradlew linkReleaseFrameworkIOS -PreleaseFramework=true

0

我只想在实际需要时使用Bitcode。Xcode传递了一个环境变量ENABLE_BITCODE,我们可以使用它来有条件地嵌入Bitcode。

kotlin {
  iosArm64("ios") {
    binaries {
      framework {
        embedBitcode("YES".equals(System.getenv("ENABLE_BITCODE")) ? "bitcode" : "marker")
      }
    }
  }
}

这并不完全正确,Xcode会为调试和发布版本都设置ENABLE_BITCODE,你应该只在发布版本中使用bitcode,因为它会减慢编译过程,并在调试版本中使用mark。如果ENABLE_BITCODE是false(或不存在),则应改用disable - JP Illanes
你可以使用环境变量 CONFIGURATION 来判断是调试版还是发布版构建。 - JP Illanes
默认情况下,CONFIGURATION 有两个可能的值,即“Debug”或“Release”,但您可以通过Xcode添加更多配置,请检查您的项目配置... - JP Illanes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接