【发布时间】:2019-01-14 08:47:05
【问题描述】:
我看到了几个类似的问题,例如:
- Android: After building platform source, how to sign arbitrary APK with platform key?
- How to create a release signed apk file using Gradle?
- APK signing error : Failed to read key from 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 (Build -> Generate Signed APK) 对应用程序进行签名,所以我猜 keystore 没问题,但在使用时我仍然遇到同样的错误组装发布。 我还尝试按照 deadfish 的建议生成自己的密钥库,并且确实由 Android Studio 生成的密钥库适用于 gradle 和 assembleRelease 工作,但它不是平台密钥,所以很遗憾我不能使用它。
问题已解决: 事实证明,我的问题确实与我提到的问题不同。它与用于生成密钥(不是 gradle)的 keytool 有关,这是因为虽然我的默认 java 是 8,但我的默认 keytool 来自 java 10……当我从 java 8 切换到 keytool 时,一切都开始正常工作了。
【问题讨论】:
-
您是否尝试在 Android Studio
Menu>Build>Generate APK>[APK]>Create New...中生成发布密钥?那么你的 gradle conf 应该可以工作了。 -
不,因为我需要平台密钥,而不仅仅是其他一些密钥。除了正如我在其中一个 cmets 中所写的那样,我能够从终端签署应用程序(使用 signapk)并且我能够从 Android Studio 签署它(所以我猜密钥库是好的),我只是不能直接使用 gradle 签名。我会更新问题以使其更清楚。
-
好的,但是当您以我的方式生成 apk 时,您稍后可以在终端
gradlew assembleRelease中调用,或者只需单击 gradle 窗口assembleRelease。通过读取您已定义的签名属性,Gradle 将能够使用发布密钥登录应用程序。 -
你有时间在聊天中谈论它吗?
-
我会尝试你的建议,我有时间在聊天中交谈,虽然我以前没有使用过,所以如果可以的话请启动它:)
标签: android gradle android-gradle-plugin apk keystore