ブログ・コラム

技術情報

2019.10.30

【Android】署名付きapk作成時の注意点

いざapkファイルを作って動作確認をしようと思ったら、インストールできない、アプリが起動しないという経験がないでしょうか。

そんな事例を紹介します。

端末により、署名付きapkがインストール出来ない

端末により、署名付きapkがインストール出来ないケースがあります。
(右図のように「アプリはインストールされていません」とエラーメッセージがでました。)

私が確認したのは下記条件です。

端末 Priori 3 LTE
(OS android5.1)
開発環境 Android Studio 3.1.4

Android Studio2.3から、署名付きAPKを作成する際に、Signature Versionsを選ぶ項目(V1, V2)が追加されました。

作成の際にこの項目にチェックが無い場合、端末のOSバージョンによってインストールできなくなります。

私の場合は、V1を選択をしていなかった(V2のみ選択)ためにインストールできない状況になりました。

後述しますが、これによりAndroid7.0未満の端末(今回は5.1)で、apkがインストール出来ない、という事象が発生しました。

改めて、V1, V2両方の署名にチェックを入れたところ、無事7.0以前の端末でもインストール出来ました。
(基本的には、両方チェックが推奨されています。)

V1は従来の署名方法で、V2はAndroid7.0以降の「インストール時間高速化」や「セキュリティ面が強化」された署名方法のようです。

挙動としては、Android7.0以降では「V2」がインストール時に検証され、7.0以前では「V1」が検証(V2は無視)されます。

今回は、この「V1」を選択していなかった為、検証すべき署名が見当たらなかった(OS5.1ではインストール出来なかった)ということになります。

※ ちなみに、Android Studio2.2以前では、デフォルトでV1とV2両方で署名されていたようです。
(2.3からはそれが選択できる(必要に応じてV1またはV2を外せる)ようになった。)

GoogleMapが表示されない

Android Studioでデバックしている時は地図が表示されていたのに、署名付きのapkを作ってインストールすると地図が表示されなくなる経験をしました。

API(Maps SDK for Android)の設定に於いて、「使用アプリを制限する」為にSHA1の登録が必要となります。

このSHA1には「デバッグ用」と「リリース用」があるのですが、「デバッグ用」のみ設定しているとapkを作ったときに地図が表示されなくなります。

以下コマンドでリリース用のSHA1が取得でき、apkを作ってインストールしても地図が表示されるようになります。

  • keytool -list -v -keystore your_keystore_name -alias your_alias_name

ちなみにデバッグ用のSHA1取得は、以下コマンドとなります。

  • keytool -v -list -keystore ~/.android/debug.keystore

参考サイトに記載されているSHA1の取得方法のコマンドは、デバッグ用の取得方法が多くあり、これを鵜呑みにコピペ実行して「設定は全て完了した」と思ってしまいました。

まとめ

今回の二つとも、分かってしまえば本当に何てことない単純なミスなのですが、最初の段階で見落としてしまうと、後でその原因を追求するのに、意外と時間が掛かってしまったりします。

みなさん、気をつけましょう!

※この記事に対するいかなる損害に対して、当方は一切の責任を負いかねます。
自己責任でお願いします。

2019.07.03

【C#】マウスフック

キーボードフックの記事にも記載しましたが、Windowsシステムは、メッセージキューにメッセージが蓄積され、メッセージループによってイベントが処理されていきます。

マウスを左クリックした、マウスを動かしたなどのイベントをwindowが非アクティブ状態で取得したい場合は、マウスのイベントをフックする必要があります。

以下にサンプルソースを掲載します。

サンプルソース

namespaceなどは適宜読み替えてください。

イベントをフックする場合は、DLL(user32.dll)にあるSetWindowsHookEx関数を使用して指定します。

この関数の引数の意味は下記のとおりです。

第1引数 フックするイベントの種類

マウスのイベントをフックする場合は、
WH_MOUSE_LL(14)を指定する。

第2引数 フック時の関数のアドレス イベントが発生した時に実行される関数。
第3引数 インスタンスハンドル 現在実行中のハンドルを渡す。
第4引数 スレッドID 0を指定すると、すべてのスレッドでフックされる。

サンプルソースのように指定すると、マウスボタンのクリック、マウス移動などのイベントが発生する都度EventMouse関数が呼ばれるようになります。

サンプルでは、マウスの座標をデリゲート関数に渡しています。

最後にCallNextHookEx関数を実行していますが、これは次のフックプロシージャ―へ渡すために実行しています。もしここで終了する場合は0を返すようにします。

このサンプルは、下記のように実行すると、MouseEvent関数が実行されます。

※このサンプルソースに対するいかなる損害に対して、当方は一切の責任を負いかねます。
自己責任でお願いします。

2019.06.05

【C#】キーボードフック

Windowsシステムは、メッセージキューにメッセージが蓄積され、メッセージループによってイベントが処理されていきます。

キーボードが押された、離されたイベントをwindowが非アクティブ状態で取得する必要がある場合は、キーボードイベントをフックする必要があります。

以下にサンプルソースを掲載します。

サンプルソース

namespaceなどは適宜読み替えてください。

イベントをフックする場合は、DLL(user32.dll)にあるSetWindowsHookEx関数を使用して指定します。

この関数の引数の意味は下記のとおりです。

第1引数 フックするイベントの種類

キーボードのイベントをフックする場合は、
WH_KEYBOARD_LL(13)を指定する。

第2引数 フック時の関数のアドレス イベントが発生した時に実行される関数。
第3引数 インスタンスハンドル 現在実行中のハンドルを渡す。
第4引数 スレッドID 0を指定すると、すべてのスレッドでフックされる。

サンプルソースのように指定すると、キーが押される/離される毎にEventKey関数が呼ばれるようになります。

サンプルでは、キーが離された時にコンソールへコメントを表示し、処理をするようにしています。

最後にCallNextHookEx関数を実行していますが、これは次のフックプロシージャ―へ渡すために実行しています。もしここで終了する場合は0を返すようにします。

このサンプルは、下記のように実行すると、キーが離される毎にKeyEvent関数が実行されます。

※このサンプルソースに対するいかなる損害に対して、当方は一切の責任を負いかねます。
自己責任でお願いします。