7

私は私を狂わせる問題を抱えています。いくつかの画像を含める必要がある静的 html ファイル (assets/help/index.html) があります。密度ごとに異なる画像が必要で、画像は既に drawable-{ldpi,mdpi,hdpi} に含まれているため、次の html コードを使用すると思いました。

<img src="file:///android_res/drawable/image.png">

これは日食の下でうまく機能します!残念ながら、本番バージョン (maven android プラグインでビルド) では、html ページを表示する webview に壊れた画像アイコンが表示されます。

loadUrl と loadDataWithBaseUrl を使用してページを開こうとしました (最初に自分でファイルを読み取ります)。後者はベース URL が file:///android_res/drawable です。どちらの試みも Eclipse では成功しますが、Maven バージョンでは失敗します。

そこで、明らかに違いがあるはずなので、Eclipse で生成された apk と maven で生成された apk の両方を解凍し、2 つの間で diff -r を実行しました。

私はほんのわずかな違いを見つけることに困惑しています(Eclipse apkはデバッグ証明書で署名され、mavenは私の公式証明書で署名されているため、主に署名の違いです)。それ以外は、apk の内容は同じです!

何が起こっているのか、またはより多くの情報を明らかにする方法を知っている人はいますか?

4

3 に答える 3

4

proguard を使用して同様の問題が発生し、説明 (および解決策!) hereを見つけました。

私の場合、プロガードはRクラスを難読化し、android_res/[...]はもう見つかりませんでした。

proguard.cfg にルールを追加して解決しました。

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

-keep class **.R$*

Mavenについてはわかりませんが、これが役立つことを願っています。

于 2014-02-22T12:45:48.083 に答える
1

file:///android_asset の代わりに file:///android_res を使用する理由があります。その 1 つは、Android ライブラリ プロジェクトがアセットを持つことができないことです。

WebView からライブラリ プロジェクトで定義されているリソースにアクセスし、android-maven-plugin のそれぞれのオプションを使用してパッケージ名を変更したい場合( Android SDK 機能に依存します)、むしろ奇妙なバグ。

Android は android.webkit.BrowserFrame::inputStreamForAndroidResource でこれを行います (少なくとも 4.1.2 では):

final Class<?> d = mContext.getApplicationContext().getClassLoader().loadClass(
mContext.getPackageName() + ".R$" + subClassName);

これは R クラスの動的ルックアップであり、アプリケーションのパッケージ名を Java パッケージ名として使用します。ただし、名前が変更されたパッケージ名の R クラスが存在しないため、これは機能しません。

考えられる回避策は次のとおりです。リリース ビルド中に、実際の R クラスのコピーを動的に作成し、名前を変更したアプリケーション パッケージ名に適合する Java パッケージに配置します。コピーしたソースの ''package'' ステートメントも必ず更新してください。

于 2012-11-16T16:54:45.243 に答える
0

アプリケーションにバンドルされているファイルにアクセスする方法として、AssetManagerを調べてみます。チュートリアル (コード例付き) は、ここにあります。または、ファイルを入れてopenRawResource()res/rawで読み取ることもできます

于 2011-12-27T20:01:01.613 に答える