Android Smali - javax.mail не найден - PullRequest
       75

Android Smali - javax.mail не найден

0 голосов
/ 17 сентября 2018

Я создал приложение для Android, которое отправляет электронные письма через JavaMail , и оно отлично работает. Теперь мне нужно получить код Smali, чтобы поместить его в другое приложение (школьные проекты, не волнуйтесь).

Однако, если я "декомпилирую" файл apk с помощью apktool и (без внесения каких-либо изменений) перестрою его, приложение, похоже, не найдет необходимые классы.

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 всегда вызывается из проекта "root" (например, Ljavax/mail/Authenticator;-><init>()V), и это должно быть правильно, поскольку папка javax находится в этой позиции.

Я использую: apktool d appname.apk и apktool b project_dir для восстановления.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Кажется, что JavaMail хранит ресурсы в папке META-INF вашего приложения.Обычно в Android это место, где хранится подпись приложения, поэтому APKTool избегает включать его по умолчанию при перестроении (использование этого означает, что вы не можете удалять ресурсы или редактировать манифест).

В APKTool есть опциядля строительства: -c.Это сохранит оригинальную подпись, скопировав всю папку META-INF в новый APK.Обычно вы не хотите использовать эту опцию, поскольку, как я уже сказал выше, это означает, что вы не можете удалять ресурсы или редактировать манифест, но для этого он будет делать то, что вам нужно.

Если естькогда вы не можете использовать оригинальную подпись, вы, вероятно, можете вручную найти файлы JavaMail и скопировать их в новую папку META-INF, созданную после отставки APK.

0 голосов
/ 17 сентября 2018

Почти наверняка ваш процесс сборки удалил некоторые или все ресурсы META-INF из связанной библиотеки активации, требуемой JavaMail. Это ресурсы почтовой программы и сообщений, предоставляемые активацией, которые должны находиться в пути к классам во время выполнения.

Это обычная причина появления сообщений «без объекта DCH для составных / смешанных типов MIME» в стековых трассах.

Поскольку я не полностью не понимаю, как вы строите свой результат, я могу только порекомендовать:

  • Использовать JavaMail для Android . Это минимизирует свисающие ссылки, которые никогда не будут найдены во время выполнения Android, и обеспечивает минимальную библиотеку активации.
  • Убедитесь, что ваша система сборки не удаляет ресурсы META-INF из Активации. (Исходя из комментария другого автора, я не хочу исчезать, это может означать, что вы вызываете что-то вроде apktool b -c project_dir; -c сохраняет оригинальную подпись, которая включает папку META-INF.)

Это также может означать, что вам нужно присмотреться к Proguard (если вы его используете), чтобы убедиться, что он также не удаляет все, что найдено Reflection и т. Д.

...