Androidからアプリを取り出して署名を書き換えて他のデバイスで利用する方法



他のデバイスからAPKを取り出して、別のデバイスにインストールする場合の方法です(有料アプリなどは動作しません)。

スポンサードリンク

APKの取り出し方法

取り出したいapkファイルのフルパスを取得する

adb shell pm list packages -f | findstr アプリ名

「アプリ名」の部分はパッケージファイルの名前の一部を入力します

findstrコマンドは検索コマンドです。アプリ名にヒットする一覧が表示されます。

その中からapkファイルのパスが見つけましょう。通常 /data/app/○○○.○○○.apkなどに存在します。

取り出す

コマンドプロンプトを起動し次のようなコマンドを入力します。

adb pull ****/****/****.apk

「****/****/****.apk」 は上で見つけたapkファイルのフルパスです。

署名の書き換え方法

署名を書き換えてAPKを組み込む

そのまま、ADBを利用してpush、installしても次のようなエラーが出ることがあります。

Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
→ 署名が一致しないためのエラーです。証明書で署名してないためにインストールに失敗しています。
Signature mismatch for shared user → 署名が一致しないためのエラーです。
DexFile_isDexOptNeeded cache file → dexファイルをapkに含める必要があります
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CERTIFICATE := platform
LOCAL_MODULE := パッケージ名
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_TAGS := optional
LOCAL_PACKAGE_NAME := パッケージ名
LOCAL_SRC_FILES := パッケージ名.apk
LOCAL_DEX_PREOPT := false

include $(BUILD_PREBUILT)

「LOCAL_DEX_PREOPT := false」で、 APKにdexファイルを含めるように指定します。

項目 説明
LOCAL_CERTIFICATE APKのビルドに使用する証明書を指定する。
Android標準の証明書を利用する場合は以下の3つのどれかを指定する。
- shared : 一般アプリ
- platform : システムアプリ
- PRESIGNED : プレビルトしたApkが署名済みの場合
- media : Med
LOCAL_MODULE_TAGS APKをビルドする時のモードを指定する。
指定できる値(複数指定可) optional, user, eng, tests
LOCAL_PACKAGE_NAME アプリの名前を指定する。
Androidのソース中の全てのAndroid.mkで一意である必要がある。
LOCAL_DEX_PREOPT APKにdexファイルを含めるか指定する。
- false
-- Apkにdexファイルを含める
- 何も指定しない
-- Apkにdexファイルを含めない
-- Apkと同じ場所にodexファイルができる

【付録】

APKに署名の有無・何の署名が付いているか調べたい時

下記コマンドを打てば分かります(もちろんJDKなどインストール済みである事が前提

jarsignerを使って署名を確認するコマンド

jarsigner -verify xxx.apk

署名の詳細を確認したいとき

jarsigner -verify -verbose -certs xxx.apk

デバッグ用のキーストア/キーは以下の値で生成する。
キーストア名「debug.keystore」
キーストアのパスワード「android」
キーのエイリアス「androiddebugkey」
キーのパスワード「android」
CN「CN=Android Debug,O=Android,C=US」
DOSから
 C:\>keytool -genkey -v ^
 -keystore debug.keystore ^
 -alias androiddebugkey ^
 -keyalg RSA ^
 -validity 10000 ^
 -dname "CN=Android Debug,O=Android,C=US"
これで「debug.keystore」が生成されるので、-listオプションを使って確認。
 C:\>keytool -list -v ^
 -keystore debug.keystore ^
 -storepass android

C:\>jarsigner -verbose ^

piyo.apk ^
alias_key1

> jarsigner -sigalg SHA1withDSA -digestalg SHA1 -verbose -signedjar new2.apk -keystore C:\Users\0000123921\.android\debug.keystore new.apk androiddebugkey
jarsigner -verbose ^

piyo.apk ^
alias_key1

jarsigner -sigalg SHA1withDSA -digestalg SHA1 -verbose -signedjar new2.apk -keystore C:\Users\0000123921\.android\debug.keystore new.apk androiddebugkey
キーストアのパスワードを入力してください:

  追加中: META-INF/MANIFEST.MF

jarsignerエラー: java.security.SignatureException: private key algorithm is not compatible with signature algorithm

生成した鍵の -genkey 指定がおかしいようです。 正しく -genkey を指定して鍵を生成し直しましょう。

apktool.bat d testshooting.apk
apktool.bat b testshooting new.apk

jarsigner -verbose -keystore C:\Users\0000123921\.android\debug.keystore -storepass android -keypass android new.apk androiddebugkey

  追加中: META-INF/MANIFEST.MF
  追加中: META-INF/ANDROIDD.SF
  追加中: META-INF/ANDROIDD.RSA
 署名中: assets/bin/Data/Managed/Assembly-UnityScript.dll
 署名中: assets/bin/Data/Managed/Boo.Lang.dll
 署名中: assets/bin/Data/Managed/Mono.Security.dll
 署名中: assets/bin/Data/Managed/System.Core.dll

...

 署名中: res/drawable-xhdpi/app_icon.png
 署名中: res/drawable-xxhdpi/app_icon.png
 署名中: AndroidManifest.xml
 署名中: classes.dex
 署名中: resources.arsc

jarsigner -verbose -keystore C:\Users\0000123921\.android\debug.keystore ^

    -storepass android -keypass android -digestalg SHA1 -sigalg MD5withRSA ^
    -signedjar new2.apk ^
     new.apk androiddebugkey

F/libc ( 5002): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x88 in tid 5054 (UnityMain)
E/qcom_sensors_hal( 767): hal_process_report_ind: Bad item quality: 11
I/DEBUG ( 190): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 190): Build fingerprint: 'google/hammerhead/hammerhead:L/LPV81C/1320585:user/release-keys'

Failure [INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING]

「-sigfile CERT」とか余計なオプションがついてる

Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]

未署名

1. Rename the apk file into a zip file, e.g. Name.apk = Name.zip
2. Unpack/ Unzip the zip file
3. Delete the META-INF folder
4. Repack/ Rezip the folder again to a zip file
5. Rename the zip file again to an apk file
6. Open a terminal window / Command prompt and enter (the jarsigner tool is located in the bin folder of your installed java sdk

jarsigner -keystore C:\Users\0000123921\.android\debug.keystore -storepass android -keypass android testshooting.apk androiddebugkey

スポンサードリンク