我有一个可在调试中运行的Android应用,我正尝试使用proguard将其发布。
在我拥有的应用中
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
将minifyEnable设置为false,它可以工作-但这意味着我没有使用proguard。错误是:
com.jjoe64.graphview.helper.GraphViewXML: can't find referenced class com.jjoe64.graphview.R$styleable
com.jjoe64.graphview.helper.GraphViewXML: can't find referenced class com.jjoe64.graphview.R
ioio.lib.android.accessory.Adapter: can't find referenced class com.android.future.usb.UsbManager
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbAccessory
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbManager
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbAccessory
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbManager
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbAccessory
ioio.lib.android.accessory.Adapter$LegacyUsbManager: can't find referenced class com.android.future.usb.UsbManager
there were 24 unresolved references to classes or interfaces.
Exception while processing task java.io.IOException: Please correct the above warnings first.
proguard规则为(其他行)
#-dontwarn com.jjoe64.graphview.*
#-dontwarn ioio.lib.android.accessory.*
#-keep class com.jjoe64.graphview.** { *; }
#-keep class com.android.future.usb.** { *; }
#-keep class ioio.android.accessory.** { *; }
如果我取消注释2条Dontwarn行,它将编译但无法运行。 jjoe64绘图例程将正确运行,但不能运行ioio部分。我知道这一点是因为我可以导入以前在调试模式下完成的运行并显示图形。这意味着我可以不为jjoe64使用dontwarn。
我还是尽我所能为jjoe64保留类,只是试图使语法正确。我搜索了可以找到的内容,但似乎没有正确编译。因此,即使我真的不需要这样做,我还是想先弄清楚我需要对jjoe64的keep类进行什么才能使其编译。然后希望我能够在ioio案件中取得进展。
编辑
我想添加一个伪造的例程,我试图强制Proguard保留一个ioio类。我认为也许我可以将警告数量至少减少1。结果是-毫无变化。 (然后我注释掉了例程,因为它没有帮助。)
/* boolean setupImports() {
UsbManager mMan = (UsbManager) getSystemService(Context.USB_SERVICE);
if(mMan == null) return false;
return true;
}*/
答案 0 :(得分:0)
Add following lines to proguard rules and check the build output. 'printseeds' will list all the classes which are kept, this is to confirm if app is including intended classes.
-keepnames class com.jjoe64.graphview.** { *; }
-keepnames class com.android.future.usb.** { *; }
-keepnames class ioio.android.accessory.** { *; }
-printseeds
答案 1 :(得分:0)
在阅读了有关proguard的大量文档后,我仍然找不到有效的答案。有时会有Android Studio的更新,我会在有可用更新时始终进行安装。
最新更新为3.4。我期望进行一些小的更改,但是没有什么可以解决我的proguard问题。当然,我尝试生成一个签名的apk。令我惊讶的是,它没有出现任何错误。我当时不在家,但正在使用笔记本电脑。我不知道魔术是否会扩展到我的主计算机。
最新的升级完全解决了这个问题,真是太好了。我的proguard-rules.pro是默认文件,所有失败的尝试都被注释掉了。问题根本就解决了,它“开箱即用”。因此,从我的角度来看,最新的升级版3.4是一项重要的升级,不容错过。
感谢Android Studio开发人员。
编辑:效果不如第一个站点好。仍然最重要的一点是以前的版本中列出了警告,必须对其进行修复,无论我做了什么,它们都从未被修复。
新版本没有任何必须修复的错误,因此我可以进行实际检查。这本身就是一个巨大的优势。
我发现proguard在消除阶级方面过于野心勃勃。它将apk减小到859.7 kB,但是该应用程序缺少所需的类。 首先我尝试了
-keep class ** {*;}
这使我的程序继续进行,但apk的大小跃升至1.4 mB。终于找到了
-keep class ioio.lib.android.** { *; }
保留了我需要的课程,并使其apk大小为900.6 kB