Amazon アプリストアのアプリの 1 つで同じ問題が発生しました。私たちの場合、次の 3 つの条件が真である場合にのみ問題が発生することがわかりました。
- キンドル ファイア HD
- Facebook アプリがインストールされ、ユーザーがログインしている
- ユーザーは、[設定] -> [マイ アカウント] -> [ソーシャル アカウントの管理] から facebook にもログインしました
それは、あなたの場合、それが5%のケースでしか起こらない理由を説明するかもしれません.
私たちが知る限り、Amazon は .apk を辞任し、Facebook の Android アプリ キー ハッシュ チェックを破っています。
解決策は次のとおりです。
- アプリの Amazon .apk を取得する (送信したものではなく、Amazon アプリストアによって配布されたもの)
- .apk ファイルから署名証明書を抽出します
- エンコードされた証明書の SHA ダイジェストを Base64 エンコードする
- 結果の Base64 キー ハッシュを Facebook アプリの設定に追加します。
これで問題は解決しました。
.apk を取得するのは難しいことがわかりました。アプリケーションは、デバイスのファイル システムの /data/app フォルダーにあります。ただし、このディレクトリはリストに表示されないように保護されているため、探しているファイルの名前を知らない限り、うまくいきません。もちろん、デバイスをルート化できます。または、成功するまで、adb pull /data/app/<app-id><suffix>.apk
サフィックスが空の文字列または-1
,などのいずれかである場合、盲目的な運を試すことができます。-2
例えば:
$ adb pull /data/app/com.example.game.apk
remote object '/data/app/com.example.game.apk' does not exist
$ adb pull /data/app/com.example.game-1.apk
remote object '/data/app/com.example.game-1.apk' does not exist
$ adb pull /data/app/com.example.game-2.apk
3658 KB/s (1085140 bytes in 0.289s)
このアプローチが失敗した場合、ルート化が唯一の選択肢になる可能性があります。
.apk ファイルを取得したら、以下のコードを使用してキー ハッシュを取得できます。として保存しMain.java
、でコンパイルしjavac Main.java
て実行しますjava Main <APK>
。例:
$ javac Main.java
$ java Main com.example.game-1.apk
com.example.game-1.apk: 478uEnKQV+fMQT8Dy4AKvHkYibo=
478uEnKQV+fMQT8Dy4AKvHkYibo=
Facebook アプリ設定のキー ハッシュに追加すると、問題が解決します。私たちが得たのと同じハッシュを他の人が見つけるかどうか興味があります (これは、すべての Amazon ゲームが同じキーで署名されていることを意味します)。私たちの場合、ハッシュはwwYPegrz...
.
コードは次のとおりです。
import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import sun.misc.BASE64Encoder;
public class Main {
public static void main(String[] args) throws Exception {
for (String jarFilename : args)
extractHash(jarFilename);
}
private static void extractHash(String jarFilename) throws Exception {
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest sha1 = MessageDigest.getInstance("SHA");
Set<Certificate> certificates = new HashSet<Certificate>();
JarFile jarFile = new JarFile(jarFilename);
for (JarEntry jarEntry : Collections.list(jarFile.entries())) {
jarFile.getInputStream(jarEntry).skip(Long.MAX_VALUE);
Certificate[] certs = jarEntry.getCertificates();
if (certs == null)
continue;
certificates.addAll(Arrays.asList(certs));
}
System.out.printf("%s:", jarFilename);
for (Certificate cert : certificates) {
byte[] digest = sha1.digest(cert.getEncoded());
System.out.printf(" %s", base64.encode(digest));
}
if (certificates.isEmpty())
System.out.printf(" NOT SIGNED!");
System.out.println();
jarFile.close();
}
}