适用于iOS的Kotlin Multiplatform库,带位码

时间:2018-11-28 20:13:14

标签: ios kotlin ios-frameworks bitcode kotlin-multiplatform

我们使用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 个答案:

答案 0 :(得分:3)

当前,同一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

答案 1 :(得分:2)

自从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")
            }
        }
    }
}

答案 2 :(得分:0)

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

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