我正在使用proguard来混淆我的代码,并且我有一个称为库的模块,在该模块中我有一个资产文件夹,并且我保留了一些在运行时使用的 jar。我想将该资产文件夹保留在混淆器中。
这是它的结构:
我怎样才能保留这些?或者我们如何在ProGuard中传递文件的路径?
我最近将 Android 应用程序项目中的 Android Gradle 插件从版本 7.4.2 升级到 8.0.2。但是,当执行 minifyReleaseWithR8 任务时,我现在在发布构建期间遇到错误。
我收到的错误消息如下:
Task :app:minifyReleaseWithR8
AGPBI: {"kind":"error","text":"Library class android.test.AndroidTestRunner extends program class junit.runner.BaseTestRunner","sources":[{}],"tool":"R8"}
Library class android.test.AndroidTestRunner extends program class junit.runner.BaseTestRunner
AGPBI: {"kind":"error","text":"Library class android.test.InstrumentationTestCase extends program class junit.framework.TestCase","sources":[{}],"tool":"R8"}
Library class android.test.InstrumentationTestCase extends program class junit.framework.TestCase
Task :app:minifyReleaseWithR8 FAILED
Run Code Online (Sandbox Code Playgroud)
该错误似乎与缺少服务类以及库类和程序类之间的冲突有关。
这些错误是在我更新 Android Gradle 插件后才开始出现的。我已尝试清理项目并确保所有依赖项都是最新的,但问题仍然存在。
有其他人在升级到 Android Gradle Plugin 8.0.2 时遇到过类似的问题吗?如何解决这些错误并成功缩小 R8 的发布版本?
任何帮助或建议将不胜感激。谢谢你!
proguard 中的否定符(感叹号)应该允许我保留 apache 库之外的其他内容:
-keep class !org.apache.**
Run Code Online (Sandbox Code Playgroud)
根据这些答案。这就是要走的路:
但是,它混淆了我的 APK 中的所有类。
这是我的 build.gradle 的一部分(我有 Android Studio 3.5.3)
compileSdkVersion 29
buildToolsVersion "29.0.2"
//...
buildTypes {
release {
minifyEnabled true
proguardFiles /*getDefaultProguardFile('proguard-android.txt'),*/ 'proguard-rules.pro'
// Enables resource shrinking, which is performed by the
// Android Gradle plugin.
shrinkResources false
}
}
dependencies {
//Utility libs
implementation 'org.apache.commons:commons-collections4:4.1'
implementation 'org.apache.commons:commons-lang3:3.4'
implementation group: 'commons-io', name: 'commons-io', version: '2.5'
}
Run Code Online (Sandbox Code Playgroud)
添加 …
当我之前发布我的应用程序时,一切进展顺利,但现在我尝试上传我的应用程序的新版本,Google Play 说其中有一些 java/kotlin 代码,并要求我上传一个反混淆 txt 文件。我一直在寻找答案,人们提到了 android studio 在您使用 proguard 或 R8 代码收缩器时创建的“mapping.txt”文件。
有谁知道我可以在哪里生成这样的文件或者它可能在哪里?
注意:自从上次更新应用程序以来,我没有添加或升级任何 nuget 软件包,并且我已经查看了 bin/obj 文件夹,但没有成功。我还检查了捆绑应用程序时创建的存档文件夹。
xamarin.android google-play xamarin.forms android-r8 visual-studio-2019
我正在尝试弄清楚如何使用 R8 保留原始行号。
使用当前的 AndroidStudio 制作应用程序并使用 R8 对其进行混淆,甚至将mapping.txt文件上传到 Google Play Console,用户的堆栈跟踪在某些情况下是无用的,因为崩溃的行与真实的非混淆文件中的行不同。
com.mypackage.activities.ManagerActivity.onCreate (ManagerActivity.java:3052)这是一个示例,我的类没有3000行,但是在第3052行( )报错:
Caused by: java.lang.NullPointerException:
at com.mypackage.activities.ManagerActivity.onCreate (ManagerActivity.java:3052)
at android.app.Activity.performCreate (Activity.java:7136)
at android.app.Activity.performCreate (Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2990)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3148)
at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1861)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:193)
at android.app.ActivityThread.main (ActivityThread.java:6819)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:497)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:912)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 R8 和 AndroidStudio 获取错误的真实行号?请记住,此代码已使用mapping.txt 文件进行反混淆
将 Gradle 插件升级到 4.2.0 后(在此之前,我没有这个问题),在构建发布版本时,XML 资源文件的名称似乎发生了更改,例如从 更改res/xml/settings_master_switch_1.xml为res/cb1.xml.
这给我编写的库带来了问题,因为它采用 xml 中给出的资源名称,例如
<com.smp.masterswitchpreference.MasterSwitchPreference
..
app:ms_includedPrefScreen="@xml/settings_master_switch_1" />
Run Code Online (Sandbox Code Playgroud)
并使用此函数查找资源 id
fun resInt(resName: String?, type: String): Int? {
resName ?: return null
val f = File(resName).nameWithoutExtension
return context.resources.getIdentifier(f, type, context.packageName)
}
Run Code Online (Sandbox Code Playgroud)
这个库的使用者可以简单地拥有
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)
甚至minifyEnabled false产生问题。
带有演示应用程序的库可以在这里找到https://github.com/svenoaks/MasterSwitchPreference
所以我假设我必须在这个库的使用者中添加某种类型的 R8/Proguard 或 Gradle 设置才能不更改 xml 资源的名称?这个规则会是什么?
res/raw/keep.xml我尝试过定义要保留在消费者应用程序中的资源-
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@xml/settings_master_switch_1,@xml/settings_master_switch_2,@drawable/ic_baseline_cake_24.xml" />
Run Code Online (Sandbox Code Playgroud)
并且这条规则在proguard-rules.pro
-verbose
-keepattributes InnerClasses
-keep class **.R
-keep class **.R$* { …Run Code Online (Sandbox Code Playgroud) 假设我有以下课程:
com.example.whatever.ClassA
com.example.whatever.ClassB
Run Code Online (Sandbox Code Playgroud)
我想混淆我的类和包名称,但保留前缀com.example。考虑到这一点,混淆上述名称应该输出如下内容:
com.example.a.a
com.example.a.b
Run Code Online (Sandbox Code Playgroud)
有-keeppackagenames标志,但我不想保留整个包名称 - 只是前缀。
如何才能实现这一目标?
我有一个包含一些数据类的包,我尝试使用 Kotlin 反射在运行时访问构造函数clazz.primaryConstructor,一切都按预期工作,但是当我启用 R8 时,数据类元数据被删除,例如当我检查它是否KClass isData返回 false 时并且主构造函数也为 null,这仅在启用 R8 时发生。我尝试了一切,包括@keep向所有数据类添加注释并添加规则以将所有内容保留在模型包中,我还添加了这些规则
-keep class kotlin.reflect.**
-keep class kotlin.Metadata { *; }
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气,知道出了什么问题或如何解决这个问题吗?
提前致谢。
我在从 Android Gradle Plugin (AGP) 7.4.2 迁移到 8.2 以及 Java 11 迁移到 17 时遇到混淆问题:Unable to create @Body converter for class package.api.data.device.DevicesBody (parameter #1) for method a.a
除了 API 调用之外,一切都运行良好。我将 Retrofit 2 与 Kotlin 序列化 (kotlinx.serialization) 结合使用。
// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0" // Retrofit
implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2" // OkHttp Logging Interceptor
// Kotlin Serialization
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" // Kotlin Serialization JSON
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" // Retrofit 2 Kotlin Serialization Converter
Run Code Online (Sandbox Code Playgroud)
它正在禁用混淆minifyEnabled false或添加混淆规则-keep class ** { *; },但这当然不是一个可接受的解决方案。
private …Run Code Online (Sandbox Code Playgroud) 我正在运行 Flutter 发布版本并收到警告Proguard configuration rule does not match anything。完整列表见下文。
这应该提交给 Flutter GitHub 问题还是我做错了什么?
我的构建命令是:(
flutter build appbundle --release --obfuscate --split-debug-info=./build/symbols
如果我删除--obfuscate标志也会发生同样的情况)
我的项目不包含任何proguard-rules.pro文件。
我的app/build.gradle配置是:
buildTypes {
release {
signingConfig signingConfigs.release
ndk {
abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' //, 'x86'
}
minifyEnabled true
shrinkResources true
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下构建工具和设置:
完整的警告列表
Info: Proguard configuration rule does not match anything: `-keepclassmembers class …Run Code Online (Sandbox Code Playgroud) android-r8 ×10
proguard ×9
android ×6
obfuscation ×2
apk ×1
build ×1
flutter ×1
google-play ×1
gradle ×1
kotlin ×1
minify ×1