我创建了一个Android应用程序,该应用程序通过JavaMail发送电子邮件,并且运行正常。现在,我需要获取Smali代码以将其放入另一个应用程序中(学校项目,不用担心)。
但是,如果我使用apktool“反编译” apk文件并且(没有进行任何更改)重新构建它,则应用程序似乎找不到所需的类。
adb logcat
显示:
W javax.mail: expected resource not found: {0}
随之而来的是一系列错误:
W System.err: javax.mail.MessagingException: IOException while sending message;
W System.err: nested exception is:
W System.err: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
W System.err: boundary="----=_Part_0_234635997.1537189564327"
W System.err: at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1365)
W System.err: at javax.mail.Transport.send0(Transport.java:255)
W System.err: at javax.mail.Transport.send(Transport.java:124)
W System.err: at com.example.sec.screentest.MainActivity$MailTask.doInBackground(MainActivity.java:164)
W System.err: at com.example.sec.screentest.MainActivity$MailTask.doInBackground(MainActivity.java:124)
W System.err: at android.os.AsyncTask$2.call(AsyncTask.java:345)
W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W System.err: at java.lang.Thread.run(Thread.java:784)
W System.err: Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
W System.err: boundary="----=_Part_0_234635997.1537189564327"
W System.err: at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:908)
W System.err: at javax.activation.DataHandler.writeTo(DataHandler.java:330)
W System.err: at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1694)
W System.err: at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913)
W System.err: at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1315)
W System.err: ... 10 more
查看Smali代码,总是从项目“根”(例如:javax.mail
)调用Ljavax/mail/Authenticator;-><init>()V
,这应该是正确的,因为javax
文件夹处于该位置。
我正在使用:apktool d appname.apk
和apktool b project_dir
进行重建。
答案 0 :(得分:2)
似乎JavaMail将资源存储在应用程序的META-INF文件夹中。通常在Android上,这是应用程序签名的存储位置,因此APKTool会在您重建时默认避免包括它(使用它意味着您无法删除资源或编辑清单)。
APKTool有一个用于构建的选项:-c
。通过将整个META-INF文件夹复制到新的APK中,这将保留原始签名。您通常不希望使用此选项,因为如上所述,这意味着您无法删除资源或编辑清单,但为此,它将满足您的需要。
如果曾经有一段时间无法使用原始签名,则可以手动找到JavaMail文件,并将其复制到辞职APK之后创建的新META-INF文件夹中。
答案 1 :(得分:0)
几乎可以肯定,您的构建过程已经从JavaMail所需的关联激活库中剥离了部分或全部META-INF资源。这些是Activation提供的邮件程序和消息资源,需要在运行时位于类路径上。
这是在堆栈跟踪中显示“ MIME类型为multipart / mixed的无对象DCH”消息的常见原因。
由于我不完全不了解您如何构建可交付成果,因此我只能建议:
apktool b -c project_dir
; -c
之类的东西会保留原始签名,其中包括META-INF文件夹。)这也可能意味着您需要仔细查看Proguard(如果使用它),以确保这也不会剥夺Reflection等发现的任何内容。