Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.0.3-rc02 版本无法通过构建 #120

Open
XuanJiAndroid opened this issue Feb 7, 2024 · 4 comments
Open

2.0.3-rc02 版本无法通过构建 #120

XuanJiAndroid opened this issue Feb 7, 2024 · 4 comments

Comments

@XuanJiAndroid
Copy link

运行背景:
jdk 1.8.0
gradle 6.1.1
AGP 4.0

> Task :app:dexBuilderDebug 阶段会大量有报错,类型信息如下:

AGPBI: {"kind":"error","text":"NullPointerException during IR Conversion","sources":[{"file":"/Users/ram/workspace/workDir/xx-android/app/build/intermediates/transforms/rheaTrace/debug/81.jar"}],"tool":"D8"}

app目录下的gradle配置如下:

rheaTrace {

    compilation {
        //为减少 APK 体积, 你可以为 App 中需要跟踪的方法设置 id 以此来跟踪此自定义事件, 默认值 false。
//        traceWithMethodID = false
        //该文件配置决定哪些方法您不希望跟踪, 默认值 null。
        traceFilterFilePath = "${project.rootDir}/rhea-trace/traceFilter.txt"
        //用特指定方法 id 来设置自定义事件名称, 默认值 null。
//        applyMethodMappingFilePath = "${project.rootDir}/rhea-trace/keep-method-id.txt"
        needPackageWithMethodMap = true
    }

    runtime {
        //仅在主线程抓取跟踪事件, 默认值 false。
        mainThreadOnly true
        //在 App 启动之初开始抓取跟踪事件, 默认值 true。
        startWhenAppLaunch true
        //指定内存存储 atrace 数据 ring buffer 的大小。
        atraceBufferSize "500000"
    }
}

traceFilter.txt 文件内容如下:

-blockpackage com/google
-blockpackage android/support
-blockpackage androidx/
@WangFeng-AHU
Copy link
Collaborator

麻烦提供一下详细的构建失败日志吧,如果方便的话也提供下错误中涉及的 build/intermediates/transforms/rheaTrace/debug/81.jar jar 包。

@withoutbuff
Copy link

麻烦提供一下详细的构建失败日志吧,如果方便的话也提供下错误中涉及的 build/intermediates/transforms/rheaTrace/debug/81.jar jar 包。

-blockpackage com/airbnb/lottie/LottieTask
-blockpackage androidx/exifinterface/media/ExifInterface
-blockpackage com/tencent/tinker/android/dex/Dex
-blockpackage com/android/multidex/MainDexListBuilder
为什么我配置多个屏蔽项目,只有最后一个有用?

有8个类似下发的报错
org.gradle.tooling.BuildException: Failed to process: C:\Users\fionn.zhang\AndroidStudioProjects\n1904\app\build\intermediates\transforms\rheaTrace\overseaFour\debug\29.jar

@han-wmh
Copy link

han-wmh commented Dec 6, 2024

我发现windows下创建并写入的traceFilter.txt,换行结尾存在”\r”,找到对应的解析代码FileUtils类,方法parseTraceFilterFile

rhea-build/rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils/FileUtil.kt

    private fun parseTraceFilterFile(processor: MappingCollector) {
        // ...
        val methodKeepArray =
            methodKeepStr.trim { it <= ' ' }.replace("/", ".").split("\n").toTypedArray()
        val iterator = methodKeepArray.iterator()
        loop@ while (iterator.hasNext()) {
            val item = iterator.next()
            when {
		            // ...
                item.startsWith("-blockpackage ") -> {
                    val blockPackageString = item.replace("-blockpackage ", "")
                    blockPackages.add(blockPackageString)
                }
                // ...
            }
        }
        RheaLog.i(TAG, " allow packages: $allowPackages, block packages: $blockPackages")
    }

针对读取的结果字符串split("\n"),只处理了linux环境下文件换行符,对于window的\r没有处理,导致解析只保留了最后一行的结果
测试代码:

    @Test
    fun readFileAsString() {
        val filePath = "D:\\study\\android\\KotlinStart/trace-filter/testFileFilter.txt"
        if (filePath == null) {
            return
        }
        if (!File(filePath).exists()) {
            return
        }
        val fileData = StringBuffer()
        var fileReader: Reader? = null
        var inputStream: InputStream? = null
        try {
            inputStream = FileInputStream(filePath)
            fileReader = InputStreamReader(inputStream, "UTF-8")
            val buf = CharArray(16384)
            var numRead: Int
            while (fileReader.read(buf).also { numRead = it } != -1) {
                val readData = String(buf, 0, numRead)
                fileData.append(readData)
            }
        } catch (e: Exception) {
            e.printStackTrace()
            return
        } finally {
            try {
                closeQuietly(
                    fileReader
                )
                closeQuietly(
                    inputStream
                )
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
        print("读取文件结果:${fileData.toString()}")
        val methodKeepArray =
            fileData.toString().trim { it <= ' ' }.trimEnd().replace("/", ".").split("\n").toTypedArray()
        val iterator = methodKeepArray.iterator()
        val blockPackages: MutableList<String> = mutableListOf<String>()
        loop@ while (iterator.hasNext()) {
            val item = iterator.next()
            when {
                item.startsWith("-blockpackage ") -> {
                    val blockPackageString = item.replace("-blockpackage ", "")
                    blockPackages.add(blockPackageString)
                }
            }
        }
        blockPackages.forEach {
            print("输出: $it  ")
        }
        return
    }

testFileFilter.txt

-blockpackage com/android/test
-blockpackage com/android/text
-blockpackage com/android/input

输出结果如下:

读取文件结果:-blockpackage com/android/test
-blockpackage com/android/text
  输出: com.android.input  

image.png

image.png

image.png

如果将split符号再做修改

val methodKeepArray =
            fileData.toString().trim { it <= ' ' }.trimEnd().replace("/", ".").split("\r\n").toTypedArray()

则输出所有-blockpackage,符合txt的预期内容

读取文件结果:-blockpackage com/android/test
-blockpackage com/android/text
-blockpackage com/android/input输出: com.android.test  输出: com.android.text  输出: com.android.input

因此针对window的文件可以参考如下方法去除\r
https://blog.csdn.net/chunqingQQUUU/article/details/137825839

还有一种方式:就是在linux上编写这个traceFilter.txt然后拷贝到window上

@han-wmh
Copy link

han-wmh commented Dec 6, 2024

麻烦提供一下详细的构建失败日志吧,如果方便的话也提供下错误中涉及的 build/intermediates/transforms/rheaTrace/debug/81.jar jar 包。

-blockpackage com/airbnb/lottie/LottieTask -blockpackage androidx/exifinterface/media/ExifInterface -blockpackage com/tencent/tinker/android/dex/Dex -blockpackage com/android/multidex/MainDexListBuilder 为什么我配置多个屏蔽项目,只有最后一个有用?

有8个类似下发的报错 org.gradle.tooling.BuildException: Failed to process: C:\Users\fionn.zhang\AndroidStudioProjects\n1904\app\build\intermediates\transforms\rheaTrace\overseaFour\debug\29.jar

请参考这个试试

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants