Skip to content

构建和发布为Android应用

https://flutter.cn/docs/deployment/android#reviewing-the-build-configuration

构建一个 APK

最近,Flutter 团队收到了很多开发者的 报告,表示他们在 Android 6.0 的某些设备上遇到了应用崩溃的情况。
如果你的目标 API 等级是 Android 6.0,请参考以下步骤:

如果以 APK 构建发布,需要确保清单文件 android/app/src/AndroidManifest.xml<application> 标签里不包含 android:extractNativeLibs=false。

使用如下命令:

输入命令 cd [project]

运行 flutter build apk --split-per-abi(flutter build 默认带有 --release 参数。)

这个命令会生成如下三个 APK 文件

[project]/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
[project]/build/app/outputs/apk/release/app-arm64-v8a-release.apk
[project]/build/app/outputs/apk/release/app-x86_64-release.apk

如果移除 --split-per-abi 将会生成一个包含 所有 目标 ABI 的 fat APK 文件。
这种 APK 文件将会在比单独构建的 APK 文件尺寸要大,会导致用户下载一些不适用于其设备架构的二进制文件。

一般安卓手机(例如小米手机)的话需要安装 app-arm64-v8a-release.apk 这个文件

如果安装错误的安装包,会报 "安装失败(-113)" 该安装包与您的系统不兼容

修改图标

https://juejin.cn/post/7220688635142455356

https://icon.wuruihong.com/

踩坑1

出现错误:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
flutter build apk --split-per-abi

Exception in thread "main" java.net.SocketException: Connection refused (Connection refused)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:431)
        at java.base/java.net.Socket.connect(Socket.java:609)
        at java.base/java.net.Socket.connect(Socket.java:558)
        at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
        at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:266)
        at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:373)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:212)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1208)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:189)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1592)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520)
        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)
        at org.gradle.wrapper.Download.downloadInternal(Download.java:58)
        at org.gradle.wrapper.Download.download(Download.java:44)
        at org.gradle.wrapper.Install$1.call(Install.java:61)
        at org.gradle.wrapper.Install$1.call(Install.java:48)
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
        at org.gradle.wrapper.Install.createDist(Install.java:48)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
Running Gradle task 'assembleRelease'...                         1,336ms
Gradle task assembleRelease failed with exit code 1

解决方案:

找到 android/gradle/wrapper/gradle-wrapper.properties

1
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

可以看到 distributionUrl 的配置,可以手动下载下来

复制到 android/gradle/wrapper 路径下

然后修改 gradle-wrapper.properties 中的 distributionUrl

1
distributionUrl=gradle-7.5-all.zip

没成功

然后还是考虑网络问题

修改网络代理

重试

踩坑2

1
2
3
4
5
e: /Users/nocilantro/Desktop/net_proxy_learn/build/installed_apps/.transforms/c0091dd916bb46b0b8d2acb7ed238f98/transformed/out/jars/classes.jar!/META-INF/installed_apps_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.
e: /Users/nocilantro/.gradle/caches/transforms-3/9437a9c9bec960b72b20ef55b63552bc/transformed/core-1.10.1/jars/classes.jar!/META-INF/core_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
e: /Users/nocilantro/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.22/d6c44cd08d8f3f9bece8101216dbe6553365c6e3/kotlin-stdlib-1.9.22.jar!/META-INF/kotlin-stdlib.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.
e: /Users/nocilantro/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.22/d6c44cd08d8f3f9bece8101216dbe6553365c6e3/kotlin-stdlib-1.9.22.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.
e: /Users/nocilantro/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.22/d6c44cd08d8f3f9bece8101216dbe6553365c6e3/kotlin-stdlib-1.9.22.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.6.0.

https://kotlinlang.org/docs/releases.html#release-details

https://stackoverflow.com/questions/67448034/module-was-compiled-with-an-incompatible-version-of-kotlin-the-binary-version

https://services.gradle.org/distributions/

https://developer.android.com/studio/releases/gradle-plugin?hl=zh-cn#updating-gradle

https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google

1
2
3
4
5
6
7
rm -rf ~/.gradle/caches

# 回到项目目录下
rm -rf android/.gradle

flutter build apk --release
cp build/app/outputs/flutter-apk/app-release.apk ~/Desktop/test12291806.apk

没解决

应该影响不大,之后再考虑修。。

踩坑3

app 闪退

https://surest.cn/archives/229/

jarsigner

报错:

1
2
3
jarsigner
# The operation couldn’t be completed. Unable to locate a Java Runtime that supports jarsigner.
# Please visit http://www.java.com for information on installing Java.

修复:
https://stackoverflow.com/questions/71059252/mac-the-operation-couldn-t-be-completed-unable-to-locate-a-java-runtime-that-su

1
2
3
4
5
6
7
8
jarsigner -verify -verbose -certs test12281200.apk
# jar 已验证。

# 警告:
# 此 jar 包含其证书链无效的条目。原因: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
# 此 jar 包含其签名者证书为自签名证书的条目。
# 此 jar 包含的签名没有时间戳。如果没有时间戳, 则在其中任一签名者证书到期 (最早为 2051-05-14) 之后, 用户可能无法验证此 jar。
# POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature.

macos 构建(不成功,忽略)

https://flutter.cn/docs/deployment/macos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
# https://gems.ruby-china.com/ added to sources
# https://rubygems.org/ removed from sources
gem sources -l
# *** CURRENT SOURCES ***

# https://gems.ruby-china.com/

# sudo gem install cocoapods -V  
sudo gem install cocoapods

报错:

1
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin22 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT    -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -DUSE_FFI_CLOSURE_ALLOC conftest.c  -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib -L. -L/AppleInternal/Library/BuildRoots/d9889869-120b-11ee-b796-7a03568b17ac/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.5.Internal.sdk/usr/local/lib     -lruby.2.6   "

解决:

1
2
3
4
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
ls 
# ruby               ruby.h             universal-darwin23
sudo ln -sf universal-darwin23 universal-darwin22

再次重试:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo gem install cocoapods
# ERROR:  Error installing cocoapods:
#         The last version of drb (>= 0) to support your Ruby & RubyGems was 2.0.5. Try installing it with `gem install drb -v 2.0.5` and then running the current command again
#         drb requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210.
sudo gem install drb -v 2.0.5
sudo gem install cocoapods
# The last version of activesupport (>= 5.0, < 8) to support your Ruby & RubyGems was 6.1.7.6. Try installing it with `gem install activesupport -v 6.1.7.6` and then running the current command again
#         activesupport requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210.
sudo gem install activesupport -v 6.1.7.6
sudo gem install cocoapods

https://flutter.cn/docs/deployment/macos

创建 p8 密钥文件:
https://doc.yunxin.163.com/messaging/docs/TUwMDE2NDc?platform=iOS

1
2
3
flutter build macos --release
# Try running:
#   sudo chown -R $(whoami) /Users/nocilantro/Desktop/net_proxy_learn/build/macos/Build/Products/Release/.last_build_id

设置 macos/Runner.xcodeproj/project.pbxproj 中的 ENABLE_USER_SCRIPT_SANDBOXING 为 NO

1
2
flutter build macos --release
# warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'Flutter Assemble' from project 'Runner')
1
2
# zsh: command not found: keychain
brew install keychain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mkdir mac_app_key
cd mac_app_key
ssh-keygen -t rsa -b 2048 -m PEM -f cert_key -q -N ""

ls
# cert_key     cert_key.pub

pip install codemagic-cli-tools

export APP_STORE_CONNECT_ISSUER_ID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
export APP_STORE_CONNECT_KEY_IDENTIFIER=ABC1234567

app-store-connect create-certificate \
    --type MAC_INSTALLER_DISTRIBUTION \
    --certificate-key=@file:/Users/nocilantro/mac_app_key/cert_key \
    --save
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
APP_NAME=$(find $(pwd) -name "*.app")
PACKAGE_NAME=$(basename "$APP_NAME" .app).pkg
xcrun productbuild --component "$APP_NAME" /Applications/ unsigned.pkg

INSTALLER_CERT_NAME=$(keychain list-certificates \
          | jq '[.[]
            | select(.common_name
            | contains("Mac Developer Installer"))
            | .common_name][0]' \
          | xargs)
xcrun productsign --sign "$INSTALLER_CERT_NAME" unsigned.pkg "$PACKAGE_NAME"
rm -f unsigned.pkg 

此时进入到 build/macos/Build/Products/Release 目录下,双击生成的 app 即可

1
2
3
rm -rf build && flutter build macos --release

cp -r /Users/nocilantro/Desktop/desktop_proxy/build/macos/Build/Products/Release/ProxyPin.app ~/Desktop/DesktoProxy_1231_2043.app