8

アクティビティに WebView があり、難読化のために Proguard を使用すると WebView が壊れてしまうようで、その理由がわかりません。

コードは非常に単純です。私は res/raw ディレクトリに HTML ファイルを持っています。これは、デバッグ時にそれを適切にロードするコードです。

WebView mv = (WebView)findViewById(R.id.webView1);
mv.loadUrl("file:///android_res/raw/wesite.html");

リリース用のapkを作成するとすぐに、proguardを介して実行しても機能せず、ロードできないページが表示されます。

私はまだプロガード設定ファイルに何も追加していません。

4

4 に答える 4

11

Proguard はディレクトリを難読化するため、android_res/raw を探している場合、おそらくそれは呼び出されなくなりました!

プロジェクトの proguard.cfg ファイルに、特定のファイルをスキップするルールを追加できます。ただし、この場合、未加工のリソースを assets フォルダーに移動するとうまくいきます。

問題は、Webkit FileLoader がリフレクションを使用して R$drawable クラスをロードしようとすることです。proguard.cfg ファイルに keep ルールを追加しないと、そのクラスの名前が変更されるため、Webkit はリソースをロードできません。( Prevent Proguard から取得して、特定の drawables を削除します)。

これが、Android がリソースに R クラスの命名システムを使用する理由です。場所によってファイルを参照するのではなく、一意のルックアップ ID です。

ファイルを assets フォルダーに配置することで、R クラス参照システムをバイパスし、すべてが正常に機能するはずです。

website.html ファイルを assets フォルダーに移動して、次を呼び出す必要があります。

mv.loadUrl("file:///android_asset/wesite.html");

上記のリンクで提案されているように、以下のルールを Proguard.cfg ファイルに追加して、代わりにリソースの場所が難読化されないようにすることができます。

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keep class **.R$*

難読化には理由があります。

お役に立てれば

于 2012-08-24T15:31:15.330 に答える
1

資産と資産の議論を明確にするためです。プロジェクト ディレクトリ内のフォルダーは、Google ドキュメント (以下を参照) に従って「assets」と呼ばれる必要がありますが、それらにアクセスするには、「file:///android_asset/」を使用する必要があります。

assets/ これは空です。これを使用して、未加工のアセット ファイルを保存できます。ここで保存したファイルはそのまま .apk ファイルにコンパイルされ、元のファイル名が保持されます。URI を使用して一般的なファイル システムと同じ方法でこのディレクトリをナビゲートし、AssetManager を使用してファイルをバイト ストリームとして読み取ることができます。たとえば、これはテクスチャやゲーム データに適した場所です。

コメントを追加できないことに注意してください。そのため、これを回答として投稿しました。

于 2014-08-24T09:24:37.253 に答える
0

最近の質問によってこの投稿に導かれた後、更新するだけです。

Android Studio (少なくとも 1.0.1) では、メディアにアセットまたは res を使用する場合、リリース ビルドで提供されるデフォルトの難読化レベルに違いはありません。android_res/rawまたはandroid_asset。そして、彼らはまだ両方ともそう呼ばれていました。

私は両方のビルドで apktool を実行しましたが、最新のものに驚いて、 を使用してandroid_res/raw、より大きくなりました。サイズは私のメディアだけが原因でした。アプリ ストアの他の APK と同様に、どちらもほとんど難読化されていません。リソースと xml はどちらの場合も難読化されませんでした。これらをリバース エンジニアリングする唯一の問題は、baksmali を Java に変換することです。他の apk が難読化されているのを見たことがありますが、私のものはいくつかの部分に分割されていましたが、私が付けた元のクラス名を保持していました。

私はプロガードを初めて使用し、C++を好みますが、リリースビルドにはデフォルトで適用されることを理解しています。

于 2015-02-27T19:26:21.997 に答える
-1

webview で raw フォルダーのファイルをロードするには:

myWebView.loadUrl("file:///android_assets/myfile.html");
于 2012-08-24T15:20:54.933 に答える