Flutter集成与打包Android应用

目录

  • 添加启动图(可选)
  • 添加APP名和快照名
    • AndroidManifest.xml
    • main.dart
  • 检查和配置build.gradle文件
    • applicationId
    • versionCode & versionName:
    • minSdkVersion & targetSdkVersion
  • 添加APP启动图标
  • 添加网络访问权限
    • AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>
  • 签名APP
  • 构建一个release包
  • 发布到Android各大应用市场

添加启动屏

添加启动背景图

drawable-v21\launch_background.xmldrawable\launch_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/splash_screen_background" />
</layer-list>

设置启动屏全屏

styles.xml

    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">@drawable/launch_background</item>
   +     <item name="android:windowFullscreen">true</item>
    </style>

支持刘海屏

AndroidManifest.xml

<activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- 支持刘海屏-->
+            <meta-data android:name="android.notch_support"  android:value="true"/>

设置状态栏为透明色

package org.devio.flutter.bili.flutter_bili_app

+ import android.graphics.Color
+ import android.os.Build
+ import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity

class MainActivity : FlutterActivity() {
+     override fun onCreate(savedInstanceState: Bundle?) {
+         super.onCreate(savedInstanceState)
+         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+             val window = activity.window
+             //设置状态栏为透明色,fix 启动时状态栏会灰色闪一下
+             window.statusBarColor = Color.TRANSPARENT
+         }
+     }
}

签名APP

构建release包需要用到keystore,如果你还没有keystore可以通过一下方式来创建:

创建keystore

Mac:

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

Windows:

keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
  • -keystore:用户指定存储路径

然后按照提示进行输入,完成所有输入之后会在上述路径中创建一个key.jks文件。然后将该文件复制到Flutter项目下的android目录下。

配置keystore

你的flutter应用/android目录下创建key.properties文件,然后添加:

storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=../key.jks

配置打包签名

用AS打开你的flutter应用/android/app/build.gradle文件然后在android代码块上面添加:

   def keystoreProperties = new Properties()
   def keystorePropertiesFile = rootProject.file('key.properties')
   if (keystorePropertiesFile.exists()) {
       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
   }

   android {
         ...
   }

然后在android代码块中添加signingConfigs

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

最后在buildTypes代码块中添加release配置:

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

构建release包

构建全部架构的安装包

./gradlew assembleRelease

构建出来的Release包是包含所有ABI架构的。

构建单一架构的安装包

cd <flutter应用的android目录>
flutter build apk --split-per-abi
  • flutter build:命令默认会构建出release包
  • --split-per-abi:表示构建单一架构

上传应用

安装包构建好之后发布到Android各大应用市场,无论是长传到那个应用市场首先需要注册该平台的开发者通过开发者认证后便可进行应用上传了。

开发者注册和应用上传各大平台都有详细的说明教程和问题,下面分享国内比较大的应用市场:

有需要的小伙伴可以按照官方的说明进行注册和上传应用。

FAQ

启用代码压缩后无法打包

很多同学会发现当启用代码压缩(minifyEnabled true )后,在打release包时报错,无法打出release包,那么只需将targetSdkVersion 和 compileSdkVersion 升级到 28。

关联问题 @https://github.com/flutter/flutter/issues/26860#issuecomment-469751224

安装release包运行crash报so包找不到

flutter build apk会构建出包含x86_64、arm64-v8a、armeabi-v7a架构的安装包,但如何项目中所依赖的某个库和Flutter所支持的架构不一致就会出现so找不到的crash
,比如:XX三方库仅有armeabi-v7a的so,当APP被安装到支持arm64-v8a的手机上时,手机发现APP中包含arm64-v8a的目录,于是就向这个目录中查找某某三方库的so发现找不到就报错了。
解决方案是只会打armeabi-v7a架构的flutter so,所以在release包前需要添加如下配置:

ndk {
//            abiFilters "armeabi-v7a","arm64-v8a","x86_64","x86" //只打包flutter所支持的架构,flutter没有armeabi架构的so,加x86的原因是为了能够兼容模拟器
    abiFilters "armeabi-v7a" //release 时只打"armeabi-v7包
}

猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/122146356