最近在做一些简单的Android需求开发,其他打包的过程碰到的一些问题做一个梳理。
【Android需要通过AS-> Open,打开工程,不然容易出问题】
1.签名
a.keystore.jks文件
接受的项目都是已经比较成熟的项目,在项目的目录下都有一个.jks的文件,里面会包含一些秘钥信息
在工程中的Android目录下build.gradle(Module:xxxx.app)里面会有秘钥的详细
b.开始签名
如果工程中已经有
.jks文件,选择Choose existing...选项,选中Project目录中的.jks文件即可.
然后继续
至此,打包完成了,根目录下的
app文件夹里面找到debug、release里面就是刚刚打包成功的.apk文件。 如果需要创建新的秘钥
拓展:怎么生成
.jks文件夹、怎么生成签名秘钥
2.生成.jks文件
a.创建并在Project工程目录下生成.jks文件,与app目录同级
选择Creat new进入创建界面
重要!!!需要选择项目下的app目录下,然后修改Untitled名称改为keystore.jks,保存即可,保存之后会返回一下界面,填写相关信息即可成功创建相关秘钥,并保存在刚才创建的.jks文件中,保存即可。
b.配置打包Signing Configs
按照图示的步骤来,即可完成配置。 然后在
app 目录的build.gradle文件中可看到如下生成的代码配置。
注意:出现如下图示,不影响apk打包,但是有警告,相对路径去怎么解决这个问题,有知道的,可以告知一下。
3.处理apk包名显示
正常情况下如果是内部软件,不需要加固,如果是外部软件加固一下【腾讯乐固】,对于生成的包名称可以配置显示【名称+版本+版本号+时间】,配置如下:
截图框出的方法需要写在andriod方法里面
// 自定义打包名称
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
签名成功
中间都是空格隔开就可以,主要理解是加固前和加固后的包的位置。然后秘钥keyAlias的名称需要app目录下的build.gradle文件里面找。
注意!!!:上传到应用市场的apk包不是从加固市场下载的包,而是原来as打包经过重签名后的包 至此,可以上传重签名后的apk包到应用市场了 参考
5.相对路径
在Android工程配置中,可以使用相对路径来表达文件或目录的位置。相对路径是相对于当前文件或目录的路径,而不是完整的绝对路径。
以下是在Android工程配置中使用相对路径的一些示例:
- 在Gradle脚本中引用相对路径:
def relativePath = '../subdirectory/myfile.txt'
- 在AndroidManifest.xml文件中引用相对路径:
<meta-data
android:name="my_data"
android:value="../subdirectory/myfile.txt" />
- 在资源文件(如布局文件或字符串资源文件)中引用相对路径:
<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]
通过对官网和网上资料的分析,有两种思路,
1.通过as构建打包,然后通过jarsigner签名[也就是上述的重签名方式],然后通过zipalign来实现4字节对齐,这里的顺序是按照官网的推荐来做的,具体命令如下:
//签名
jarsigner -verbose -keystore /jks文件路径/appkey.jks -signedjar /apk源文件路径/20240221175241.apk /加固后的apk包路径/20240221175241_211_jiagu.apk test
成功之后,再通过aipalign来实现4字节对齐
进入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
参考文章