在 Proguard 构建中未使用脚本插入 Sqlite 数据库

Posted

技术标签:

【中文标题】在 Proguard 构建中未使用脚本插入 Sqlite 数据库【英文标题】:Sqlite Database not inserted Using Script in Proguard Build 【发布时间】:2015-04-19 02:13:32 【问题描述】:

即使在卸载应用程序后,我也必须显示数据库中的一些数据。 为此,我正在为该插入操作编写脚本。 在重新安装时,我正在使用 db.execSQL(toExec); 执行保存在 sdcard 上的脚本;陈述。 使用以下代码片段

//write code to execute script from file 
                        SQLiteDatabase db = helper.getWritableDatabase();
                        BufferedReader reader = null;
                        try 
                            reader = new BufferedReader(new FileReader(Constants.DIR_PATH+"/"+Constants.SCRIPT_FILE_NAME));
                            String line;
                            while((line = reader.readLine())!=null)
                            
                                line.trim();
                                AppLog.d(TAG, "Execute script with line: "+line);
                                try
                                
                                    db.execSQL(line);
                                
                                catch(SQLiteException e)
                                
                                    AppLog.d(TAG, "Sqlite Excp with Line: "+line+e);
                                
                            
                         catch (FileNotFoundException e1) 
                            // TODO Auto-generated catch block
                            AppLog.d(TAG, "File Not Found to execute Script"+e1);
                        
                        catch (IOException e) 
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        

这在正常构建中工作正常。 但是插入不是在 Proguard 构建中完成的。 另请注意,对于数据库操作,我使用的是 ORMLite。并且在执行脚本的时候已经创建了数据库

我在 proguard-project.txt 中添加了以下属性

-keep class com.j256.**
-keepclassmembers class com.j256.** 
            *;
      
-keep public class android.database.sqlite.**

我不知道发生了什么。

请帮忙...

【问题讨论】:

请提供您的代码 我添加了代码你能找出我错在哪里 Proguard 正在重命名您的数据库类和其他字段。您需要排除它们 你能指导我如何防止 Proguard 重命名它们 【参考方案1】:

我发现 Proguard 正在重命名 DB 类和其他字段。 正如@jim 评论的那样。 所以我在 proguard-project.txt 文件中添加了以下配置语句来解决问题

-keep class com.db.models.**
-keepclassmembers class com.db.models.**  *;   

com.db.models 是保存数据库实体类的包名。

【讨论】:

【参考方案2】:

以防万一有人仍然访问此页面,这是我的经验。 我花了半天时间才弄明白。

我正在使用资产文件夹中的地图 html 文件,该文件正在从 sqlite db 获取数据(标记)。 地图(html)显示正确,但是数据被proguard弄乱了,所以标记没有显示。

您基本上需要保留数据库中涉及数据处理的所有内容。每个班级及其私人和公共的东西。 这是我的 proguard 文件中的全部内容:

-keep public class au.com.yourpackage.LocjavascriptInterface
-keepclassmembers class au.com.yourpackage.LocJavaScriptInterface 
   public *;
   private *;

-keepattributes JavascriptInterface

-keep public class au.com.yourpackage.MyLocationsDbHelper
-keepclassmembers class au.com.yourpackage.MyLocationsDbHelper 
   public *;
   private *;


-keep public class au.com.yourpackage.MyLocationsListAdapter
-keepclassmembers class au.com.yourpackage.MyLocationsListAdapter 
   public *;
   private *;


-keep public class au.com.yourpackage.MyLocationsModel
-keepclassmembers class au.com.yourpackage.MyLocationsModel 
   public *;
   private *;

希望对你有帮助。

【讨论】:

以上是关于在 Proguard 构建中未使用脚本插入 Sqlite 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Proguard 删除 Google Play Services 库中未使用的类

sh 要在构建阶段添加的脚本,以便删除FAT框架中未使用的arch。 (Xcode中)

Sql 语句:在要插入的字段中未指定主键时,插入键更新未按预期工作

如何在构建时使用数据库项目执行主数据 sql 脚本

未创建 Proguard 文件

使用 Ant 和 Proguard 编译 Android 应用程序的问题