LLL*_*LLL 11 android keystore gradle apk android-gradle-plugin
我看到几个类似的问题,如:
但我觉得我的问题不同了.
首先我使用:
机器人:sharedUserId = "android.uid.system"
所以我需要用平台密钥签署我的应用程序.我能用这种方式做到这一点:
cd $ANDROID_ROOT/out/host/linux-x86/framework
java -Djava.library.path=$ANDROID_ROOT/out/host/linux-x86/lib64 -jar signapk.jar $ANDROID_ROOT/build/target/product/security/platform.x509.pem $ANDROID_ROOT/build/target/product/security/platform.pk8 $APP_DIR/app/build/outputs/apk/debug/app-debug.apk $APP_DIR/MyApp-signed.apk
Run Code Online (Sandbox Code Playgroud)
但是我想从gradle进行签名,所以我用这种方式生成了jks文件:
./keytool-importkeypair -k my_keystore.jks -p my_password -pk8 $ANDROID_ROOT/build/target/product/security/platform.pk8 -cert $ANDROID_ROOT/build/target/product/security/platform.x509.pem -alias platform
Run Code Online (Sandbox Code Playgroud)
我已经修改app/build.gradle了:
signingConfigs {
release {
storeFile file("my_keystore.jks")
storePassword "my_password"
keyAlias "platform"
keyPassword "my_password"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过my_keystore.jks有平台别名:
keytool -list -v -keystore my_keystore.jks | grep Alias
Alias name: platform
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做的时候:
./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)
要么:
./gradlew signingReport
Run Code Online (Sandbox Code Playgroud)
我明白了:
无法从商店"(...)/ my_keystore.jks"读取关键平台:无效的密钥库格式
更新: 我已经尝试过关注dr_g提示,我可以使用Android Studio(Build - > Generate Signed APK)签署应用程序,所以我猜keystore还可以,但是在使用assembleRelease时我仍然会遇到同样的错误.我也尝试按照deadfish的建议生成我自己的密钥库,事实上Android Studio生成的密钥库适用于gradle和assembleRelease工作,但它不是平台密钥,所以我不能不幸地使用它.
问题解决了: 事实证明我的问题确实与我提到的问题不同.它与用于生成密钥(不是gradle)的keytool有关,这是因为虽然我的默认java是8,但我的默认keytool来自java 10 ...当我从java 8切换到keytool时,一切都开始正常工作了.
dr_*_*r_g 10
请尝试使用.keystore变体.可能有办法修复java密钥库(.jks)格式,但可能需要更多时间.
1)从单独的密钥文件生成.keystore文件
$ openssl pkcs8 -inform DER -nocrypt -in \
$ANDROID_ROOT/build/target/product/security/platform.pk8 -out platform.key
$ openssl pkcs12 -export -in \
$ANDROID_ROOT/build/target/product/security/platform.x509.pem -inkey \
platform.key -name platform -out platform.pem -password pass:password
$ keytool -importkeystore -destkeystore platform.keystore -deststorepass \
password -srckeystore platform.pem -srcstoretype PKCS12 -srcstorepass
password
Run Code Online (Sandbox Code Playgroud)
2)测试新的密钥库:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore \
platform.keystore -storepass password your-app.apk platform
Run Code Online (Sandbox Code Playgroud)
3)在gradle构建中部署密钥库:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
storeFile file('platform.keystore')
storePassword 'password'
keyAlias 'platform'
keyPassword 'password'
}
}
Run Code Online (Sandbox Code Playgroud)
上面的build.gradle还显示了使用android调试密钥库作为调试版本的标准示例.
要从x509.pem 和 pk8文件创建密钥库,您可以使用此脚本platform_import_keystore,该脚本类似于 keytool-importkeypair,但考虑到如果您没有现有密钥库,则 keytool-importkeypair 不起作用,则 platform_import_keystore 可以。
我希望它会有所帮助。
编辑 :
该脚本platform_import_keystore使用默认keytool命令。keytool您必须确保脚本中使用的命令来自java 8. 这会影响通过 获得的密钥库格式keytool。