Flutter集成打包

297 阅读2分钟

1,添加启动背景图

把splash_screen_background.png背景图放在/android/app/src/main/res/drawable下面,
然后在`drawable\launch_background.xml`和`drawable-v21\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>

2,支持刘海屏

在AndroidManifest.xml的activity标签下添加: 

<activity
    android:name=".MainActivity"
    android:exported="true"
    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"/>

3,设置状态栏为透明色 (个人感觉可设置页可不设置)

在未设置前,启动后状态栏如下:

image.png 然后

在/android/app/src/main/kotlin/包名/MainActivity类下配置以下代码:

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页面背景色一样了,感觉这样不是很好,看不到时间了,如果APP页面背景色是其他颜色,这样设置可能可以。

image.png

4,设置启动屏全屏(紧接着步骤三)

步骤三设置后,APP启动发现启动时状态栏为黑色

image.png 这时候需要在android/app/src/main/res/values/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>

5,设置APP名和快照名

1,APP名称
在AndroidManifest.xml下 修改:<application android:label="小心情" ...</application>
2,快照名中
在lib中main.dart里找到第一个MaterialApp设置 titlle='小心情'
MaterialApp(title = '小心情'...)

6,在android/build.gradle里设置applicationId和版本

defaultConfig {
    applicationId "com.example.lc_mood"
    minSdkVersion 19
    targetSdkVersion flutter.targetSdkVersion
}

7,设置启动图标

image.png

8,设置网络访问权限

在AndroidManifest.xml下添加:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lc_mood">
    <uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>

9,签名APP

1,Windows下: 暂时略
2,MAC下:
keytool -genkey -v -keystore /Users/liufeng/Desktop/flutter/keystore/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

image.png 然后把key.jks放在应用的android的目录下,然后还是在android目录下新建一个文件:

storePassword=123456
keyPassword=123456
keyAlias=key
storeFile=../key.jks

10,配置打包签名

在应用的/android/app/build.gradle目录下
1,在android{..}上面配置:

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
    ...
}
2,然后在`android`代码块中添加`signingConfigs`:

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

3,最后在`buildTypes`代码块中添加`release`配置signingConfigs.release:
buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

11,打包

1,构建全部架构的安装包 (构建出来的Release包是包含所有ABI架构的)
cd <flutter应用的android目录> 
./gradlew assembleRelease
2,构建单一架构的安装包
cd <flutter应用的android目录> 
flutter build apk --split-per-abi

在执行命令:后报错:

image.png 这时候需要把应用的android/build.gradle文件改一下:

把com.android.tools.build:gradle:7.1.2 改成 classpath 'com.android.tools.build:gradle:4.1.3
    dependencies {
//        classpath 'com.android.tools.build:gradle:7.1.2'
        classpath 'com.android.tools.build:gradle:4.1.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }

./gradlew assembleRelease构建成功后,apk包有三种架构:

image.png

然后构建单一架构安装包:

构建成功后输出打包地址命令:
✓  Built build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk (12.3MB).

image.png