Android 签名、打包、上架

3,050 阅读7分钟

最近在做一些简单的Android需求开发,其他打包的过程碰到的一些问题做一个梳理。 【Android需要通过AS-> Open,打开工程,不然容易出问题】

1.签名

a.keystore.jks文件

接受的项目都是已经比较成熟的项目,在项目的目录下都有一个.jks的文件,里面会包含一些秘钥信息 image.png

在工程中的Android目录下build.gradle(Module:xxxx.app)里面会有秘钥的详细

image.png

b.开始签名

image.png image.png

如果工程中已经有.jks文件,选择Choose existing...选项,选中Project目录中的.jks文件即可.

image.png 然后继续 image.png

至此,打包完成了,根目录下的app文件夹里面找到debugrelease里面就是刚刚打包成功的.apk文件。 如果需要创建新的秘钥

image.png

拓展:怎么生成.jks文件夹、怎么生成签名秘钥

2.生成.jks文件

a.创建并在Project工程目录下生成.jks文件,与app目录同级

image.png

选择Creat new进入创建界面

重要!!! 需要选择项目下的app目录下,然后修改Untitled名称改为keystore.jks,保存即可,保存之后会返回一下界面,填写相关信息即可成功创建相关秘钥,并保存在刚才创建的.jks文件中,保存即可。

image.png

b.配置打包Signing Configs

image.png image.png image.png image.png Pasted Graphic.png image.png

按照图示的步骤来,即可完成配置。 然后在app 目录的build.gradle文件中可看到如下生成的代码配置。

image.png

注意:出现如下图示,不影响apk打包,但是有警告,相对路径去怎么解决这个问题,有知道的,可以告知一下。

Pasted Graphic 3.png

3.处理apk包名显示

正常情况下如果是内部软件,不需要加固,如果是外部软件加固一下【腾讯乐固】,对于生成的包名称可以配置显示【名称+版本+版本号+时间】,配置如下:截图框出的方法需要写在andriod方法里面

image.png

// 自定义打包名称
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "xxxAPK_${buildType.name}_v${versionName}_${generateTime()}.apk"  
        }
    }

构建时间的方法需要在android方法外

//构建时间
def generateTime() {
    return new Date().format("yyyyMMddHHmmss")
}

4.加固包重签名处理

AS打包生成的apk包是签名包,上传到 【腾讯乐固】加固后,这时候的加固包是不能直接安装或者上传应用市场,需要在签名一次才可以。以下就是加固包签名的命令行命令

 jarsigner -verbose -keystore xx[jsk文件绝对路径]xx.jks -signedjar xxx[加固前的apk包绝对路径]xxxAPK_release_v1.0.6_20231026092106.apk   xx[加固后的apk包绝对路径]xx.apk  xx[秘钥的名称keyAlias]xx
jarsigner -verbose -keystore xxxx/appkey.jks -signedjar xxxAPK_release_v2.1.0_20231204183449.apk xxxDownloads/23ceedcba843f2e7ef9.20231204.apk test

签名成功 image.png

中间都是空格隔开就可以,主要理解是加固前和加固后的包的位置。然后秘钥keyAlias的名称需要app目录下的build.gradle文件里面找。

注意!!!:上传到应用市场的apk包不是从加固市场下载的包,而是原来as打包经过重签名后的包 至此,可以上传重签名后的apk包到应用市场了 参考

5.相对路径

在Android工程配置中,可以使用相对路径来表达文件或目录的位置。相对路径是相对于当前文件或目录的路径,而不是完整的绝对路径。

以下是在Android工程配置中使用相对路径的一些示例:

  1. 在Gradle脚本中引用相对路径:
def relativePath = '../subdirectory/myfile.txt'
  1. 在AndroidManifest.xml文件中引用相对路径:
<meta-data
    android:name="my_data"
    android:value="../subdirectory/myfile.txt" />
  1. 在资源文件(如布局文件或字符串资源文件)中引用相对路径:
<ImageView
    android:src="@drawable/../subdirectory/myimage.png" />

在上述示例中,相对路径使用../来表示从当前位置向上一级目录的相对路径。你可以根据实际情况调整相对路径的格式和层数。

使用相对路径的好处是,它提供了一种相对于当前位置的灵活方式来引用文件或目录。这样,当你的工程目录结构发生变化时,不需要修改绝对路径,只需调整相对路径即可。

请注意,相对路径的解析取决于当前位置,因此确保当前位置的准确性和相对路径的正确性。

总而言之,使用相对路径可以在Android工程配置中指定文件或目录的位置,使其更具可移植性和灵活性。根据你的具体需求,可以在相应的配置文件或资源中使用相对路径来引用文件或目录。

6.适配API等级30

通过上述的打包、重签名的过程中,如果API Level >= 30的情况下,使用adb命令来安装apk包,就会出现如下报错: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]

通过对官网和网上资料的分析,有两种思路,

image.png

1.通过as构建打包,然后通过jarsigner签名[也就是上述的重签名方式],然后通过zipalign来实现4字节对齐,这里的顺序是按照官网的推荐来做的,具体命令如下:
//签名
jarsigner -verbose -keystore  /jks文件路径/appkey.jks  -signedjar /apk源文件路径/20240221175241.apk /加固后的apk包路径/20240221175241_211_jiagu.apk  test

成功之后,再通过aipalign来实现4字节对齐

image.png 进入sdk文件夹

@iOSdeMac-mini ~ % cd /Users/xxx_ios/Library/Android/sdk
@iOSdeMac-mini ~ % sdk % ls   
@iOSdeMac-mini ~ % ls  
@iOSdeMac-mini ~ % cd build-tools  
@iOSdeMac-mini ~ % ls     
@iOSdeMac-mini ~ % cd 33.0.0   
@iOSdeMac-mini ~ % ls       
@iOSdeMac-mini ~ % zipalign -p -f -v 4 infile.apk outfile.apk
@iOSdeMac-mini ~ % cd zipalign  
@iOSdeMac-mini ~ % zipalign -p -f -v 4 infile.apk outfile.apk

或者直接进入

// 4字节对齐
cd /Users/xxxx_ios/Library/Android/sdk/build-tools/33.0.0

注意:进入aipaligin时,需要使用./,否则会提示zsh: command not found: zipalign

// 源文件apk签名
// 加固apk文件  会生成一个新的apk文件 的路径
./zipalign -p -f -v 4 /原apk文件路径/20240221175241.apk  /Users/新apk文件路径/.apk
// 安装生成的新的apk文件
adb install /Users/新apk文件路径/.apk

然后安装就会报错: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package com.nephealth.star] 因为:- 请不要使用jarsigner进行签名,因为jarsigner只能进行V1签名,而V2签名是SDK>=24时才支持的,所以使用jarsigner签名后,安装时会报错:INSTALL_PARSE_FAILED_NO_CERTIFICATES

2.正确的做法:先使用zipalign4字节对齐,然后使用apksigner重签名,即可。

注意:这里不使用jarsiginer签名!!!

1.进入sdk文件夹【同上】

cd /Users/xxx_ios/Library/Android/sdk/build-tools/33.0.0

2.4字节对齐

./zipalign -f -v 4 /Users/xxx_ios/Downloads/360jiagutoolkits4_amd64/jiagu/output/加固后的apk /jiagu.apk /Users/hwxc_ios/Downloads/360jiagutoolkits4_amd64/jiagu/output/和原apk同路径下生成的重新命名apk路径/_output_unsigned.apk

3.还是在sdk文件夹中,重签名

33.0.0 % ./apksigner sign --ks /Users/.jsk文件路径/appkey.jks /Users/上一步生成的apk/_output_unsigned.apk

或者使用这个是比较常用的,因为可以重新命名重签名之后生成的新的apk文件,注意output在前面,就是我们最终需要的apk文件, input.apk是4字节对齐后的apk文件。并且可以自己设置生成的包放置的路径,output.apk路径是可以自定义的

// 其中,–ks表示keystore文件,–out表示输出的apk文件,input.apk表示输入的apk文件。
// output.apk, 生成新的apk文件的 路径和名称
 apksigner sign --ks my-release-key.jks --out output.apk input.apk

4.输入密码即可签名成功. 此种签名方式,和之前打包的不同,这次是生成新的apk,再使用的也是新的apk包【提交应用市场的也是这个包】。以前的方式使用的还是原来的apk包。

6.1【简化版适配API Level 30】

1.上传到加固平台(比如360加固)
此时会得到一个类似名称的apk包:【release_v2.1.1_20240422140054_211_jiagu.apk】
2.进入到33.0.0
cd /Users/xxx_ios/Library/Android/sdk/build-tools/33.0.0
3.4字节对齐
// 最好通过ls制定查询下 4字节对齐 zipalign

// zipalign 前面需要加上 ./
// 注意output.apk是自定义命名的且刚生成,需要有完整的路径
// input.apk:加固的apk    output.apk:输出的未签名的apk [注意:都需要带上完整的路径]

./zipalign -f -v 4 input.apk output_unsigned.apk
4.重签名
// .jsk:是工程中.jks的路径 
// output.apk:刚生产的可以提交应用市场和直接安装的apk新包,和上一步的output.apk类似,自定义路径
// input.apk:就是上一个刚生产的未签名apk文件
 ./apksigner sign --ks my-release-key.jks --out output.apk input.apk

参考文章

主要参考1

参考命令路径

思路参考