我正在使用Android Studio中的proguard构建一个Android应用程序,我的项目有一个库jar(na.jar),我想跳过混淆和预验证,因为来自na.jar的一些类在构建过程中给了我错误.所以在我的proguard配置文件中,我有以下选项
-dontpreverify
# com.na, org.json are packages in na.jar, don't obfuscate the code in these packages
-keep class com.na.** { *; }
-keep interface com.na.** { *; }
-keep class org.json.** { *; }
-keep interface org.json.** { *; }
Run Code Online (Sandbox Code Playgroud)
但是,在构建过程中,我仍然遇到与na.jar中的错误类相关的以下错误.
Caused by: java.io.IOException: Can't read [C:\StudioProjects\PBActivity\pBActivity\libs\na.jar(;;;;;;!META-INF/MANIFEST.MF)] (Can't process class [com/na/util/BinConverter.class] (256))
at proguard.InputReader.readInput(InputReader.java:188)
at proguard.InputReader.readInput(InputReader.java:158)
at proguard.InputReader.readInput(InputReader.java:136)
at proguard.InputReader.execute(InputReader.java:66)
at proguard.ProGuard.readInput(ProGuard.java:207)
at proguard.ProGuard.execute(ProGuard.java:81)
at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
at com.android.build.gradle.tasks.AndroidProGuardTask.proguard(AndroidProGuardTask.java:87)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
... 62 more
Caused by: java.io.IOException: Can't process class …Run Code Online (Sandbox Code Playgroud) java android ioexception indexoutofboundsexception android-proguard
我在AndroidStudio 1.2.1.1中使用ProGuard和Gradle 1.2.3.
My Gradle的发布版本配置如下:
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
Run Code Online (Sandbox Code Playgroud)
我希望类的私有字段被混淆.
这是我的proguard配置文件(经过多次尝试)截至目前:
-allowaccessmodification
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-verbose
[...]
Run Code Online (Sandbox Code Playgroud)
但是在使用androddAndroidGuard 反编译后,我最终得到:
private com.google.android.gms.common.api.GoogleApiClient googleApiClient;
Run Code Online (Sandbox Code Playgroud)
我知道这种混淆的使用是有限的,但我想googleApiClient由ProGuard重命名.怎么办?
这是refcard.
有没有办法做相反的事情-keepclassmembernames?
我正在开发SDK,我的环境有SDK库和使用它的测试项目.
我想保护我的库代码免受我的库用户的影响,因为我需要对其进行模糊处理,只是它.
所以在我的库Module中的Android Studio中,在proguard-rules.pro文件中我添加了下一个脚本:
-dontpreverify
-optimizations !code/simplification/arithmetic
-keep class !com.example.**{ *; }
-keep public class com.example.sdk.Example{*;}
-keep public class com.example.sdk.IExampleCallback{*;}
-keep public class com.example.sdk.ui.ExampleActivity
-dontwarn android.util.Log
-repackageclasses 'com.example.security'
-allowaccessmodification
Run Code Online (Sandbox Code Playgroud)
这些类被混淆,但它们的包不会改变.我让Eric Lafortune(Proguard的作者)建议添加allowaccessmodification,但它没有帮助.我也尝试使用flattenpackagehierarchy,但它没有效果.
帮助我,如何将我的所有课程放在一个包中?
将Google Play服务更新为11.8.0(从11.6.2开始)后,我的版本停止运行.
这就是我得到的:
计算堆栈大小时出现意外错误:Class = [com/google/android/gms/internal/zzao] Method = [zzf(Ljava/lang/String;)J] Exception = [java.lang.IllegalArgumentException](堆栈大小变为负数)在[com/google/android/gms/internal/zzao.zzf(Ljava/lang/String;)J]中指令[23] invokestatic#146之后失败:构建失败并出现异常.
我正在使用带有Gradle 4.4.1的Android Studio 3.0.1
我的app build.gradle文件
buildscript {
repositories {
maven { url "https://maven.fabric.io/public" }
}
dependencies {
classpath "io.fabric.tools:gradle:1.25.1"
}
}
repositories {
maven { url "https://maven.fabric.io/public" }
}
apply plugin: "com.android.application"
apply plugin: "io.fabric"
apply plugin: "let"
apply plugin: "realm-android"
android {
compileSdkVersion project.androidSDKVersion
buildToolsVersion("$androidBuildToolsVersion")
defaultConfig {
versionCode project.versionCode
versionName project.versionName
minSdkVersion project.androidMinSdkVersion
targetSdkVersion project.androidTargetSdkVersion
vectorDrawables.useSupportLibrary = true
resConfigs "pl"
}
buildTypes {
release { …Run Code Online (Sandbox Code Playgroud) 类似的问题已经被要求了.但是由于Android平台兼容性的变化,这个似乎比以前的更复杂.
这是Pixel和Pixel2的错误日志,已注册Android Beta程序
08-16 13:20:53.146 9630-9630/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: me.project.android.dev, PID: 9630
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactory;
at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41)
at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43)
//project specific class reference removed
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.commons.logging.LogFactory" on path: DexPathList[[zip file "/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk"],nativeLibraryDirectories=[/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/lib/arm64, /data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41)
at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43)
//project specific class reference removed
at android.os.Handler.handleCallback(Handler.java:873)
at …Run Code Online (Sandbox Code Playgroud) android amazon-web-services android-proguard aws-sdk-android
我有以下代码:
public class MyClass {
public void method1(Integer marks) {
}
private String method3(String name){
}
public interface interface1 {
void method4(Integer ID);
void method5(Integer rate, boolean status);
}
}
Run Code Online (Sandbox Code Playgroud)
我用过progaurd-rules.pro
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keepparameternames
-keep public class *
-keepclassmembers public class *{
public *;
}
-keep public interface packageName.MyClass$interface1 { *; }
Run Code Online (Sandbox Code Playgroud)
混淆代码如下:
public class MyClass {
public void method1(Integer marks) {
}
private String a(String var1){
}
public interface interface1 {
void method4(Integer var1);
void method5(Integer var1, boolean var2); …Run Code Online (Sandbox Code Playgroud) 从3.1.4升级到Android Gradle插件到3.2.x后,我收到多个警告,例如:
D8: Type `com.google.gson.reflect.TypeToken` was not found, it is required for default or static interface methods desugaring of `com.google.gson.reflect.TypeToken org.springframework.http.converter.json.GsonHttpMessageConverter.getTypeToken(java.lang.reflect.Type)`
D8: Type `com.squareup.okhttp.MediaType` was not found, it is required for default or static interface methods desugaring of `com.squareup.okhttp.MediaType org.springframework.http.client.OkHttpClientHttpRequest.getContentType(org.springframework.http.HttpHeaders)`
D8: Type `org.apache.http.impl.client.HttpClients` was not found, it is required for default or static interface methods desugaring of `void org.springframework.http.client.HttpComponentsClientHttpRequestFactory.<init>()`
D8: Interface `org.apache.http.HttpEntity` not found. It's needed to make sure desugaring of `org.springframework.http.client.HttpComponentsStreamingClientHttpRequest$StreamingHttpEntity` is correct. Desugaring will assume that this interface …Run Code Online (Sandbox Code Playgroud) android proguard android-gradle-plugin android-proguard android-d8
将我的Android项目转换为Kotlin后,我无法构建发布版本,错误似乎与Proguard有关.
我看到155个警告
Warning:com.example.app.activity.MainActivity$1: can't find referenced field 'android.view.View decorView' in program class com.example.app.activity.MainActivity
Warning:com.example.app.activity.MainActivity$2: can't find referenced field 'android.os.Handler handler' in program class com.example.app.activity.MainActivity
Run Code Online (Sandbox Code Playgroud)
并且构建失败了
Error:Execution failed for task ':MyApp:transformClassesAndResourcesWithProguardForFreeRelease'.
> Job failed, see logs for details
Run Code Online (Sandbox Code Playgroud)
如果我将build.grade中的这些指令从true更改为false,则构建成功.
minifyEnabled true
shrinkResources true
Run Code Online (Sandbox Code Playgroud)
关于问题可能是什么的任何建议?
编辑:
proguard文件如下:
ProGuard的-android.txt
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps …Run Code Online (Sandbox Code Playgroud) 我已经使用Cling创建了应用程序并且工作正常但是当我创建发布版本时,我得到以下消息并且渲染器上没有任何内容:
11-22 16:24:53.341 20172-20172/? I/RendererCommand? TrackMetadata : TrackMetadata [id=1, title=IMG-20151120-WA0007, artist=, genre=, artURI=res=http://192.168.1.4:8089/1.jpg, itemClass=object.item.imageItem]
11-22 16:24:53.345 20172-20172/? V/RendererCommand? Resume
11-22 16:24:53.351 20172-20301/? W/RendererCommand? Fail to stop ! Error: Current state of service prevents invoking that action. Error writing request message. Can't transform message payload: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType. (HTTP response was: 500 Internal Server Error)
11-22 16:24:53.351 20172-20301/? I/RendererCommand? Set uri to http://192.168.1.4:8089/1.jpg
11-22 16:24:53.353 20172-20386/? D/RendererCommand? Update state !
11-22 16:24:53.354 20172-20264/? W/RendererCommand? Fail …Run Code Online (Sandbox Code Playgroud) 我的应用程序的方法计数高于64k限制,所以我使用Proguard来减少它.
一切都适用于发布版本.
另一方面,调试版本仅适用于Lollipop +设备.在Lollipop之前的设备上启动时,我总是有臭名昭着的错误:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
这是我在app level gradle文件中的内容:
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试minifyEnabled true在调试版本中删除,然后在Lollipop +上构建失败,因此proguard正在工作!但不是在棒棒糖前.
因为我知道minifyEnabled不应该依赖于平台,所以也许构建过程会在Lollipop之前的设备上跳过它(因为我不知道是什么原因).
有人知道这个问题的解决方案吗?
PS.我知道multidex的可能性,但我将它作为我的最后手段.
编辑:
这是app level gradle文件的完整代码:
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
apply plugin: 'me.tatarka.retrolambda'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5'
}
}
android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig …Run Code Online (Sandbox Code Playgroud) android ×10
android-proguard ×10
proguard ×5
java ×2
obfuscation ×2
android-d8 ×1
ioexception ×1
kotlin ×1
upnp ×1