2012-08-24 14 views
6

私は自分のアクティビティでWebViewを使用していますが、Proguardを使用して難読化しているとWebViewが壊れているようですが、理由はわかりません。ProguardがAndroid WebViewを壊した理由は何ですか?

コードはかなりシンプルですが、私は自分のres/rawディレクトリにHTMLファイルを持っていますが、ここではデバッグ時にうまく読み込むコードがあります。

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

はできるだけ早く私はそれが動作しませんProGuardのを通してそれを実行し、リリース用APKを作成すると、私はロードできないページを取得します。

私はまだproguard設定ファイルに何も追加していません。 WebViewの中に生のフォルダのファイルをロードする

答えて

9

ProGuardのディレクトリを難読化!

プロジェクト内の特定のファイルをスキップするルールをproguard.cfgファイルに追加できます。しかし、この場合は、生のリソースをassetsフォルダに移動すると、そのトリックが実行されます。

Webkit FileLoaderはリフレクションを使用してR $ drawableクラスを読み込みます。あなたのproguard.cfgファイルに名前を変更するkeepルールを追加しないと、Webkitはあなたのリソースを読み込めません。 (Prevent Proguard to remove specific drawablesから得た)。

AndroidはリソースのためのRクラスのネーミングシステム使用する理由はここにある - 資産にファイルを配置することにより、それらの位置

でファイルを参照するのではなく、あなたがRクラス参照システムをバイパスしているフォルダをuniquieルックアップIDをとすべてがうまくいくはずです。

あなたは資産フォルダにあなたのwebsite.htmlファイルを移動して呼び出す必要があります:

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

を上記のリンクで提案されたとして、あなたのProguard.cfgファイルに以下のルールを追加することが可能でなければなりません心の中で

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

-keep class **.R$* 

ベア難読化は、それが理由でないように動作します:代わりにobfucatedされたリソースの場所を停止!

希望これは単なる資産の議論対資産を明確にするために

+1

上記はProguard.cnfで動作し、Webサイトをassetsフォルダに移動します。しかし、コードは 'mv.loadUrl(" file:///android_asset/wesite.html ");' ** Note:** android_asset'ではなく 'android_asset'でなければなりません。ご説明をいただき、ありがとうございます。 – Ne0

+0

すべてのRクラスとそのフィールドを保持する必要はありません。本当に保持したいリソース名をチェリーピックアップし、残りの部分(例:layout | xml | values)を難読化できるようにする必要があります。 – TWiStErRob

-1

:あなたはそれはおそらく、もはやそれと呼ばれる生android_res /を探しているので、もし

myWebView.loadUrl("file:///android_assets/myfile.html"); 
+0

これは、rawディレクトリではなく、アセットディレクトリからファイルを読み込みます。投稿をお読みください。問題はProguards難読化であり、コードではありません。 – Ne0

1

に役立ちます。プロジェクトディレクトリ内のフォルダはGoogleドキュメントごとに「資産」と呼ばれるべきである(下記参照)、それらにアクセスするのに対し、あなたは「ファイル:/// android_asset /」を使用する必要があり

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

私は答えを投稿したので、コメントを追加できませんのでご注意ください。

0

もっと最近の質問でこの記事につながった後に更新するだけです。

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

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

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

+0

が 'minifyEnabled true'に設定されました(壊死が多い) – n00b

関連する問題