我看到了几个类似的问题,
但是我觉得我的问题不同。
我首先使用:
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>
答案 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,但是至少这是一种解决方法,如果没有提出更好的解决方案,则可能会使用它。