Android Smali-找不到javax.mail

时间:2018-09-17 15:58:24

标签: android javamail smali apktool

我创建了一个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.apkapktool b project_dir进行重建。

2 个答案:

答案 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”消息的常见原因。

由于我不完全不了解您如何构建可交付成果,因此我只能建议:

  • 使用JavaMail for Android。这样可以最大程度地减少在Android运行时中找不到的悬空引用,并提供最少的激活库。
  • 确保您的构建系统没有从激活中剥离META-INF资源。 (基于我不想消失的其他贡献者的评论,这可能意味着调用诸如apktool b -c project_dir-c之类的东西会保留原始签名,其中包括META-INF文件夹。)

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