Gradle を使用して APK に署名する方法。 アプリケーションの公開 Android アプリケーションの署名を変更する方法

11.08.2020

Android 上の一部のアプリケーションは、何らかの形でユーザーに合わない場合があります。 例としては、 迷惑な広告。 また、そのプログラムは誰にとっても良いものですが、その中の翻訳が歪んでいるか、まったく欠けているということもあります。 または、たとえば、プログラムは試用版ですが、 フルバージョン可能性はありません。 状況を変えるにはどうすればよいでしょうか?

導入

この記事では、アプリケーションで APK パッケージを逆アセンブルする方法について説明します。 内部構造、バイトコードを逆アセンブルして逆コンパイルし、また、何らかの利点をもたらす可能性のあるアプリケーションにいくつかの変更を加えてみます。

これらすべてを自分で行うには、Android アプリケーションを記述する Java 言語と、アプリケーション自体とそのアクセス権の記述から文字列の保存に至るまで、Android のあらゆる場所で使用される XML 言語に関する少なくとも基本的な知識が必要です。画面に表示されます。 専用のコンソール ソフトウェアを使用する能力も必要になります。

では、すべての Android ソフトウェアが配布される APK パッケージとは何でしょうか?

アプリケーションの逆コンパイル

この記事では、逆アセンブルされたアプリケーション コードのみを扱いましたが、大規模なアプリケーションにさらに深刻な変更が加えられた場合、小さなコードを理解することはさらに困難になります。 幸いなことに、dex コードを Java コードに逆コンパイルすることができます。これは、オリジナルではなく、コンパイルし直してもいませんが、アプリケーションのロジックを読みやすく理解するのがはるかに簡単です。 これを行うには、次の 2 つのツールが必要です。

  • dex2jar は Dalvik バイトコードを JVM バイトコードに変換するツールで、これに基づいて Java 言語のコードを取得できます。
  • jd-gui は、JVM バイトコードから読み取り可能な Java コードを取得できるようにする逆コンパイラーそのものです。 代わりに、Jad (www.varaneckas.com/jad) を使用することもできます。 かなり古いものですが、場合によっては Jd-gui よりも読みやすいコードを生成します。

このように使用する必要があります。 まず、apk パッケージへのパスを引数として指定して dex2jar を起動します。

% dex2jar.sh メール.apk

その結果、Java パッケージ mail.jar が現在のディレクトリに表示されます。これはすでに jd-gui で開いて Java コードを表示できます。

APKパッケージの手配と受け取り

ビニール袋 Androidアプリケーション、実際には、通常の ZIP ファイルなので、内容を表示したり解凍したりするために特別なツールは必要ありません。 アーカイバ (Windows では 7zip、Linux ではコンソール解凍) があれば十分です。 しかし、それはラッパーの話です。 中には何が入っているのでしょうか? 一般に、内部には次の構造があります。

  • メタ-INF/- 作成者を識別するアプリケーションのデジタル証明書、およびパッケージ ファイルのチェックサムが含まれています。
  • res/ - 画像、インターフェイスの宣言的記述、その他のデータなど、アプリケーションが作業で使用するさまざまなリソース。
  • AndroidManifest.xml- アプリケーションの説明。 これには、たとえば、必要な権限のリストが含まれます。 Android版そして 必要な許可画面;
  • クラス.dex- コンパイルされたアプリケーションのバイトコード 仮想マシンダルヴィク;
  • リソース.arsc- リソースも含まれますが、種類は異なります - 特に文字列 (はい、このファイルはロシア化に使用できます!)。

リストされているファイルとディレクトリは、すべてではないにしても、おそらく大部分の APK に含まれています。 ただし、他にもあまり一般的ではない、言及する価値のあるファイル/ディレクトリがいくつかあります。

  • 資産- リソースの類似物。 主な違いは、リソースにアクセスするにはその識別子を知る必要があるが、アセットのリストはアプリケーション コードで AssetManager.list() メソッドを使用して動的に取得できることです。
  • ライブラリ- NDK (ネイティブ開発キット) を使用して作成されたネイティブ Linux ライブラリ。

このディレクトリは、C/C++ で書かれたゲーム エンジンを配置するゲーム メーカーや、高パフォーマンス アプリケーション (たとえば、 Google Chrome)。 私たちはその装置を理解しました。 しかし、興味のあるアプリケーションのパッケージ ファイルを入手するにはどうすればよいでしょうか? root なしでは APK ファイルをデバイスから取得することはできず (ファイルは /data/app ディレクトリにあります)、root 化が常に推奨されるわけではないため、アプリケーション ファイルをコンピュータに入手するには少なくとも 3 つの方法があります。

  • Chrome 用 APK ダウンローダー拡張機能。
  • 本物のAPK Leecherアプリ;
  • さまざまなファイルホスティングとVarezniks。

どちらを使用するかは好みの問題です。 私たちは別のアプリケーションを使用することを好むため、特に Java で書かれており、したがって Windows または Nix で動作する Real APK Leecher の使用法について説明します。

プログラムを開始したら、電子メール、パスワード、デバイス ID の 3 つのフィールドに入力し、言語を選択する必要があります。 最初の 2 つは、デバイスで使用する Google アカウントの電子メールとパスワードです。 3 番目はデバイス ID で、ダイヤラーにコードを入力することで取得できます。 # #8255## 次に、デバイス ID 行を見つけます。 入力するときは、android- プレフィックスを付けずに ID を入力するだけです。

入力して保存すると、「サーバーへの接続中にエラーが発生しました」というメッセージが頻繁に表示されます。 それは何の関係もありません Googleプレイですので、無視して興味のあるパッケージを探してください。

表示と変更

興味のあるパッケージを見つけてダウンロードし、解凍したとします。XML ファイルを表示しようとしたときに、そのファイルがテキストではないことに気づいて驚いたとします。 逆コンパイルする方法と、一般的にパッケージを操作する方法は? 本当にSDKをインストールする必要があるのでしょうか? いいえ、SDK をインストールする必要はまったくありません。 実際、APK パッケージを抽出、変更、パッケージ化するすべての手順には、次のツールが必要です。

  • ZIP アーカイバ開梱と梱包のため。
  • スマリ- Dalvik 仮想マシンのバイトコード アセンブラ/逆アセンブラ (code.google.com/p/smali);
  • なるほど- リソースをパッケージ化するツール (デフォルトでは、リソースはアプリケーションのパフォーマンスを最適化するためにバイナリ形式で保存されます)。 Android SDK に含まれていますが、個別に入手できます。
  • 署名者- 変更されたパッケージにデジタル署名するツール (bit.ly/Rmrv4M)。

これらのツールをすべて個別に使用することもできますが、これでは不便なので、これらのツールに基づいて構築された上位レベルのソフトウェアを使用することをお勧めします。 Linux または Mac OS X で作業している場合は、apktool と呼ばれるツールがあります。 これを使用すると、リソースを元の形式 (バイナリ XML および arc ファイルを含む) で解凍し、変更されたリソースでパッケージを再構築できますが、パッケージに署名する方法がわからないため、署名者ユーティリティを手動で実行する必要があります。 このユーティリティは Java で書かれているにもかかわらず、そのインストールはまったく標準的ではありません。 まず、jar ファイル自体を取得する必要があります。

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

Windows で作業している場合は、Virtuous Ten Studio と呼ばれる優れたツールがあります。これには、これらすべてのツール (apktool 自体を含む) も蓄積されていますが、CLI インターフェイスの代わりに、直感的なグラフィカル インターフェイスがユーザーに提供されます。数回クリックするだけで、解凍、逆アセンブル、逆コンパイルの操作を実行できます。 このツールは Donation-ware です。つまり、ライセンスの取得を求めるウィンドウが表示されることがありますが、最終的にはこれは許容されます。 インターフェースは数分あれば理解できるので、説明する必要はありません。 ただし、apktool については、そのコンソールの性質上、さらに詳しく説明する必要があります。


apktool のオプションを見てみましょう。 簡単に言うと3つあります 基本的なコマンド: d (デコード)、b (ビルド)、および if (フレームワークのインストール)。 最初の 2 つのコマンドですべてが明らかな場合、3 番目の条件ステートメントは何を行うのでしょうか? これは、システム パッケージを分析する場合に必要となる、指定された UI フレームワークを解凍します。

最初のコマンドの最も興味深いオプションを見てみましょう。

  • -s- dex ファイルを逆アセンブルしないでください。
  • -r- リソースを解凍しないでください。
  • -b- dex ファイルを逆アセンブルした結果にデバッグ情報を挿入しないでください。
  • --フレームパス- apktool に組み込まれた UI フレームワークの代わりに、指定された UI フレームワークを使用します。 次に、b コマンドのいくつかのオプションを見てみましょう。
  • -f- 変更をチェックせずに強制的にアセンブリ;
  • -a- 何らかの理由で別のソースから aapt (APK アーカイブを構築するツール) を使用したい場合は、aapt へのパスを指定します。

apktool を使用するのは非常に簡単で、次のようにコマンドの 1 つと APK へのパスを指定するだけです。

$ apktool d mail.apk

この後、パッケージの抽出および逆アセンブルされたすべてのファイルがメール ディレクトリに表示されます。

準備。 広告を無効にする

もちろん理論は良いのですが、開梱したパッケージをどうすればよいかわからないのに、なぜ理論が必要なのでしょうか? この理論を私たちの利益に適用してみましょう。つまり、広告が表示されないようにソフトウェアを変更してみましょう。 たとえば、仮想トーチ (仮想トーチ) とします。 このソフトウェアは私たちにとって理想的です。なぜなら、煩わしい広告が満載で、しかもコードのジャングルに迷子にならないほどシンプルだからです。


したがって、上記の方法のいずれかを使用して、マーケットからアプリケーションをダウンロードします。 Virtuous Ten Studio を使用する場合は、アプリケーションで APK ファイルを開いて抽出し、プロジェクトを作成し ([ファイル] -> [新しいプロジェクト])、 コンテキストメニュープロジェクトで、「ファイルのインポート」を選択します。 apktool を選択した場合は、次の 1 つのコマンドを実行するだけです。

$ apktool d com.kauf.particle.virtualtorch.apk

この後、前のセクションで説明したものと同様のファイル ツリーが com.kauf.particle.virtualtorch ディレクトリに表示されますが、dex ファイルと apktool.yml ファイルの代わりに smali ディレクトリが追加されています。 1 つ目には、アプリケーションの実行可能 dex ファイルの逆アセンブルされたコードが含まれ、2 つ目には、apktool がパッケージを再構築するために必要なサービス情報が含まれています。

最初に確認する必要があるのは、もちろん AndroidManifest.xml です。 そして、ここですぐに次の行に遭遇します。

アプリケーションにインターネット接続の使用許可を与える役割を担っていることは推測に難しくありません。 実際、広告を排除したいだけの場合は、インターネットからアプリケーションをブロックするだけで済む可能性が高くなります。 これをやってみましょう。 指定された行を削除し、apktool を使用してソフトウェアのビルドを試みます。

$ apktool b com.kauf.particle.virtualtorch

結果の APK ファイルは、com.kauf.particle.virtualtorch/build/ ディレクトリに表示されます。 ただし、デジタル署名されていないため、インストールすることはできません。 チェックサムファイル (その中に META-INF/ ディレクトリが存在しないだけです)。 apk-signer ユーティリティを使用してパッケージに署名する必要があります。 発売されました。 インターフェイスは 2 つのタブで構成されています。最初のタブ (キー ジェネレーター) でキーを作成し、2 番目のタブ (APK 署名者) で署名します。 秘密キーを作成するには、次のフィールドに入力します。

  • 対象ファイル- キーストア出力ファイル; 通常、1 組のキーが保存されます。
  • パスワードそして 確認する- ストレージのパスワード。
  • エイリアス- ストレージ内のキーの名前。
  • エイリアスパスワードそして 確認する- 秘密鍵のパスワード;
  • 有効- 有効期間 (年単位)。 デフォルト値が最適です。

残りのフィールドは通常はオプションですが、少なくとも 1 つは入力する必要があります。


警告

apk-signer を使用してアプリケーションに署名するには、Android SDK をインストールし、アプリケーション設定でその完全なパスを指定する必要があります。

すべての情報は情報提供のみを目的として提供されています。 編集者も著者も、この記事の内容によって引き起こされる可能性のある損害に対して責任を負いません。

これで、このキーを使用して APK に署名できるようになりました。 [APK 署名者] タブで、新しく生成されたファイルを選択し、パスワード、キー エイリアス、およびパスワードを入力して、APK ファイルを見つけて [署名] ボタンを大胆にクリックします。 すべてがうまくいけば、パッケージには署名が行われます。

情報

独自のキーでパッケージに署名したため、元のアプリケーションと競合することになります。つまり、マーケットを通じてソフトウェアを更新しようとすると、エラーが発生します。

デジタル署名はサードパーティ ソフトウェアにのみ必要です。 システムアプリケーション/system/app/ ディレクトリにコピーすることでインストールされるため、署名する必要はありません。

その後、パッケージをスマートフォンにダウンロードし、インストールして起動します。 ほら、広告が消えました! ただし、代わりに、インターネットがない、または適切な権限がないことを示すメッセージが表示されました。 理論的にはこれで十分かもしれませんが、メッセージは煩わしいようで、正直に言うと、愚かなアプリケーションに恵まれただけです。 通常作成されたソフトウェアは、資格情報を明確にするか、インターネット接続を確認するか、そうでない場合は単純に起動を拒否する可能性が高くなります。 この場合はどうすればよいでしょうか? もちろんコードを編集してください。

通常、アプリケーション作成者は、広告を表示するための特別なクラスを作成し、アプリケーションまたはその「アクティビティ」の 1 つ (簡単に言えば、アプリケーション画面) が起動されるときに、これらのクラスのメソッドを呼び出します。 これらのクラスを見つけてみましょう。 smali ディレクトリに移動し、com に移動します (org には開いているディレクトリのみがあります) グラフィックスライブラリ cocos2d)、次に kauf (これは開発者の名前であり、開発者のすべてのコードがそこにあるため、まさにそこにあります) - そしてここに、マーケティング ディレクトリがあります。 中には拡張子が smari のファイルが大量にあります。 これらはクラスであり、その中で最も注目に値するのは Ad.smali クラスです。その名前から、広告を表示するクラスであることが容易に推測できます。

その操作のロジックを変更することもできますが、アプリケーション自体からメソッドの呼び出しを単純に削除する方がはるかに簡単です。 したがって、marketing ディレクトリを離れ、隣接するパーティクル ディレクトリに移動し、次に virtualtorch に移動します。 MainActivity.smali ファイルはここで特に注意する必要があります。 これは、Android SDK によって作成され、アプリケーションへのエントリ ポイントとして設定される標準の Android クラスです ( 主な機能 C)。 編集するためにファイルを開きます。

内部には smali コード (ローカル アセンブラ) があります。 これは非常に混乱しており、低レベルの性質のため読みにくいため、ここでは学習せず、コード内の Ad クラスへの参照をすべて検索してコメントアウトします。 検索に「Ad」という行を入力すると、25 行目に到達します。

フィールドプライベート広告:Lcom/kauf/marketing/Ad;

ここでは、広告クラス オブジェクトを保存するために広告フィールドが作成されます。 行の前に ### 記号を付けてコメントします。 捜索を続けます。 423行目:

新しいインスタンス v3、Lcom/kauf/marketing/Ad。

ここでオブジェクトの作成が行われます。 コメントしましょう。 検索を続け、433、435、466、468、738、740、800、802 行目で Ad クラスのメソッドの呼び出しを見つけます。 コメントしましょう。 それのようです。 保存。 次に、パッケージを元に戻して、機能と広告の有無をチェックする必要があります。 実験の純度を高めるため、AndroidManifest.xml から削除した行を返し、パッケージをアセンブルし、署名してインストールします。

私たちのモルモット。 広告が表示されます

おっと! 広告はアプリケーションの実行中にのみ消えますが、ソフトウェアを起動したときに表示されるメイン メニューには残りました。 で、待てよ、でもエントリポイントはMainActivityクラスで、広告はアプリケーション実行中に消えてメインメニューには残ったのでエントリポイントが違うのでは? 真のエントリ ポイントを特定するには、AndroidManifest.xml ファイルを再度開きます。 はい、次の行が含まれています。

これらは、android.intent.category.LAUNCHER カテゴリからのインテント (イベント) android.intent.action.MAIN の生成に応答して、Start という名前のアクティビティを起動する必要があることを私たち (そしてより重要なことに Android) に伝えます。 このイベントは、ランチャーでアプリケーション アイコンをタップすると生成されるため、エントリ ポイント、つまり Start クラスが決定されます。 おそらく、プログラマーは最初にメイン メニューのないアプリケーションを作成し、エントリ ポイントが標準の MainActivity クラスであった後、メニューを含む新しいウィンドウ (アクティビティ) を追加し、Start クラスに記述して、それを手動でエントリにしました。ポイント。

Start.smali ファイルを開き、もう一度「Ad」行を探します。153 行目と 155 行目に FirstAd クラスについての記述があります。 これはソース コードにも含まれており、名前から判断すると、メイン画面に広告を表示する役割を果たします。 さらに見てみましょう。FirstAd クラスのインスタンスの作成と、コンテキストに応じてこのインスタンスに関連するインテントがあり、次に cond_10 ラベルへの条件付き遷移がインスタンスの作成前に正確に実行されます。クラスの:

If-ne p1、v0、:cond_10 .line 74 新しいインスタンス v0、Landroid/content/Intent; ... :cond_10

おそらく、プログラムは広告をメイン画面に表示するかどうかを何らかの方法でランダムに計算し、表示しない場合は cond_10 に直接ジャンプします。 さて、彼女のタスクを単純化し、条件付き遷移を無条件遷移に置き換えましょう。

#if-ne p1、v0、:cond_10 goto:cond_10

コード内には FirstAd に関する記述がなくなったので、ファイルを閉じ、apktool を使用して仮想トーチを再構築します。 それをスマートフォンにコピーし、インストールして起動します。 ほら、すべての広告が消えました。私たち全員を祝福します。

結果

この記事は、Android アプリケーションをハッキングして変更する方法を簡単に紹介するものです。 保護の削除、難読化されたコードの解析、アプリケーション リソースの翻訳と置換、Android NDK を使用して作成されたアプリケーションの変更など、多くの問題が舞台裏に残っていました。 ただし、基本的な知識があれば、すべてを理解するのは時間の問題です。

これで、何日も (場合によっては夜も) 作業し、最初のハイブリッド モバイル アプリケーションの準備が整いました。 非常に安定しており、重大なバグのほとんどは解決されています。 小さなものはまだ残っていますが、完璧主義は悪であることを思い出し、アプリケーションを公開するという強い意志を決定します。

このための前提条件は、署名された APK ファイルの存在です。 この記事では、apk ファイルに署名する方法を学習します。

小さな隠れ家

私の大好きなプロジェクトのリリースが近づいてきたとき、私はアプリケーションを素早く簡単に公開する方法に関する情報を探し始めました。 見つかった指示の多くは単純そうに見えました。 私は、アプリケーションの開発に使用された Ionic フレームワークの作成者からの指示を選択しました。 最初からすべてがうまくいったわけではありません。いくつかの特徴があります。 この記事では、重要な点を強調しながら署名プロセスについて説明します。

初期データ

Apache Cordova を使用してハイブリッド モバイル アプリを開発するための設定はすべて完了していると思います。 インストールする必要があります:
  • アパッチ コルドバ
  • Java開発キット
  • Android SDK ツール
プロジェクトとアプリケーション名は lcf です。 必要に応じてプロジェクト名に置き換えます。

さあ行こう

まず、アプリケーションのリリース ビルドを作成する必要があります。 ただし、その前に、不要なプラグインがすべて削除されていることを確認してください。 たとえば、デバッグ情報をコンソールに出力するプラグインは必要ありません。 それを削除しましょう:

$コルドバプラグインrmコルドバプラグインコンソール
Android のリリース ビルドを生成するには、次のコマンドを使用します。 建てる旗を持って - リリース:

$cordova build --release android
このコマンドで作成されるのは、 署名されていないディレクトリ内の APK ファイル:

プラットフォーム/android/build/outputs/apk
たとえば、platforms/android/build/outputs/apk/ android-release-unsigned.apk。 次に、このファイルに署名してユーティリティを実行する必要があります ジップアラインファイルを Google Play 用に最適化して準備します。

ファイルに署名するには証明書が必要です。 ユーティリティを使って作成してみましょう キーツールこれは JDK に含まれています。

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000
重要

-alias パラメータの値は覚えておくか、できれば書き留めておく必要があります。 上の例では、lcf と等しくなります (アプリケーション名の Loyal Client Free の最初の文字に基づきます)。 ここでは詳細は説明しませんが、興味がある場合はコメントに書き込んでください。より詳しく説明します。

署名するたびにエイリアスが使用されます * アプリケーション。 覚えやすいように、キーストア ファイルの名前をエイリアスとして使用します。次に例を示します。


-keystore hello-world.keystore -alias hello-world -keystore Weather-app.keystore -alias Weather-app -keystore todo.keystore -alias todo
* アップデートがリリースされるたびにアプリケーションに署名する必要があります

ユーティリティ キーツール一連の質問をします。 質問とおおよその答えを事前に把握できるように、それらはすべて以下のスポイラーの下に記載されています。

Keytool の質問とその回答例

1. キーストアのパスワードを入力します。
ここで、ファイルのパスワード (少なくとも 6 文字) を入力する必要があります。 入力したパスワードは、アプリケーションに署名するたびに必要となるため、安全な場所に書き留める必要があります。

2. 新しいパスワードを再入力します。
パスワードを再入力してください。

3. あなたの姓名は何ですか?
: イワン・ペトロフ
あなたの姓名。 角括弧内の値はデフォルト値です。

4. あなたの組織単位の名前は何ですか?
: それ
あなたの会社の部門の名前。 IT を示しますので、空白のままにしておいても構いません。

5. あなたの組織の名前は何ですか?
: 2開発者
組織の名前。 ある場合はご記入ください。

6. あなたの都市または地域の名前は何ですか?
: モスクワ
都市名

7. あなたの州または地方の名前は何ですか?
: M.O.
エリア名

8. このユニットの 2 文字の国コードは何ですか?
: RU
国コード。 RUを指します。

: y

すべてが正しいかどうかを確認するか、Enter キーを押して再度入力します。


最後に、キーの生成が成功したことを示すメッセージが表示されます。 秘密キーのパスワードを設定するように求められます (証明書のパスワードと同じままにする場合は、Enter キーを押します)。

2,048 ビット RSA キー ペアと有効期限 10,000 日の自己署名証明書 (SHA256withRSA) を生成します: CN=Ivan Petrov、OU=IT、O=2developers、L=Moscow、ST=MO、C=RU Enter キーのパスワード (キーストアのパスワードと同じ場合は RETURN):
カレントディレクトリにファイルが作成されます lcf.キーストア.

重要

作成したファイルは安全な場所に保存する必要があります。 プライベート リポジトリを使用している場合は、ファイルをアプリケーションのソース コードとともにコミットできます。 一般に、証明書は個別に保存することをお勧めします。 証明書を紛失すると、アプリのアップデートを発行できなくなります。

残り 2 つのステップがあり、配布できる APK ファイルが完成します。 署名に移りましょう。

apk ファイルに署名するには、ユーティリティを使用します ジャーシグナー、これも JDK に含まれています。

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf
証明書名はパラメータの後に示されます。 -キーストア、エイリアス - ファイル名の後に続きます。

最後に、apk ファイルを最適化するために、ユーティリティを使用します。 ジップアライン:

$ zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk
最後のパラメータは、Google Play にアップロードするファイルの名前です。

重要。

ユーティリティ ジップアラインこれは Android SDK ツールの一部であり、次の場所にあります。

/path/to/Android/sdk/build-tools/VERSION/zipalign

結論

これで、Google Play にアップロードできる配布準備の整った APK ファイルが完成しました。 説明を入力し、アプリケーションの評価を決定し、自由に「公開」をクリックしてください。

これで、何日も (場合によっては夜も) 作業し、最初のハイブリッド モバイル アプリケーションの準備が整いました。 非常に安定しており、重大なバグのほとんどは解決されています。 小さなものはまだ残っていますが、完璧主義は悪であることを思い出し、アプリケーションを公開するという強い意志を決定します。

このための前提条件は、署名された APK ファイルの存在です。 この記事では、apk ファイルに署名する方法を学習します。

小さな隠れ家

私の大好きなプロジェクトのリリースが近づいてきたとき、私はアプリケーションを素早く簡単に公開する方法に関する情報を探し始めました。 見つかった指示の多くは単純そうに見えました。 私は、アプリケーションの開発に使用された Ionic フレームワークの作成者からの指示を選択しました。 最初からすべてがうまくいったわけではありません。いくつかの特徴があります。 この記事では、重要な点を強調しながら署名プロセスについて説明します。

初期データ

Apache Cordova を使用してハイブリッド モバイル アプリを開発するための設定はすべて完了していると思います。 インストールする必要があります:
  • アパッチ コルドバ
  • Java開発キット
  • Android SDK ツール
プロジェクトとアプリケーション名は lcf です。 必要に応じてプロジェクト名に置き換えます。

さあ行こう

まず、アプリケーションのリリース ビルドを作成する必要があります。 ただし、その前に、不要なプラグインがすべて削除されていることを確認してください。 たとえば、デバッグ情報をコンソールに出力するプラグインは必要ありません。 それを削除しましょう:

$コルドバプラグインrmコルドバプラグインコンソール
Android のリリース ビルドを生成するには、次のコマンドを使用します。 建てる旗を持って - リリース:

$cordova build --release android
このコマンドで作成されるのは、 署名されていないディレクトリ内の APK ファイル:

プラットフォーム/android/build/outputs/apk
たとえば、platforms/android/build/outputs/apk/ android-release-unsigned.apk。 次に、このファイルに署名してユーティリティを実行する必要があります ジップアラインファイルを Google Play 用に最適化して準備します。

ファイルに署名するには証明書が必要です。 ユーティリティを使って作成してみましょう キーツールこれは JDK に含まれています。

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000
重要

-alias パラメータの値は覚えておくか、できれば書き留めておく必要があります。 上の例では、lcf と等しくなります (アプリケーション名の Loyal Client Free の最初の文字に基づきます)。 ここでは詳細は説明しませんが、興味がある場合はコメントに書き込んでください。より詳しく説明します。

署名するたびにエイリアスが使用されます * アプリケーション。 覚えやすいように、キーストア ファイルの名前をエイリアスとして使用します。次に例を示します。


-keystore hello-world.keystore -alias hello-world -keystore Weather-app.keystore -alias Weather-app -keystore todo.keystore -alias todo
* アップデートがリリースされるたびにアプリケーションに署名する必要があります

ユーティリティ キーツール一連の質問をします。 質問とおおよその答えを事前に把握できるように、それらはすべて以下のスポイラーの下に記載されています。

Keytool の質問とその回答例

1. キーストアのパスワードを入力します。
ここで、ファイルのパスワード (少なくとも 6 文字) を入力する必要があります。 入力したパスワードは、アプリケーションに署名するたびに必要となるため、安全な場所に書き留める必要があります。

2. 新しいパスワードを再入力します。
パスワードを再入力してください。

3. あなたの姓名は何ですか?
: イワン・ペトロフ
あなたの姓名。 角括弧内の値はデフォルト値です。

4. あなたの組織単位の名前は何ですか?
: それ
あなたの会社の部門の名前。 IT を示しますので、空白のままにしておいても構いません。

5. あなたの組織の名前は何ですか?
: 2開発者
組織の名前。 ある場合はご記入ください。

6. あなたの都市または地域の名前は何ですか?
: モスクワ
都市名

7. あなたの州または地方の名前は何ですか?
: M.O.
エリア名

8. このユニットの 2 文字の国コードは何ですか?
: RU
国コード。 RUを指します。

: y

すべてが正しいかどうかを確認するか、Enter キーを押して再度入力します。


最後に、キーの生成が成功したことを示すメッセージが表示されます。 秘密キーのパスワードを設定するように求められます (証明書のパスワードと同じままにする場合は、Enter キーを押します)。

2,048 ビット RSA キー ペアと有効期限 10,000 日の自己署名証明書 (SHA256withRSA) を生成します: CN=Ivan Petrov、OU=IT、O=2developers、L=Moscow、ST=MO、C=RU Enter キーのパスワード (キーストアのパスワードと同じ場合は RETURN):
カレントディレクトリにファイルが作成されます lcf.キーストア.

重要

作成したファイルは安全な場所に保存する必要があります。 プライベート リポジトリを使用している場合は、ファイルをアプリケーションのソース コードとともにコミットできます。 一般に、証明書は個別に保存することをお勧めします。 証明書を紛失すると、アプリのアップデートを発行できなくなります。

残り 2 つのステップがあり、配布できる APK ファイルが完成します。 署名に移りましょう。

apk ファイルに署名するには、ユーティリティを使用します ジャーシグナー、これも JDK に含まれています。

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf
証明書名はパラメータの後に示されます。 -キーストア、エイリアス - ファイル名の後に続きます。

最後に、apk ファイルを最適化するために、ユーティリティを使用します。 ジップアライン:

$ zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk
最後のパラメータは、Google Play にアップロードするファイルの名前です。

重要。

ユーティリティ ジップアラインこれは Android SDK ツールの一部であり、次の場所にあります。

/path/to/Android/sdk/build-tools/VERSION/zipalign

結論

これで、Google Play にアップロードできる配布準備の整った APK ファイルが完成しました。 説明を入力し、アプリケーションの評価を決定し、自由に「公開」をクリックしてください。

自分で質問をグーグルで調べたので、 APKファイルに署名する方法?」、実際に機能し、完全に理解できる手順を見つけるのがそれほど簡単ではないことは承知しています。そのため、Android でプログラムやゲームに正しく署名する方法についての資料を自分で書くことにしました。

ご存知のとおり、デジタル署名がなければ、作成した作品はマーケットに掲載できません。これはすでに深刻な問題です。多くの若い Android 開発者が、いわば初心者がアプリケーションに署名することを完全に忘れていることに気づきました。後でそれを使って何かをしようとすると、APK ファイルでこれまたはそのアクションを実行できないのはなぜなのか不思議です。

したがって、足を引っ張らずに、APK ファイルに署名する方法と、望ましい結果を達成するために実際に何を使用する必要があるかをすぐに始めましょう。

この方法は、リストされているすべての方法の中で最も正確であるため、この資料で説明します。 当社は独自のデータと証明書を使用して独自のキーを作成し、それらを使用して作成したアプリケーションに署名します。

動作するには、OpenSSL と SignApk が必要です。

まず、証明書と署名キーを作成しましょう。 OpenSSLをインストールします。 インストール中に、インストーラーはコンポーネントをコピーするように求めるプロンプトを表示します。 Windowsフォルダーで、すべての OpenSSL をインストールする場所となる Bin フォルダーを選択します。

として開くようになりました システム管理者(これは非常に重要です!) コマンドライン。 次に、コマンドラインに移動します ビンフォルダーこれは、OpenSSL をインストールしたフォルダーにあります (たとえば、 C:\OpenSSL\Bin\または C:\Program Files\OpenSSL\Bin\)。 分からない場合は、別のフォルダーへの変更は次のコマンドで実行できます CD。 つまり、そこに行くためには、 希望のフォルダー次のようなコマンドを実行する必要があります。

cd C:\OpenSSL\Bin\

Bin フォルダーに移動したら、証明書とキーの作成に直接進むことができます。

ステップ1(1024 ビット長のキーを生成します)

次のコマンドを実行します。

openssl genrsa -out key.pem 1024

ステップ2(キーに基づいて証明書リクエストを作成します)

次のコマンドを実行します。

openssl req -new -key key.pem -out request.pem

この段階では、証明書であなたを識別するためのデータを入力する必要があります。

ステップ 3 (私たちは生成します 秘密鍵証明書によると)

次のコマンドを実行します。

openssl x509 -req -days 9999 -in request.pem -signkey key.pem -outcertificate.pem

ステップ4(公開鍵を生成します)

次のコマンドを実行します。

openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt

この段階で、ゲームやアプリケーションに署名するために必要なファイルの作成が完了しました。 作成したキーと証明書を使用して、Android 上で好きなだけゲームやアプリケーションに署名できます。

それでは、実際にアプリケーションへの署名を開始してみましょう。 上記のリンクからダウンロードした SingApk アーカイブを解凍します。 証明書とキーを作成した Bin フォルダーから 2 つのファイルを移動します。 証明書.pemそして key.pk8 SingApkを解凍したフォルダーにコピーします。 Windows ではファイル置換ダイアログ「置換」が表示されます。

今すぐ署名します apkファイル個性的 デジタル署名自分で作成したものです。マウスを使用して apk ファイルをドラッグするだけです。 サイン_APK.bat。 あるウィンドウから別のウィンドウにファイルをドラッグしないようにするには (これは不便です)、apk ファイルを SingApk のあるフォルダーに移動します。 実行後、フォルダ内にSingApkが入ったファイルが生成されます apk_signed.apk、これは署名されたアプリケーションまたはゲームになります。

前のセクションで説明した keytool ユーティリティは、jarsigner ツールのパラメーターの 1 つであるデジタル証明書を作成します。 もう 1 つのパラメータは、署名が必要な Android パッケージです。 Android パッケージを生成するには、Eclipse の ADT モジュールから Export Unsigned Application Package ユーティリティを使用する必要があります。 このユーティリティを呼び出すには、Eclipse で Android プロジェクトを右クリックし、コンテキスト メニューから [Android ツール] を選択し、[署名されていないアプリケーション パッケージのエクスポート] オプションを選択する必要があります。 このユーティリティを起動すると、デバッグ証明書で署名されていない .apk ファイルが生成されます。

これを試すには、Android プロジェクトの 1 つで「署名されていないアプリケーション パッケージのエクスポート」ユーティリティを実行し、生成された .apk ファイルをどこかに保存します。 で この例では以前に作成したキーストア フォルダーを使用し、C:\android\release\myappraw.apk という名前の .apk ファイルを生成します。

これで .apk ファイルとキーストア アイテムができたので、jarsigner ツールを実行して .apk ファイルに署名できます (14.2 を参照)。 この場合、キーストア ファイルと .apk ファイルのフル パスを指定する必要があります。

.apk ファイルに署名するには、jarsigner ユーティリティにキーストアの場所、キーストアのパスワード、秘密鍵のパスワード、.apk ファイルへのパス、およびキーストア項目のエイリアスが渡されます。 この後、jarsigner は次を使用して .apk ファイルに署名します。 デジタル証明書キーストア要素から。 jarsigner ユーティリティを実行するには、ツール ウィンドウ (第 2 章を参照) を開くか、ウィンドウを開く必要があります。 コマンドラインまたはターミナル ウィンドウでディレクトリ内の bin フォルダーを開きます。

JDK (このフォルダーが PATH 環境変数で指定されていない場合)。 セキュリティ上の理由から、コマンド引数としてパスワードを渡さないことをお勧めします。その場合、jarsigner は実行時にパスワードの入力を求めます。 図では、 図 14.3 に、jarsigner ユーティリティの呼び出し例を示します。 図で気づいたかもしれません。 14.3 jarsigner ユーティリティは 1 つのパスワードのみを要求します。 これは、storepass と keypass が同じである場合、keypass は要求されないためです。 厳密に言えば、e 14.2 の jarsigner コマンドでは、-storepass パスワードと異なる場合に -keypass パスワードを指定するだけで済みます。

すでに述べたように、Android では、悪意のあるプログラマーがアプリを独自のバージョンに置き換えることを防ぐために、アプリにデジタル署名が必要です。 これを行うには、Android では、アプリの更新が元のアプリと同じ署名で署名される必要があります。 アプリケーションが異なる署名で署名されている場合、Android はそれらを別のアプリケーションであるとみなします。 したがって、後でアプリケーションのアップデートをリリースする必要があるときに利用できるように、キーストア ファイルは慎重に扱ってください。