パッケージ名と構成を変更するための 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
renameManifestPackage
null
com.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 apk
Android 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.0
V2 Scheme (APK Signature)
apksigner
Android 7.0
JDK、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.keystore
keystore
--ks-key-alias unity
--ks-pass pass:123456
keystore
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 ファイルに署名する前にそれを使用する必要がありますzipalign
。apksigner
署名付き 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 を開く またはadb
Viewを使用します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
apk
aapt
apktool
apktool b --use-aapt2 Test