Android Smali - javax.mail 未找到

Android Smali - javax.mail not found

我创建了一个 Android 应用程序,它通过 JavaMail 发送电子邮件并且运行良好。现在我需要获取Smali代码以将其放入另一个应用程序(学校项目,不用担心)。

然而,如果我 "decompile" 带有 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.call(AsyncTask.java:345)
W System.err:   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W System.err:   at android.os.AsyncTask$SerialExecutor.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 总是从项目 "root" 调用(例如:Ljavax/mail/Authenticator;-><init>()V),这应该是正确的,因为 javax 文件夹是在那个位置。

我正在使用:apktool d appname.apkapktool b project_dir 进行重建。

几乎可以肯定,您的构建过程已经从 JavaMail 所需的关联激活库中删除了部分或全部 META-INF 资源。这些是 Activation 提供的邮件程序和消息资源,需要在运行时位于类路径中。

这是堆栈跟踪中 "no object DCH for MIME type multipart/mixed" 消息的常见原因。

由于我完全了解您是如何构建交付成果的,因此我只能推荐:

  • 使用JavaMail for Android。这最大限度地减少了在 Android 运行时中永远找不到的悬空引用,并提供了一个最小的激活库。
  • 确保您的构建系统不会从激活中删除 META-INF 资源。 (根据我不想消失的另一位贡献者的评论,这可能意味着调用类似 apktool b -c project_dir 的东西;-c 保留原始签名,其中包括 META-INF 文件夹。)

这可能还意味着您需要仔细查看 Proguard(如果您使用它)以确保它也不会剥离反射等发现的任何内容。

JavaMail 似乎将资源存储在您应用的 META-INF 文件夹中。通常使用 Android,这是存储应用程序签名的位置,因此 APKTool 在您重建时默认避免包含它(使用它意味着您无法删除资源或编辑清单)。

APKTool 有一个构建选项:-c。这将通过将整个 META-INF 文件夹复制到新 APK 中来保留原始签名。你通常不想使用这个选项,因为正如我上面所说,这意味着你不能删除资源或编辑清单,但为此,它会做你需要的。

如果有时无法使用原始签名,您可以手动找到 JavaMail 文件并将其复制到重新安装 APK 后创建的新 META-INF 文件夹中。