“调试为”与导出的 APK 有啥区别

Posted

技术标签:

【中文标题】“调试为”与导出的 APK 有啥区别【英文标题】:What are the differences in "debug as" vs exported APK“调试为”与导出的 APK 有什么区别 【发布时间】:2013-09-15 18:55:18 【问题描述】:

没有棉绒标记。当通过我通过 Eclipse 插入计算机的每个设备进行调试时,paypal sdk 组件工作得非常好。当我将项目导出为 APK 时,当我到达应用程序的贝宝部分时,它“不幸地停止了”。调试运行与编译的 apk 文件的主要区别是什么?再次,当以调试方式运行时,实时支付服务在项目中运行良好。此项目中没有对 SHA1 差异敏感的 API 密钥(签名 apk 与调试)。

以下是我从通过 apk 安装的应用程序的报告中可以看到的一些情况:

java.lang.NoSuchMethodError: no method with name='onEdgeUpdate'   signature='(Lio/card/payment/DetectionInfo;)V' in class Lio/card/payment/CardScanner;
at java.lang.Runtime.nativeLoad(Native Method)
at java.lang.Runtime.doLoad(Runtime.java:418)
at java.lang.Runtime.loadLibrary(Runtime.java:359)
at java.lang.System.loadLibrary(System.java:525)
at io.card.payment.CardScanner.<clinit>(Unknown Source)
at io.card.payment.z.c(Unknown Source)
at io.card.payment.z.a(Unknown Source)
at io.card.payment.CardIOActivity.a(Unknown Source)
at io.card.payment.CardIOActivity.a(Unknown Source)
at com.paypal.android.sdk.payments.PaymentMethodActivity.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5133)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

在调试模式下,当我按下结帐按钮时它工作正常,但这是 logcat 中的内容,也许有人可以看到一些东西:

09-11 12:43:32.932: D/dalvikvm(10630): Trying to load lib /data/app-lib/com.direction.investor.bcms-2/libcardioDecider.so 0x4219ac28
09-11 12:43:32.932: D/dalvikvm(10630): Added shared lib /data/app-lib/com.direction.investor.bcms-2/libcardioDecider.so 0x4219ac28
09-11 12:43:32.932: D/dalvikvm(10630): Trying to load lib /data/app-lib/com.direction.investor.bcms-2/libopencv_core.so 0x4219ac28
09-11 12:43:32.932: D/dalvikvm(10630): Added shared lib /data/app-lib/com.direction.investor.bcms-2/libopencv_core.so 0x4219ac28
09-11 12:43:32.942: D/dalvikvm(10630): No JNI_OnLoad found in /data/app-lib/com.direction.investor.bcms-2/libopencv_core.so 0x4219ac28, skipping init
09-11 12:43:32.942: D/dalvikvm(10630): Trying to load lib /data/app-lib/com.direction.investor.bcms-2/libopencv_imgproc.so 0x4219ac28
09-11 12:43:32.942: D/dalvikvm(10630): Added shared lib /data/app-lib/com.direction.investor.bcms-2/libopencv_imgproc.so 0x4219ac28
09-11 12:43:32.942: D/dalvikvm(10630): No JNI_OnLoad found in /data/app-lib/com.direction.investor.bcms-2/libopencv_imgproc.so 0x4219ac28, skipping init
09-11 12:43:32.942: D/dalvikvm(10630): Trying to load lib /data/app-lib/com.direction.investor.bcms-2/libcardioRecognizer.so 0x4219ac28
09-11 12:43:32.952: D/dalvikvm(10630): Added shared lib /data/app-lib/com.direction.investor.bcms-2/libcardioRecognizer.so 0x4219ac28

【问题讨论】:

您的方法 onEdgeUpdate() 是否在按钮的 onClick 属性中的 xml 中声明? 我认为 Nitin 做到了。这可能是一个proguard混淆问题。您可以添加保护该方法的 proguard 设置,或者您应该从 XML 文件中删除任何类型的方法名称引用(更好的选择)并在代码中设置点击侦听器等。 @NitinSethi 我不认识这种方法。它必须是贝宝库的一部分,因为它肯定不在我的任何 xml 文件中。当我按下结帐按钮时,应用程序并没有完全停止,paypal 组件在屏幕上非常短暂地闪烁。 @NobuGames 我从没想过 ProGuard。我敢打赌我遗漏了一些东西。可能是这样:在 proguard-paypal.cnf .. 谢谢 您是否保存了作为 Pro-guards 混淆的输出之一的 mapping.txt 文件。您可以获得有关问题来源的更多信息,因为您可以确定那些 z.c 和 z.a 是什么。有关 mapping.txt 的更多详细信息,请点击此处。 developer.android.com/tools/help/proguard.html#considerations 【参考方案1】:

根据 developer.android 的说法,“ProGuard 工具通过删除未使用的代码并重命名具有语义模糊名称的类、字段和方法来缩小、优化和混淆代码。结果是一个更小的 .apk 文件很难进行逆向工程。”

我未能包括:

 @proguard-paypal.cnf marker in the proguard-project.txt

有关 android paypal sdk 的未来参考,请参阅https://github.com/paypal/PayPal-Android-SDK。

【讨论】:

以上是关于“调试为”与导出的 APK 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:build/app/outputs下的apk/release目录和flutter-apk目录有啥区别?

svn忽略文件中,括号内有recursively与没有,有啥区别?(如下图)

Eclipse和Android Studio导出的Android apk的区别

在“.d.ts”文件中使用“导出声明函数”和“导出函数”有啥区别

预处理、指令和混入之间有啥区别?

Android每日一题:v3签名key和v2还有v1有啥区别