パッケージ名と構成を変更するための APK セカンダリ パッケージ化

パッケージ名と構成を変更するための APK セカンダリ パッケージ化

APK の二次パッケージ化の目的:
複数のチャネルがある場合、各チャネルには異なるパッケージ名、アイコン、AndroidManifest.xml 設定、チャネル情報、設定ファイルなどが必要です。

オプション 1:
複数回パッケージ化し、各パッケージ化の前にチャネルに応じて異なる構成を変更する
短所: パッケージ化に時間がかかりすぎ、変更を行うと再パッケージ化が必要になるため、非効率的です。

解決策 2:
APK をパッケージ化し、APK を逆コンパイルし、 Unity ディレクトリの StreamingAssets フォルダーにある
パッケージ名、アイコン、AndroidManifest.xml 構成の AndroidManifest.xml ファイルおよびその他の
リソースを変更します。逆コンパイルされた生成パスはアセット ファイルの下にあります。異なるチャンネル構成を StreamingAssets フォルダーに配置し、逆コンパイル後にチャンネルに応じて置き換えることもできます。
apk に再コンパイルし
、再コンパイルされた apk に再署名します (再署名しないと Android デバイスまたはエミュレーターに通常どおりインストールできません)

1: 逆コンパイル ツール apktool
ダウンロード アドレス: https://apktool.org/
Windows、Linux、Mac プラットフォームごとに jar が用意されています。Windows を
例に説明します。URL を開いて [インストール] を選択し、ご自身の環境に合わせてダウンロードしてください
ここに画像の説明を挿入します
上記の手順に従って設定とダウンロードを行い、環境変数を設定し、CMD コマンドを開いて apktool を入力し、
ここに画像の説明を挿入します
apktoolのバージョンとその他情報が出力できれば、設定は成功です。 Keytool ツール、AndroidStudio、Unity など.apk
keystore

3: 逆コンパイル
(1) Test.apk ディレクトリで CMD コマンドを開くか、CMD コマンド cd を開いてこのディレクトリに移動し、
コマンド apktool d Test.apk を入力して
、Test.apk と同じレベルのディレクトリに Test フォルダを生成します。ファイルの出力は次のとおりです
ここに画像の説明を挿入します
生成されたディレクトリ
ここに画像の説明を挿入します
original\META-INFは次のとおりです 逆コンパイル後に生成されたファイルであるフォルダ内に、元の署名情報が格納されます
apktool.yml

(2)次のようにコマンドにパラメータを追加することもできます:
apktool d -o Output_dir Test.apk
-o Output_dir は、逆コンパイルされたファイルを Output_dir ディレクトリに保存することを意味します。
その他のパラメータについては、ドキュメントを自分で確認してください。

4: 設定を変更する
(1)パッケージ名を変更する:
(1.1)テキストエディタで開くパッケージ名をAndroidManifest.xml検索して変更する(1.2)開く内容は大まかに以下の通りです検索のデフォルト値は で、割り当てられた値はは新しいパッケージ名ですpackage package="com.abc.def"
apktool.yml
ここに画像の説明を挿入します
renameManifestPackagenullcom.abc.def
renameManifestPackage: com.abc.def

(2) AndroidManifest.xmlタグを追加アドイン
開くAndroidManifest.xml<application> </application>

<application>
    <meta-data android:name="CHANNEL" android:value="TapTap"/>
</application>

5: Test フォルダーを apk に再コンパイルします
(1)コマンドを入力します:apktool b Test
生成された apk は次の場所に保存されます。 Test\dist\Test.apk
(2)次のようにコマンドにパラメーターを追加して、
apktool b -o output_dir\new.apk Test
-o output_dir\new.apkコンパイルされた apk がディレクトリに保存され、再コンパイルされた apk が保存されることを示すこともできます。は new という名前です。
この時点で再コンパイルされたAPK はTest.apk署名されていないため、デバイスとシミュレーターに正常にインストールできません。再署名するAndroid必要があります。Test.apk

6: apk に再署名する
(1)署名ツール:
Jarsigner: jar パッケージに署名するために JDK によって提供される一般的なツールです。場所は次のとおりです。署名と検証JDK/bin/jarsigner.exe
Apksignerのために Google が公式に提供する特別なツールです。その他の署名ツールなどandroid apkAndroid SDK/build-tools/SDK版本/apksigner.bat

(2) apk 署名には 2 つのラベルがあります
: V1 署名: (Jar Signature)
V2 署名:(Full APK Signature)
Android 7.0以下のバージョンでは、古い署名スキームのみを使用できます.最初V1 scheme (JAR signing)
から、Google は新しい署名スキームを追加しました.注: V2 署名には明らかな利点があります。このツールは、互換性のため、デフォルトで V1 と V2 の両方の署名を使用しますツールのバージョンの問題による失敗を避けるために、APK の生成時に使用されるパスでツールを選択する必要があります。このため、私は署名に使用することにしました。Android 7.0V2 Scheme (APK Signature)

apksignerAndroid 7.0JDK、SDK
apksigner

(3)署名コマンド:

apksigner sign --ks H:\APK\unity.keystore --ks-key-alias unity --ks-pass pass:123456 H:\APK\Test\dist\Test.apk

apksigner ここではパスは簡略化されており、実際のアプリケーションは6 の場所apksigner に変更する必要があります。apk署名の署名に使用されるファイル「unity」は、キーストア ファイルのエイリアスです。キーストア エイリアス ファイルのパスワード ( 123456) (一般およびエイリアス同じパスワードを使用して生成)署名が必要な APKapksigner所在路径\apksigner
sign
--ks H:\APK\unity.keystorekeystore
--ks-key-alias unity
--ks-pass pass:123456keystore
H:\APK\Test\dist\Test.apk

コマンド実行後、成功するとTest.apkと同階層のディレクトリにTest.apkとTest.apk.idsigの2つのファイルが作成されます。Test.apkは
署名済みファイルなので正常にインストールして使用できます。 。

7: zipalign の最適化
公式ドキュメント: https://developer.android.google.cn/studio/command-line/zipalign?hl=zh-cn
(1) は、アーカイブ ファイルがすべて非圧縮であることを確認するアーカイブ ファイル配置ツールzipalignです。zipファイルはファイルの先頭を基準にして位置合わせされます。この方法では、RAM 内のデータをコピーせずに mmap(2) を介してこれらのファイルに直接アクセスでき、アプリケーションのメモリ使用量を削減できます。端的に言えば、APK の実行メモリ使用量の最適化です。

(2) APK ファイルをエンド ユーザーに配布する前に、zipalign を使用して最適化します。Android Gradle Plugin (AGP) を使用して Android Studio からビルドする場合、これは自動的に行われます。この場合でも、zipalign を使用して APK が調整されていることを確認する必要がありますが、調整する必要はありません。このドキュメントは主にカスタム ビルド システムのメンテナを対象としています。

(3)注:
(3.1)ビルド プロセスの特定の時点で使用する必要がありますzipalignタイミングは、使用するアプリ署名ツールによって異なります。

(3.2)を使用している場合はapksigner、APK ファイルに署名する前にそれを使用する必要がありますzipalignapksigner 署名付き APK を使用した後に APK にさらに変更を加えると、署名は無効になります。

(3.3)を使用している場合jarsigner(非推奨)、APK ファイルに署名した後に使用する必要がありますzipalign

(4)使用法
(4.1) APK に共有ライブラリ (.soファイル) が含まれている場合、-pそれらが mmap(2) に適した 4KiB ページ境界に位置合わせされていることを確認するために使用します。zipalign の必須アライメント パラメータによってアライメントが決定されるその他のファイルの場合、Android Studio は 32 ビット システムと 64 ビット システムの両方で 4 バイトにアライメントします。

zipalignツールはSDKディレクトリにありますSDK\build-tools\版本号

(4.2) infile.apk を整列して outfile.apk として保存するには、次のコマンドを実行してください。
zipalign -p -f -v 4 infile.apk outfile.apk
出力 outfile.apk が正常に整列されている場合は、出力コマンドの最後に出力されます。Verification succesful

(4.3)既存の.apkのアラインメントを確認するには、次のコマンドを使用してください。
Android Studio または AGP でビルドしている場合は、このコマンドを使用して APK が調整されていることを確認する必要があります
zipalign -c -v 4 existing.apk
。existing.apk が調整されていない場合は、出力コマンドの最後に出力しますVerification FAILED
。existing.apk が調整されている場合は、最後に出力します。出力コマンドの:Verification succesful

8: 発生したエラー
(1)再署名された APK をインストールするとクラッシュする まず操作手順に漏れがないか確認します
(1.1)漏れがある場合は再度手順を実行します
(1.2) Android Studio を開く またはadbViewを使用しますLogcat(情報をフィルタリングせずに、すべての出力を確認します。フィルタリングすると一部の情報が表示されない場合があります。ログが多数あるため、慎重に確認する必要があります) (1.3) 実行中にクラッシュが発生する
、 Logcat を介してログを追跡する

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
#00 pc 00142325 /system/lib/libhoudini.so

理由:環境である Windows 上で Android エミュレータを使用しています x86_64が、apk をパッケージ化するときにチェックしただけなのでARMv7、ARM64、エミュレータはlibhoudini.soこのライブラリを使用してコードの実行をシミュレートしますarm 。場合によっては問題ありませんが、 Unityで生成したTest.apkはx86関連のチェックはしていませんが、正常に動作します。パッケージ化するときに、次を選択します: x86(Chrome OS)、 x86-64(Chrome OS)
apk を再パッケージ化し、上記のプロセスをすべて再実行します。

(2)apktool b apk を生成するコマンドの再コンパイルと実行が失敗し、次のようなエラーが報告されました

AndroidManifest.xml:21: Tag <provider> missing required attribute name.
brut.androlib.exceptions.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\Administrator\AppData\Local\Temp\brut_util_Jar_18166975943944080932121909211781663143.tmp, p, --forced-package-id, 127, --min-sdk-version, 24, --target-sdk-version, 31, --version-code, 1, --version-name, 37.1.0, --no-version-vectors, -F, C:\Users\Administrator\AppData\Local\Temp\APKTOOL632521593023308607.tmp, -e, C:\Users\Administrator\AppData\Local\Temp\APKTOOL2355578712183391183.tmp, -0, arsc, -I, C:\Users\Administrator\AppData\Local\apktool\framework\1.apk, -S, H:\APK\CIAndroid_874\res, -M, H:\APK\CIAndroid_874\AndroidManifest.xml

(2.1)その理由は、AndroidManifest.xml以下のタグが含まれているためです。

<queries>       
     <provider android:authorities="com.facebook.katana.provider.PlatformProvider"/>
</queries>

内部でパッケージ化にapktool 使用しているため、コンテンツ互換性がない場合は、aapt apkaapt apktool
apktool b --use-aapt2 Test

おすすめ

転載: blog.csdn.net/LIQIANGEASTSUN/article/details/132321685