web-dev-qa-db-ja.com

Gradleを使用してプラットフォームキーでAndroidアプリに署名する方法は?

私はいくつかの同様の質問を見ました:

でも私の問題は違うと思います。

まず最初に私が使用します:

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から署名したいので、jksファイルを this の方法で生成しました:

./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を生成))を使用してアプリに署名するため、キーストアは問題ないと思いますが、それでも、embleReleaseを使用すると同じエラーが発生します。 deadfishによって提案されたキーストアと、Androidによって生成された実際のキーストアは、gradleとassemblyReleaseの動作には問題ありませんが、プラットフォームキーなので、残念ながら使用できません。

問題を解決しました:私の問題は実際に私が言及した問題とは異なることがわかりました。これは、キーの生成に使用される(gradleではなく)keytoolに関連していました。これは、私のデフォルトJavaは8でしたが、私のデフォルトのkeytoolはJava 10 …Java 8からkeytoolに切り替えたところ、すべてが正常に動作し始めました。

11
LLL

x509.pemおよびpk8ファイルからキーストアを作成するには、このスクリプトを使用できます platform_import_keystore keytool-importkeypairに似ていますただし、keytool-importkeypairは、キーストアが存在しない場合は機能しないため、platform_import_keystoreで機能します。

お役に立てば幸いです。

EDIT:

スクリプトplatform_import_keystoreはデフォルトのkeytoolコマンドを使用しています。スクリプトで使用されるコマンドkeytoolJava 8からのものであることを確認する必要があります。これは、keytoolが取得するキーストア形式に影響します。

1
VelocityPulse

.keystoreバリアントを使用してみてください。 Java keystore(.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デバッグキーストアを使用する例も示しています。

9
dr_g

deadfish とチャットした後、彼の提案に従って(助けてくれてありがとう!)app/build.gradle(Android {}内)で次の回避策を思いついた:

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

これにより、assembleDebugまたはassemblyReleaseが終了するたびにスクリプトが実行されます。私の質問への回答ではなく、gradleからsigningConfigsを削除せざるを得ないため、私の回答を受け入れませんが、少なくとも、より良い解決策が提案されていない場合に使用できる回避策です。

1
LLL

アプリを生成するときは、.jksではなく.keystoreファイルを使用します。AndroidStudioは、keyStoreを作成していることに気付き、このキーを試してください。

0
Devilsen