2012-04-22 64 views
0

我試圖混淆完整應用程序,該應用程序完全用C++編寫,下載和授權用java編寫。它的工作原理沒有很好地使用proguard,但一旦它被混淆,我在電話上啓動應用程序時就會出現以下錯誤。使用Proguard混淆Android應用程序會導致在使用官方下載和許可庫啓動應用程序時發生致命異常

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 

我用以下CONFIGS在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

在第一張貼

無法啓動活動ComponentInfo {com.fantasyhaze.rememory/com.fantasyhaze.rememory.Main}的錯誤消息:android.database.sqlite.SQLiteException:無這樣的表:MetadataColumns:,編譯時:SELECT APKVERSION,_id,DOWNLOADSTATUS,DOWNLOADFLAGS FROM MetadataColumns LIMIT 1

表明存在與SQLite數據庫的一個問題,因爲所需的表丟失。

我建議反編譯APK文件,dex2jar例如,然後尋找到Java類文件與JD-GUI找出哪些Java類文件missings或在某種程度上已經被混淆,導致應用程序崩潰..

對於我個人的體驗,Proguard的大多數問題都與某些必要屬性以錯誤方式被混淆或類在混淆處理期間被刪除的類相關。

之類的語句

-keep公共類*寬android.app.Activity

在proguard.pro文件允許你從Proguard的的混淆處理最近排除類

+1

嗯,我已經嘗試了很多,但沒有找到解決方案......但thx鏈接到dex2jar和JD-GUI! – odbb 2012-04-28 19:41:38

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

,似乎這樣的伎倆我。

相關問題