Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71875b5f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Ravenwood] Add support for Android Resource (R) files" into main

parents 6e99c056 e6ee0224
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -104,6 +104,18 @@ genrule {
    ],
}

genrule {
    name: "framework-minus-apex.ravenwood.keep_all",
    defaults: ["ravenwood-internal-only-visibility-genrule"],
    cmd: "cp $(in) $(out)",
    srcs: [
        ":framework-minus-apex.ravenwood-base{hoststubgen_keep_all.txt}",
    ],
    out: [
        "hoststubgen_framework-minus-apex_keep_all.txt",
    ],
}

java_library {
    name: "services.core-for-hoststubgen",
    installable: false, // host only jar.
@@ -189,6 +201,18 @@ genrule {
    ],
}

genrule {
    name: "services.core.ravenwood.keep_all",
    defaults: ["ravenwood-internal-only-visibility-genrule"],
    cmd: "cp $(in) $(out)",
    srcs: [
        ":services.core.ravenwood-base{hoststubgen_keep_all.txt}",
    ],
    out: [
        "hoststubgen_services.core_keep_all.txt",
    ],
}

java_library {
    name: "services.core.ravenwood-jarjar",
    installable: false,
+2 −0
Original line number Diff line number Diff line
@@ -221,7 +221,9 @@ sh_test_host {
    data: [
        ":framework-minus-apex.ravenwood.stats",
        ":framework-minus-apex.ravenwood.apis",
        ":framework-minus-apex.ravenwood.keep_all",
        ":services.core.ravenwood.stats",
        ":services.core.ravenwood.apis",
        ":services.core.ravenwood.keep_all",
    ],
}
+12 −2
Original line number Diff line number Diff line
@@ -18,8 +18,14 @@
set -e

# Output files
stats=/tmp/ravenwood-stats-all.csv
apis=/tmp/ravenwood-apis-all.csv
out_dir=/tmp/ravenwood
stats=$out_dir/ravenwood-stats-all.csv
apis=$out_dir/ravenwood-apis-all.csv
keep_all_dir=$out_dir/ravenwood-keep-all/

rm -fr $out_dir
mkdir -p $out_dir
mkdir -p $keep_all_dir

# Where the input files are.
path=$ANDROID_BUILD_TOP/out/host/linux-x86/testcases/ravenwood-stats-checker/x86_64/
@@ -76,3 +82,7 @@ collect_apis() {

collect_stats $stats
collect_apis $apis

cp *keep_all.txt $keep_all_dir
echo "Keep all files created at:"
find $keep_all_dir -type f
 No newline at end of file
+11 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ class AndroidHeuristicsFilter(
        val aidlPolicy: FilterPolicyWithReason?,
        val featureFlagsPolicy: FilterPolicyWithReason?,
        val syspropsPolicy: FilterPolicyWithReason?,
        val rFilePolicy: FilterPolicyWithReason?,
        fallback: OutputFilter
) : DelegatingFilter(fallback) {
    override fun getPolicyForClass(className: String): FilterPolicyWithReason {
@@ -37,6 +38,9 @@ class AndroidHeuristicsFilter(
        if (syspropsPolicy != null && classes.isSyspropsClass(className)) {
            return syspropsPolicy
        }
        if (rFilePolicy != null && classes.isRClass(className)) {
            return rFilePolicy
        }
        return super.getPolicyForClass(className)
    }
}
@@ -74,3 +78,10 @@ private fun ClassNodes.isSyspropsClass(className: String): Boolean {
    return className.startsWith("android/sysprop/")
            && className.endsWith("Properties")
}

/**
 * @return if a given class "seems like" an R class or its nested classes.
 */
private fun ClassNodes.isRClass(className: String): Boolean {
    return className.endsWith("/R") || className.contains("/R$")
}
+24 −12
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package com.android.hoststubgen.filters

import com.android.hoststubgen.ParseException
import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.toHumanReadableClassName
import com.android.hoststubgen.log
import com.android.hoststubgen.normalizeTextLine
import com.android.hoststubgen.whitespaceRegex
@@ -31,13 +32,17 @@ import java.util.Objects
 * Print a class node as a "keep" policy.
 */
fun printAsTextPolicy(pw: PrintWriter, cn: ClassNode) {
    pw.printf("class %s\t%s\n", cn.name, "keep")
    pw.printf("class %s %s\n", cn.name.toHumanReadableClassName(), "keep")

    for (f in cn.fields ?: emptyList()) {
        pw.printf("  field %s\t%s\n", f.name, "keep")
    cn.fields?.let {
        for (f in it.sortedWith(compareBy({ it.name }))) {
            pw.printf("    field %s %s\n", f.name, "keep")
        }
    }
    cn.methods?.let {
        for (m in it.sortedWith(compareBy({ it.name }, { it.desc }))) {
            pw.printf("    method %s %s %s\n", m.name, m.desc, "keep")
        }
    for (m in cn.methods ?: emptyList()) {
        pw.printf("  method %s\t%s\t%s\n", m.name, m.desc, "keep")
    }
}

@@ -66,6 +71,7 @@ fun createFilterFromTextPolicyFile(
        var aidlPolicy: FilterPolicyWithReason? = null
        var featureFlagsPolicy: FilterPolicyWithReason? = null
        var syspropsPolicy: FilterPolicyWithReason? = null
        var rFilePolicy: FilterPolicyWithReason? = null

        try {
            BufferedReader(FileReader(filename)).use { reader ->
@@ -162,6 +168,14 @@ fun createFilterFromTextPolicyFile(
                                        syspropsPolicy = policy.withReason(
                                                "$FILTER_REASON (special-class sysprops)")
                                    }
                                    SpecialClass.RFile -> {
                                        if (rFilePolicy != null) {
                                            throw ParseException(
                                                "Policy for R file already defined")
                                        }
                                        rFilePolicy = policy.withReason(
                                            "$FILTER_REASON (special-class R file)")
                                    }
                                }
                            }
                        }
@@ -225,13 +239,9 @@ fun createFilterFromTextPolicyFile(
            throw e.withSourceInfo(filename, lineNo)
        }

        var ret: OutputFilter = imf
        if (aidlPolicy != null || featureFlagsPolicy != null || syspropsPolicy != null) {
            log.d("AndroidHeuristicsFilter enabled")
            ret = AndroidHeuristicsFilter(
                    classes, aidlPolicy, featureFlagsPolicy, syspropsPolicy, imf)
        }
        return ret
        // Wrap the in-memory-filter with AHF.
        return AndroidHeuristicsFilter(
                classes, aidlPolicy, featureFlagsPolicy, syspropsPolicy, rFilePolicy, imf)
    }
}

@@ -240,6 +250,7 @@ private enum class SpecialClass {
    Aidl,
    FeatureFlags,
    Sysprops,
    RFile,
}

private fun resolveSpecialClass(className: String): SpecialClass {
@@ -250,6 +261,7 @@ private fun resolveSpecialClass(className: String): SpecialClass {
        ":aidl" -> return SpecialClass.Aidl
        ":feature_flags" -> return SpecialClass.FeatureFlags
        ":sysprops" -> return SpecialClass.Sysprops
        ":r" -> return SpecialClass.RFile
    }
    throw ParseException("Invalid special class name \"$className\"")
}
Loading