ベンチマークブーストを判定するためにAndroidアプリのパッケージ名を変更する方法

How to
この記事は約15分で読めます。
当サイトには、広告及びアフィリエイトリンクが含まれ、それによって収益を得ています。記事の内容やリンクには、プロモーションが含まれる場合があります。詳細については、プライバシーポリシーをご覧ください。

見かけ上のベンチマークスコアを上げるために、Androidデバイスメーカーが行うベンチマークブーストがあります。ベンチマークスコアが実態を反映しなくなるので避けるべきことなのですが、実際まだそういうことをやっている端末は普通にあります。今回は、そこら辺のApkファイルを取ってきて、パッケージ名だけ変更して戻す方法を書きます。

※この記事はAndroplusさんの記事1を参考にしています

パッケージ名を変更する方法

事前準備

環境

まず、今回は以下の環境でパッケージ名の変更を行います。

  • Ubuntu 22.04 on WSL2
  • Bash
  • VSCodeでリモートウインドウを開いている

この辺はインストールするだけなので、ググれば出てきます。要するに、WSL2を使えるようにし、Ubuntuをインストールし、シェルとしてBashが使えるWSL2環境にVSCodeで接続してファイルがいじれればOKです。あと、暗黙の了解として、Linuxの最低限の知識があることが前提となります。分からなかったら調べて下さい。

追加ツールのインストール

OpenJDK 17

とりあえず最新StableのOpenJDK 17を入れます。

Bash
sudo apt update
sudo apt upgrade -y
sudo apt install openjdk-17-jdk -y

インストール後、java -versionでバージョン確認をしてちゃんと17になっていることを確認してください。

apktool
GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files
A tool for reverse engineering Android apk files. Contribute to iBotPeaches/Apktool development by creating an account o...

apktoolのGitHubリポジトリにアクセスし、Releasesから最新のRelease版apktoolをダウンロードしてください。apktool_2.11.1.jarみたいなやつがapktoolの実体です。

Bash
wget https://github.com/iBotPeaches/Apktool/releases/download/v2.11.1/apktool_2.11.1.jar -O apktool.jar

こんな感じで適当にwgetすればいいでしょう。

次に、スクリプトもダウンロードします。GitHubのページだと、/scripts/linux/apktoolにあるファイルがそれです。これもwgetします。

Bash
wget https://github.com/iBotPeaches/Apktool/raw/refs/heads/master/scripts/linux/apktool

ダウンロードできたら、実行可能なように権限を変更して、システム全体から使えるように移動させます。

Bash
chmod +x apktool

sudo mv apktool /usr/local/bin/
sudo mv apktool.jar /usr/local/bin/

これでapktoolが使えるようになるはずです。適当にシェルでapktoolを実行して、実行可能であることを確かめておいて下さい。

Android SDK Build Tools
Android Studio とアプリツールのダウンロード - Android デベロッパー  |  Android Developers
Android Studio は、Android アプリ向けに最適化された統合開発環境(IDE)をアプリ作成者に提供します。Android Studio を今すぐダウンロードしましょう。

Googleのサイトから、Android SDK Build Toolsをダウンロードしてインストールします。Android Studio自体は必要無いので、今回はコマンドラインツールのみをインストールします。

上記サイトにアクセスし、Linux用のコマンドラインツールをダウンロードします。規約に同意するとボタンが押せるようになると思うので、そのボタンのリンクをコピーして、Ubuntu側のシェルでwget https://dl.google.com/android/repository/...とかしてダウンロードすればOKです。zipファイルなのでunzipコマンドとかで展開します。

展開したディレクトリ内にあるsdkmanagerを用いてBuild Toolsをインストールします。

Bash
./sdkmanager --list

でバージョン一覧みたいなのが出てくると思うので、build-toolsを指定してインストールします。例えば34.0.0を指定する場合、

Bash
./sdkmanager "build-tools;34.0.0"

のようになります。

最後にパスを通すのですが、これはお好みで。私は.bashrcに以下を追記しました。

Bash
# zipalign's path
export PATH=$PATH:"$HOME/dev/java/android_sdk/build-tools/34.0.0"

これも、インストール後には参照できるようになっているか、しっかり確認しておきましょう。

アプリのパッケージ名変更

デコンパイル

ここからいよいよ本番の、パッケージ名変更をやっていきます。

まずapktoolでアプリのapkファイルをデコンパイルします。apkファイルはネットを調べて入手してください。

Bash
apktool d <apkファイルのファイル>

あとは自動です。

デコンパイルされると、そのディレクトリにapkファイルのファイル名が付いたディレクトリができていると思います。

自動置換スクリプト実行

本来ならここから地獄の置換作業が発生するのですが、面倒なのでChatGPTにシェルスクリプトを書いてもらいました。実際に使って問題なくパッケージ名変更までできたので、おそらく大丈夫だと思います。何箇所か書き込まないと使えない場所があるので、漏れないように記入してください。想定しているディレクトリ構造は以下の通りです。

Bash
.
├── android_sdk
├── com.ap.android # 変更前のディレクトリ
│   ├── AndroidManifest.xml
│   ├── apktool.yml
│   ├── assets
│   ...
├── com.customed.android # 変更後のディレクトリ
│   ├── AndroidManifest.xml
│   ├── apktool.yml
│   ├── assets
│  ...
├── copy_and_rename_package.sh # このスクリプト

スクリプトがあるディレクトリで

Bash
./copy_and_rename_package.sh

を実行すれば実行できます。

Bash
#!/bin/bash
# ---------------------------
# スクリプトのあるディレクトリを取得(絶対パス)
# ---------------------------
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")

# ---------------------------
# 変数定義
# ---------------------------
OLD_DOT="com.app.android" # 対象のアプリの変更前のパッケージ名(逆ドメイン記法)
NEW_DOT="com.customed.android" # 対象のアプリの変更後のパッケージ名(逆ドメイン記法)

OLD_SLASH="com/app/android"
NEW_SLASH=$(echo "$NEW_DOT" | tr '.' '/')

OLD_DOLLAR="com\$app\$android"
NEW_DOLLAR=$(echo "$NEW_DOT" | sed 's/\./\$/g')

OLD_DASH="com-app-android"
NEW_DASH=$(echo "$NEW_DOT" | sed 's/\./-/g')

# リネーム前のデコンパイル後のディレクトリ(スクリプトと同じ階層にあるもの)
TARGET_DIR="$SCRIPT_DIR/com.app.android.application_(arm64-v8a,armeabi-v7a,x86,x86_64)(nodpi)" # 例
# リネーム後のディレクトリ(スクリプトと同じ階層に作成)
NEW_TARGET_DIR="$SCRIPT_DIR/$NEW_DOT"

# ---------------------------
# 新しいディレクトリの準備
# ---------------------------
if [ -d "$NEW_TARGET_DIR" ]; then
    echo "既存の $NEW_TARGET_DIR を削除します..."
    rm -rf "$NEW_TARGET_DIR"
fi
mkdir -p "$NEW_TARGET_DIR"

# ---------------------------
# 置換処理用の関数:パス(相対パス)を変換
# ---------------------------
transform_path() {
    local input_path="$1"
    local output_path
    output_path=$(echo "$input_path" | sed "s#${OLD_DOT}#${NEW_DOT}#g" \
                                          | sed "s#${OLD_SLASH}#${NEW_SLASH}#g" \
                                          | sed "s#${OLD_DOLLAR}#${NEW_DOLLAR}#g" \
                                          | sed "s#${OLD_DASH}#${NEW_DASH}#g")
    echo "$output_path"
}

# ---------------------------
# 元ディレクトリ内の全エントリを新ディレクトリへコピー&変換
# ---------------------------
cd "$TARGET_DIR" || exit 1

# find の出力を直接 while ループで処理(改行ごとに正しく読むため)
find . -print | sort -r | while IFS= read -r entry; do
    # "./" を除いた相対パスを取得
    rel_path="${entry#./}"
    new_rel_path=$(transform_path "$rel_path")
    new_full_path="$NEW_TARGET_DIR/$new_rel_path"

    if [ -d "$entry" ]; then
        echo "Creating directory: $new_full_path"
        mkdir -p "$new_full_path"
    elif [ -f "$entry" ]; then
        # コピー先の親ディレクトリを作成
        mkdir -p "$(dirname "$new_full_path")"
        case "$entry" in
            *.smali)
                # smaliファイルの場合はドット置換を行わず、スラッシュ・ドル・ハイフンのみ実施
                echo "Transforming smali file (content): $entry -> $new_full_path"
                sed "s#${OLD_SLASH}#${NEW_SLASH}#g; s#${OLD_DOLLAR}#${NEW_DOLLAR}#g; s#${OLD_DASH}#${NEW_DASH}#g" "$entry" > "$new_full_path"
                ;;
            *.xml|apktool.yml)
                # xml, apktool.yml は全置換を実施
                echo "Transforming file (content): $entry -> $new_full_path"
                sed "s#${OLD_DOT}#${NEW_DOT}#g; s#${OLD_SLASH}#${NEW_SLASH}#g; s#${OLD_DOLLAR}#${NEW_DOLLAR}#g; s#${OLD_DASH}#${NEW_DASH}#g" "$entry" > "$new_full_path"
                ;;
            *)
                echo "Copying file without transformation: $entry -> $new_full_path"
                cp "$entry" "$new_full_path"
                ;;
        esac
    fi
done

cd - >/dev/null

# ---------------------------
# apktool.yml の特別な置換処理
# ---------------------------
# コピー先のルートにある apktool.yml を対象とします
APKTOOL_YML="$NEW_TARGET_DIR/apktool.yml"
if [ -f "$APKTOOL_YML" ]; then
    echo "apktool.yml の renameManifestPackage を更新します..."
    sed -i "s#renameManifestPackage: *null#renameManifestPackage: ${NEW_DOT}.application # 変更後のパッケージ名#g" "$APKTOOL_YML"
fi

echo "全エントリのリネーム・コピーが完了しました。"

ただ一点だけ注意点があり、スクリプトの実行完了後も、apktool.yml自体は手動で書き換えなければいけません(バグですが直すかは分かりません)。具体的には、renameManifestPackage: nullnullを変更後のパッケージ名に書き換えなければいけません。

アプリによってはこのスクリプトだけでは置換が足りないこともありますので、完全に信用せずに、チェックできるところは自分でチェックしてください

ビルド

置換が終了したら、次はビルドです。

Bash
apktool b <変更後のディレクトリ>

これだけでコンパイルされます。

<変更後のディレクトリ名>/distにビルド後のapkファイルがあるはずなので、それを持ってきます。

Bash
zipalign 4 <さっきできたapkファイ> aligned.apk(名前はどうでもいい)
署名

できたapkファイルは署名がされておらず、おそらくそのままではインストールできないので、署名をします。

まずkeytoolでキーを作成します。キーストアのパスワードとかを入力することになるので、メモしておきます。

Bash
keytool -genkeypair -v -keystore my-release-key.jks -alias ${好きなエイリアス} -keyalg RSA -keysize 2048 -validity 100000

次に、apksignerで署名します。先ほどalignしたapkを用います。

Bash
apksigner sign --ks <自分のリリースキ>.jks --ks-key-alias <自分のエイリア> --out signed.apk <alignした後の.apk>

これでOKです。

できたsigned.apkが、パッケージ名を変更した後のapkファイルになります。これを自分の端末にインストールすれば、パッケージ名が変更されたアプリとして使えます。

参考情報

  1. 3DMarkやAnTuTuベンチマークで本当の3D性能や発熱特性を計測できない理由とは?メーカーの不正で無意味な結果に – AndroPlus[]

病気療養中のガジェットオタクです。PC、スマホからオーディオ、家電まで、デジモノ・IT系中心に自分の興味のあるものならなんでも記事にします。誤字脱字など、ミスの報告歓迎です。
お問い合わせは、当ブログのお問い合わせフォームにお願いします。レビュー依頼など、各種ご依頼承っています。

でじぃをフォローする↓
How to
スポンサーリンク
でじぃをフォローする↓
タイトルとURLをコピーしました