当前位置: 首页 > 工具软件 > Buildapp > 使用案例 >

科普:Flutter应用打包、修改图标、修改启动页和app名字、加固后重新V1V2签名

皇甫树
2023-12-01

1 创建秘钥

如果您已有密钥,请跳到下一步。 如果没有,请在命令行中运行以下命令来创建一个:

在Mac / Linux上,使用以下命令:

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

此命令将key.jks文件存储在主目录中。 如果要将其存储在其他位置,请更改传递给-keystore参数的参数。 但是,请将密钥文件保持私有状态; 不要将其推送到公共源代码控制中!

注意:

  • keytool命令可能不在您的路径中,它是Java的一部分,而Java是作为Android Studio的一部分安装的。 对于具体路径,请运行flutter doctor -v并找到在’Java binary at:'之后打印的路径。 然后使用该标准路径将Java(最后)替换为keytool。 如果您的路径包含以空格分隔的名称(例如“Program Files”),请使用平台专用的名称表示法。 例如,在Mac / Linux上,使用Program \ Files,在Windows上,使用“ Program Files”。
  • 只有Java 9或更高版本才需要-storetype JKS标记。 从Java 9版本开始,密钥库类型默认为PKS12。

2 引入密钥

创建一个名为<app dir>/android/key.properties的文件,其中包含对密钥的引用:

storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as /Users/<user name>/key.jks>

3 配置秘钥进Gradle

通过编辑<app dir>/android/app/build.gradle文件为您的应用配置签名。

3.1 在android块之前添加代码

   android {
      ...
   }

使用属性文件中的密钥库信息,将key.properties文件加载到keystoreProperties对象中。(加完效果如下):

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

   android {
         ...
   }

3.2 在buildTypes块之前添加代码

   buildTypes {
       release {
           // TODO: Add your own signing config for the release build.
           // Signing with the debug keys for now,
           // so `flutter run --release` works.
           signingConfig signingConfigs.debug
       }
   }

使用签名配置信息,在模块的build.gradle文件中配置signingConfigs块。(加完效果如下):

   signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
           v1SigningEnabled true // V1签名
           v2SigningEnabled true // V2签名
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }

您的应用的发布版本现在将自动签名。

注意:更改gradle文件后,您可能需要运行Flutter Clean。 这样可以防止缓存的版本影响签名过程。

4 配置是否R8缩小代码(默认缩小)

R8是Google推出的新代码缩减器,在您构建发行版APK或AAB时默认启用。 要禁用R8,请传递--no-shrink标志在使用flutter build apkflutter build appbundle

注意:混淆和缩小会大大延长Android应用程序的编译时间。

5 修改增加需要的应用权限

查看位于<app dir>/android/app/src/main中的默认App Manifest文件AndroidManifest.xml,并验证值是否正确,尤其是以下内容:

  • 如果您的应用程序代码需要Internet访问,请添加android.permission.INTERNET权限。 标准模板不包含此标签,但允许在开发过程中访问Internet以启用Flutter工具与正在运行的应用程序之间的通信

6 修改app图标和app名字

6.1 Android

  • 打开<app dir>/android/app/src/main/AndroidMainifest.xml,找到配置位置:

    	    <application
    	        android:name="io.flutter.app.FlutterApplication"
    	        android:label="flutter-app"
    	        android:icon="@mipmap/ic_luncher_logo">
    	        <activity 
    
    

    其中label为app名字,icon为app图标。

  • 图标存放位置在<app dir>/android/app/src/main/res下,注意:
    有好几个mipmap文件夹,这和ios是一样的,这几个是适配不同分辨率的手机。只需让美工出相应尺寸的图标放到相应的文件夹就可以了。
    注意图片需要是png格式。

6.2 IOS

  • 打开<app dir>/ios/Runner/info/plist,找到配置位置:

    <dict>
    	<key>CFBundleDevelopmentRegion</key>
    	<string>$(DEVELOPMENT_LANGUAGE)</string>
    	<key>CFBundleExecutable</key>
    	<string>$(EXECUTABLE_NAME)</string>
    	<key>CFBundleIdentifier</key>
    	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    	<key>CFBundleInfoDictionaryVersion</key>
    	<string>6.0</string>
    	<key>CFBundleName</key>
    	<string>flutter-app</string>
    
    

    CFBundleName下面的字符串就是app的名称。

  • 图标放到<app dir>/ios/Runner/Assets.xcassets/AppIcon.appiconset下,然后在Contents.json配置。

    {
      "images" : [
        {
          "size" : "20x20",
          "idiom" : "iphone",
          "filename" : "Icon-App-20x20@2x.png",
          "scale" : "2x"
        },
        {
          "size" : "20x20",
          "idiom" : "iphone",
          "filename" : "Icon-App-20x20@3x.png",
          "scale" : "3x"
        },
        {
          "size" : "29x29",
          "idiom" : "iphone",
          "filename" : "Icon-App-29x29@1x.png",
          "scale" : "1x"
        },
        {
          "size" : "29x29",
          "idiom" : "iphone",
          "filename" : "Icon-App-29x29@2x.png",
          "scale" : "2x"
        },
    
    

7 修改app启动图

7.1 Android

修改文件在项目中android目录中,找到app>src>main>res>drawable>launch_background.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />

    <!-- You can insert your own image assets here -->
    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_logo" />
    </item>
</layer-list>

7.2 IOS

在项目下找到ios目录,依次Runner>Assets.xcassets>LaunchImage.imageset,根据需求修改LaunchImage图片文件,并在同级别的Contents.json文件中配置即可。

{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchImage.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchImage@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchImage@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

8 修改打包配置

查看位于<app dir>/android/app中的默认Gradle构建文件文件build.gradle,并验证值是否正确,尤其是defaultConfig块中的以下值:

  • applicationId 指定最终的唯一(应用程序ID)appid

  • versionCode & versionName 指定内部应用程序的版本号,以及版本号显示字符串。 您可以通过在pubspec.yaml文件中设置version属性来执行此操作。 请查阅版本文档中的版本信息指南。

  • minSdkVersion,compilesdkVersion & targetSdkVersion 指定最低API级别,在其上编译应用程序的API级别以及在其上设计运行该应用程序的最大API级别。 有关详细信息,请查阅版本文档中的“ API级别”部分。指定您的应用使用的Android SDK构建工具的版本。 或者,您可以使用Android Studio中的[Android Gradle插件],它将自动为您的应用程序导入所需的最低构建工具,而无需使用此属性。

9 开始打包

发布到Play商店时,您有两种可能的发行格式。

  • App bundle(首选)
  • APK

9.1 打包成app bundle

如果您完成了签名步骤,则将对应用程序捆绑包进行签名。 此时,您可能会考虑混淆Dart代码,以使反向工程更加困难。 混淆代码涉及在构建命令中添加几个标志,并维护其他文件以消除对堆栈跟踪的混淆。

在命令行中:

  • 进入 cd <app dir>
    (将<app dir>替换为应用程序的目录。)

  • 运行flutter build appbundle
    (运行flutter build默认为发布版本。)

<app dir>/build/app/outputs/bundle/release/app.aab中创建了您的应用程序的发行包。

默认情况下,应用程序捆绑包包含Dart代码和Flutter运行时,它们针对armeabi-v7a(ARM 32位),arm64-v8a(ARM 64位)和x86-64(x86 64位)编译。

9.2 打包成APK

尽管应用捆绑包的优先级高于APK,但有些商店尚不支持应用捆绑包。 在这种情况下,请为每个目标ABI(应用程序二进制接口)构建一个发行版APK。

如果您完成了签名步骤,则APK将被签名。 此时,您可能会考虑混淆Dart代码,以使反向工程更加困难。 混淆代码涉及在构建命令中添加几个标志。
在命令行中:

  • 进入 cd <app dir>
    (将<app dir>替换为应用程序的目录。)

  • 运行flutter build apk --split-per-abi
    (运行flutter build默认为--release。)

此命令产生三个APK文件:

  • <app dir>/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
  • <app dir>/build/app/outputs/apk/release/app-arm64-v8a-release.apk
  • <app dir>/build/app/outputs/apk/release/app-x86_64-release.apk

删除--split-per-abi标志会生成一个fat APK,其中包含为所有目标ABI编译的代码。 此类APK的大小要大于拆分后的对应文件,导致用户下载不适用于其设备架构的本机二进制文件。

10 在设备上安装APK

请按照以下步骤在连接的Android设备上安装APK。

在命令行中:

  • 使用USB电缆将Android设备连接到计算机。
  • 使用cd <app dir>,其中<app dir>是您的应用程序目录。
  • 运行flutter install

当然也可以手动复制到手机里,然后手动安装apk。

11 腾讯加固后的app如何重新签名

应用加固后,下载的加固包是没有签名信息的,所以还需要重新签名加固包

11.1 V1版签名

11.1.1 先下载加固好的app

11.1.2 管理员权限cmd进入app目录

切记必须管理员权限

11.1.3 输入签名命令

这个签名命令需要jdk。

jarsigner -verbose -keystore filename.keystore -signedjar outputfile.apk inputfile.apk alise

命令含义

  • -verbose: 输出签名过程的详细信息
  • alias:密匙证书文件的别名
  • -keystore:密匙证书文件位置
  • -signedjar:指定输入输出文件名
  • inputfile.apk:未签名文件
  • outputfile.apk: 签名后文件

以我的例子:

jarsigner -verbose -keystore C:/Users/scoful/key.jks -signedjar 已加固已签名.apk 已加固未签名版.apk key

切记输出在前,输入在后,这个顺序第一次签名就弄反了。

11.1.4 输入你证书私钥密码并回车

11.1.5 最后提示 jar 已签名即为签名成功

11.2 V2版签名(包含V1版)

11.2.1 先下载加固好的app

11.2.2 管理员权限cmd进入app目录

切记必须管理员权限

11.2.3 对app进行对齐

先检查是否需要对齐:

zipalign -c -v 4 你的apk名字.apk 

如果结果有Verification FAILED,说明需要对齐,如果没有,直接下一步:

./zipalign -v 4 要对齐的apk名字.apk 对齐后apk的名字.apk

出现Verification succesful,说明对齐成功,下一步

11.2.4 进行V2签名(兼容V1签名)

可用everything全局找到apksigner.jar这个文件所在目录,把对齐后的apk复制到该目录下,命令行运行

java -jar apksigner.jar sign --ks secret.jks --out yourapp_sign.apk yourapp_dq.apk

命令含义

  • secret.jks 是证书文件
  • yourapp_sign.apk 是签名后的安装包
  • yourapp_dq.apk 是已对齐的安装包

以我的例子:

java -jar apksigner.jar sign --ks C:/Users/scoful/key.jks --out 签名后.apk 签名前.apk

注:如果前面打包时同时设置了v1,和v2,那么在二次签名时,直接使用v2签名即可,apksigner也同时支持v1签名。

参考文章:
flutter应用打包、修改图标、启动页和app名字
apk加固后如何重新签名(uni-app打包的apk)
安卓使用v1签名,V2签名,加固后二次签名

over,enjoy!

 类似资料: