11

aapt ツールを使用して、apk のさまざまなフォルダーからいくつかのファイルを削除しています。これはうまくいきます。

しかし、apk にファイルを追加する場合、aapt ツールの add コマンドでは、ファイルを追加する場所へのパスを指定できないため、apk のルート フォルダーにしかファイルを追加できません。開発者が apk のサブフォルダー (たとえば res フォルダー) にファイルを追加したくないとは思わないため、これは奇妙です。これは aapt または他の方法で可能ですか? 任意のフォルダーからのファイルの削除は正常に機能し、ファイルの追加は apk のルート フォルダーに対してのみ機能します。他のフォルダには使用できません。

ありがとう

4

2 に答える 2

8

実際には、aaptこれをランダムに不可能にするバグがあります。それが機能するはずの方法は、他の回答が主張するとおりです。パスを渡さない限り、パスは保持されます-k。これがどのように実装されているか見てみましょう:

パスを無視するかどうかを制御するフラグは次のmJunkPathとおりです。

bool        mJunkPath;

この変数は というクラスBundleにあり、次の 2 つのアクセサによって制御されます。

bool getJunkPath(void) const { return mJunkPath; }
void setJunkPath(bool val) { mJunkPath = val; }

-kコマンドラインで指定されたユーザーの場合、次のように設定されtrueます。

case 'k':
    bundle.setJunkPath(true);
    break;

また、データがファイルに追加されるときに、次のようにチェックされます。

if (bundle->getJunkPath()) {
    String8 storageName = String8(fileName).getPathLeaf();
    printf(" '%s' as '%s'...\n", fileName, storageName.string());
    result = zip->add(fileName, storageName.string(),
                      bundle->getCompressionMethod(), NULL);
} else {
    printf(" '%s'...\n", fileName);
    result = zip->add(fileName, bundle->getCompressionMethod(), NULL);
}

残念ながら、アプリケーションによって使用される の 1 つのインスタンスがスタックにBundle割り当てられ、コンストラクターで の初期化がないため、変数の値はランダムです。に明示的に設定する方法がないと、私のシステムでは (一見決定論的に) 指定されたパスにファイルを追加できません。mainmJunkPathfalse

ただし、zipAPK は単純な Zip ファイルであり、zipツールは正常に動作するため、そのまま使用することもできます。

(記録として、私はまだ Android へのパッチとしてこれに対する些細な修正を提出していません。他の誰かが望むなら、おそらくより良い場所になるでしょう。Android コードの提出プロセスに関する私の経験は、我慢する必要がありました信じられないほど複雑な提出メカニズムで、最終的に誰かが私に返信するまでに 6 か月かかりました。この問題の回避策ですが、私はそのすべてを再び気にするほど重要だとは考えていません。)

于 2011-07-04T14:13:25.193 に答える