编译 Android 时,iOS 的 Dart 代码会被移除吗?

5
我正在使用Flutter编写适用于iOS和Android平台的应用程序。其中一些功能不同,例如:
if (Platform.isIOS) {
    int onlyForiOS = 10;
    onlyForiOS++;
    print("$onlyForiOS");
}
else if (Platform.isAndroid){
    int onlyForAndroid = 20;
    onlyForAndroid++;
    print("$onlyForAndroid");
}

当我构建Android平台时,iOS的代码是否会被编译到二进制文件中?还是它们只是为了优化而被删除? 出于安全原因,我不希望任何iOS的代码出现在Android的二进制文件中。

我不自称是这方面的专家,但我认为你编译的Android代码也将包含if部分(用于iOS)。 - CopsOnRoad
@CopsOnRoad 那是一种假设吗?我真的希望得到一个确定的答案,因为如果你所说的是真的,我必须采取替代计划来编码。 - RockingDice
你可能会对 https://github.com/dart-lang/sdk/issues/33920 和 https://dev59.com/61QJ5IYBdhLWcg3w66U5 感兴趣。 - jamesdlin
@RockingDice 这是我的假设,Remi 也提到了。 - CopsOnRoad
@jamesdlin 谢谢你提供的链接。它们真的很有帮助。 - RockingDice
1个回答

4
这取决于您要评估的表达式。Dart树摇取决于常量变量。因此,以下内容将被树摇:
const foo = false;
if (foo) {
  // will be removed on release builds
}

但这个例子不会:
final foo = false;
if (foo) {
  // foo is not a const, therefore this if is not tree-shaked
}

现在,如果我们看一下Platform.isAndroid的实现,就会发现它不是常量,而是一个getter。
因此,我们可以推断出if (Platform.isAndroid)不会被tree-shaked。

我认为对于我的情况来说,回答这个问题很清楚,我会找到另一种方法。但是是否进行其他情况的树摇取决于代码。如果您能分享更多关于“Dart树摇基于常量变量”的信息,那就更好了 :) - RockingDice

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