如何使用gradle使用平台密钥签署Android应用程序?

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调试密钥库作为调试版本的标准示例.


Vel*_*lse 2

要从x509.pem 和 pk8文件创建密钥库,您可以使用此脚本platform_import_keystore,该脚本类似于 keytool-importkeypair,但考虑到如果您没有现有密钥库,则 keytool-importkeypair 不起作用,则 platform_import_keystore 可以。

我希望它会有所帮助。

编辑 :

该脚本platform_import_keystore使用默认keytool命令。keytool您必须确保脚本中使用的命令来自java 8. 这会影响通过 获得的密钥库格式keytool