0

完全に C++ で記述され、ダウンロードとライセンスのみが Java で記述されている完成したアプリを難読化しようとしました。プロガードを使用しなくてもうまく機能しますが、難読化すると、電話でアプリケーションを起動すると次のエラーが発生します。

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fantasyhaze.rememory/com.fantasyhaze.rememory.Main}: android.database.sqlite.SQLiteException: no such table: MetadataColumns: , while compiling: SELECT APKVERSION,_id,DOWNLOADSTATUS,DOWNLOADFLAGS FROM MetadataColumns LIMIT 1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1840)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1861)
    at android.app.ActivityThread.access$1500(ActivityThread.java:132)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:4310)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.database.sqlite.SQLiteException: no such table: MetadataColumns: , while compiling: SELECT APKVERSION,_id,DOWNLOADSTATUS,DOWNLOADFLAGS FROM MetadataColumns LIMIT 1
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1438)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1406)
    at N.<init>(Unknown Source)
    at N.a(Unknown Source)
    at com.google.android.vending.expansion.downloader.impl.DownloaderService.a(Unknown Source)
    at com.fantasyhaze.rememory.GameActivity.onCreate(Unknown Source)
    at com.fantasyhaze.rememory.Main.onCreate(Unknown Source)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1804)
    ... 11 more

proguard.cfg で次の設定を使用しました

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic


-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public interface com.google.android.vending.licensing.ILicensingService

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

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

-keepclassmembers public class com.google.android.vending.expansion.downloader.impl.DownloadsDB { 
    public static final java.lang.String * ; 
} 

アプリをビルドすると、いくつかの警告が表示されますが、play_licensing と play_apk_expansion を使用するときに解決する方法がわかりません。

-obfuscate:
    [mkdir] Created dir: D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\bin\proguard
      [jar] Building jar: D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\bin\proguard\original.jar
 [proguard] ProGuard, version 4.7
 [proguard] Reading program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\bin\proguard\original.jar]
 [proguard] Reading program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_apk_expansion\downloader_library\bin\classes.jar]
 [proguard] Reading program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_licensing\library\bin\classes.jar]
 [proguard] Reading program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_apk_expansion\zip_file\bin\classes.jar]
 [proguard] Reading program jar [C:\Android\android-sdk\tools\support\annotations.jar]
 [proguard] Reading library jar [C:\Android\android-sdk\platforms\android-15\android.jar]
 [proguard] Preparing output jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\bin\proguard\obfuscated.jar]
 [proguard]   Copying resources from program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\bin\proguard\original.jar]
 [proguard]   Copying resources from program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_apk_expansion\downloader_library\bin\classes.jar]
 [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
 [proguard]   Copying resources from program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_licensing\library\bin\classes.jar]
 [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
 [proguard]   Copying resources from program jar [D:\SlidersEdgeUniverse\FloWars\CPE\trunk\Rememory\Source\PRO_Android\lib\play_apk_expansion\zip_file\bin\classes.jar]
 [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
 [proguard]   Copying resources from program jar [C:\Android\android-sdk\tools\support\annotations.jar]
 [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [annotations.jar:META-INF/MANIFEST.MF])
4

2 に答える 2

3

最初の投稿のエラーメッセージ

アクティビティ ComponentInfo{com.fantasyhaze.rememory/com.fantasyhaze.rememory.Main} を開始できません: android.database.sqlite.SQLiteException: そのようなテーブルはありません: MetadataColumns: 、コンパイル中: SELECT APKVERSION,_id,DOWNLOADSTATUS,DOWNLOADFLAGS FROM MetadataColumns LIMIT 1

必要なテーブルが見つからないため、SQLite データベースに問題があることを示します。

たとえば、dex2jarを使用して APK ファイルを逆コンパイルし、JD-GUIを使用して Java クラス ファイルを調べて、どの Java クラス ファイルが欠落しているか、何らかの形で難読化されているかを調べて、アプリケーション クラッシュを引き起こすことをお勧めします。

私の個人的な経験では、Proguard に関するほとんどの問題は、特定の必要なプロパティが不適切な方法で難読化されているか、難読化プロセス中にクラスが削除されたクラスに関連しています。

のようなステートメント

- 公開クラスを保持 * android.app.Activity を拡張

proguard.pro ファイルで、Proguard の難読化プロセスからクラスを除外できます

于 2012-04-22T21:57:13.397 に答える
1

私は最近このエラーに遭遇しました。コードを難読化した後、リフレクションがDownloadsDBクラスで機能しなくなったようです。この問題は、メソッド内でリフレクションによって宣言されたネストされたクラスを取得するという問題に起因してDownloadsContentDBHelper.onCreateおり、少なくとも私の場合はクラスが返されませんでした。

だから私はラインを交換しました

Class<?>[] arrayOfClass = DownloadsDB.class.getDeclaredClasses();

 Class<?>[] arrayOfClass = new Class[] {MetadataColumns.class, DownloadColumns.class};

必要なクラスを手動で指定します。クラスフィールドも名前でアクセスされるため、proguard にクラスとすべてのメンバーを完全に保持するように指示しました。

-keep class com.google.android.vending.expansion.downloader.impl.DownloadsDB* {*;}

それは私にとってはうまくいくようです。

于 2012-05-14T12:01:52.007 に答える