Proguard反混淆找不到行号

7
我正在尝试反混淆我的Android应用程序的堆栈跟踪。我在构建应用程序时使用了Proguard,并且运行retrace似乎有效,或多或少。
不起作用的是解码行号。输出中没有显示行号,并且对于每个“at”,它列出了几个选择项。
这是我的proguard-project.txt文件:
-keepattributes LineNumberTable
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
}

这是我的堆栈跟踪信息:
uncaught exception
java.lang.NullPointerException
at com.myapp.myapp.dbaccess.ag.a(Unknown Source)
at com.myuapp.myapp.dbaccess.x.a(Unknown Source)
at com.myapp.myapp.dbaccess.x.a(Unknown Source)
at com.myapp.myapp.main.ab.run(Unknown Source)

以下是输出结果:

uncaught exception
java.lang.NullPointerException
at com.myapp.myapp.dbaccess.ZNodeCache.com.myapp.myapp.dbaccess.ZNode getNodeFromCache(long)(Unknown Source)
                                             com.myapp.myapp.dbaccess.ZRoot getRootFromCache()
                                             com.myapp.myapp.dbaccess.ZNode getNodeFromDb(long,boolean)
                                             com.myapp.myapp.dbaccess.ZNode$Array getChildrenForExport(com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ...
at com.myapp.myapp.dbaccess.XmlImport.com.myapp.myapp.dbaccess.XmlImport$Results importFile(java.lang.String)(Unknown Source)
                                            void _doImport(java.io.InputStream,com.myapp.myapp.dbaccess.XmlImport$Results)
                                            void importFile(java.io.InputStream)
                                            void importNode(org.xmlpull.v1.XmlPullParser,com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ...
at com.myapp.myapp.dbaccess.XmlImport.com.myapp.myapp.dbaccess.XmlImport$Results importFile(java.lang.String)(Unknown Source)
                                            void _doImport(java.io.InputStream,com.myapp.myapp.dbaccess.XmlImport$Results)
                                            void importFile(java.io.InputStream)
                                            void importNode(org.xmlpull.v1.XmlPullParser,com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ...
at com.myapp.myapp.main.MainActivity$3.void run()(Unknown Source)

我一定是漏了其他的配置参数,你有什么想法吗?

1个回答

23

原来答案在Android文档中(信不信由你)。我第一次可能错过了它。你需要指定源文件,像这样:

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

renamesourcefileattribute会使所有的源文件都具有名称SourceFile(或您放置的任何名称)。“retrace”不关心源文件名是什么,但如果您省略它,则决定忽略行号。

此代码应该放在proguard-project.txt中,如果您正在使用Android Studio,则可以在“your project”.app中找到该文件。


2
你的回答引导我到了http://proguard.sourceforge.net/manual/examples.html#stacktrace,其中包含了额外的一行-printmapping out.map。 - Mick
你把这些代码放在哪个文件里了?我已经尝试将它们放在Android Studio的proguard-rules.pro文件中,但行号还没有出现。 - codelearner
In proguard-project.txt - Peri Hartman
4
这会让试图反向工程你的代码的人更容易吗? - voxoid
@voxoid 我也有同样的问题。那么,有人在这个问题上有答案吗(四年后)? - ch271828n
@ch271828n 你可以安装“jadx”并自行查看smali。我认为不需要,因为即使没有这些proguard,它仍将保留相对行号信息。 - rez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接