如何使用Gradle使用平台密钥对Android应用进行签名?

时间:2018-08-07 09:48:44

标签: android gradle android-gradle apk keystore

我看到了几个类似的问题,

但是我觉得我的问题不同。

我首先使用:

  

android: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

但是我想从gradle进行签名,所以我以this的方式生成了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

并且我已经修改了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
     }
 }

我检查了my_keystore.jks是否具有以下平台别名:

keytool -list -v -keystore my_keystore.jks | grep Alias
Alias name: platform

但是当我尝试这样做时:

./gradlew assembleRelease

或:

./gradlew signingReport

我得到:

  

无法从存储“(...)/ my_keystore.jks”中读取密钥平台:无效的密钥库格式

更新: 我已经尝试按照 dr_g 提示进行操作,并且能够使用Android Studio(构建->生成已签名的APK)对应用程序进行签名,所以我认为密钥库是可以的,但是在使用时我仍然遇到相同的错误assembleRelease。 我也尝试过按照 deadfish 的建议生成自己的密钥库,而Android Studio生成的密钥库确实适用于gradle和assembleRelease,但它不是平台密钥,因此我不能使用它。

问题已解决: 事实证明,我的问题确实与我提到的问题不同。它与用于生成密钥的keytool有关(不是gradle),这是因为虽然我的默认Java是8,但我的默认keytool是来自Java 10的。。。当我从Java 8切换到keytool时,一切都开始正常工作。 / p>

4 个答案:

答案 0 :(得分:8)

请尝试使用.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

2)测试新的密钥库:

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore \
  platform.keystore -storepass password your-app.apk platform

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'
 } 
}

上面的build.gradle还显示了一个示例,该示例使用android debug keystore作为调试版本的标准。

答案 1 :(得分:1)

用于从x509.pem和pk8 文件创建密钥库,可以使用此脚本platform_import_keystore,该脚本与keytool-importkeypair类似,但是鉴于keytool-importkeypair不起作用如果您还没有密钥库,那么platform_import_keystore可以。

我希望它会有所帮助。

编辑:

脚本<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>使用默认的platform_import_keystore命令。您必须确保脚本中使用的命令keytool来自keytool。这会影响java 8获得的密钥库格式。

答案 2 :(得分:0)

使用.keystore文件而不是.jks 生成应用时,Android Studio会注意到您创建了keyStore,请尝试使用此密钥。

答案 3 :(得分:0)

deadfish聊天并遵循他的建议(感谢帮助!)后,我在app / build.gradle(在Android {}内部)提出了以下解决方法:

applicationVariants.all { variant ->
    variant.assemble.doLast {
        exec {
            commandLine 'sh', '../mySigningScript.sh'
        }
    }
}

这将在assembleDebug或assembleRelease完成时每次运行我的脚本。我不会接受我的回答,因为它没有回答我的问题,并且迫使我从gradle中删除signingConfigs,但是至少这是一种解决方法,如果没有提出更好的解决方案,则可能会使用它。