2012-04-22 6 views
0

完全にC++で書かれた完成したアプリを難読化しようとしました。それはプロガードをうまく使用せずに動作しますが、難読化された後は電話でアプリケーションを起動するとエラーが発生します。それはplay_licensingとplay_apk_expansionのものを使用しているとき、私は解決する方法がわからない、いくつかの警告を与えるアプリを構築する場合 公式のダウンロードライブラリとライセンスライブラリを持つデバイスでアプリを起動すると、ProguardでAndroidアプリをObfuscateすると致命的な例外が発生する

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 * ; 
} 

で次のconfigsを使用しました。

-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

最初にエラーメッセージアクティビティComponentInfo {com.fantasyhaze.rememory/com.fantasyhaze.rememory.Main}を開始できません

転記:android.database.sqlite.SQLiteException:なしこのようなテーブル:MetadataColumns:、コンパイル中:必要なテーブルが欠落しているためSELECT APKVERSION、_id、DOWNLOADSTATUS、DOWNLOADFLAGS MetadataColumnsのLIMIT FROM 1

は、SQLiteデータベースに問題があることを示しています。

私は例えばdex2jarとAPKファイルを逆コンパイルすることをお勧めして、Javaクラスがmissingsのファイルやアプリケーションのクラッシュをその結果、方法で、難読化されているかを調べるためにJD-GUIでJavaクラスファイルになります。..

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

-keepパブリッククラスのようなステートメントは、*は、あなたのproguard.proファイルにandroid.app.Activity

を拡張し、あなたが、私は最近、ProGuardのの難読化プロセスから

+1

まあ、私はたくさん試しましたが、解決策を見つけられませんでした...しかし、dex2jarとJD-GUIへのリンクのためのthx! – odbb

1

をクラスを除外することができますこのエラーが発生した場合、コードを難読化した後、反射がDownloadsDBクラスで動作しなくなるようです。この問題は、DownloadsContentDBHelper.onCreateメソッドの内部で、リフレクションによって宣言されたネストされたクラスを取得し、少なくとも私の場合はクラスが返されないという問題に起因しています。

だから私は、手動で必要なクラスを指定する行に

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

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

を置き換えます。クラスのフィールドは、名前によってアクセスされているので、私は完全にクラスと、すべてのメンバー保つためにProGuardのを指示:私のためにトリックを行うようだ

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

を。

関連する問題