hiddenapi: Prevent libraries for Q/R from include S+ flags.
The Q and R runtimes can handle Q/R flags but not S flags. So, this change verifies that any library that can run on Q/R (min_sdk_version <= R) by adding --max-hiddenapi-level=max-target-r to the "hiddenapi encode" command. That will cause a failure if any S+ flags are found in the flags to encode. Bug: 172453495 Test: m droid && launch_cvd Cherry pick changes in https://r.android.com/q/topic:max-target-s Add @UnsupportedAppUsage maxTargetSdk=S in classes in framework-permission (for r/q) and framework-permission-s (nominally for S+). I had to incresed the min_sdk_version in the latter to 31 (S) as it was still set at 30 (R). Change-Id: Ie0f68482603adc7b4e3d7a5c81bf203d81a84a9e
This commit is contained in:
@@ -65,6 +65,8 @@ func (h *hiddenAPI) uncompressDex() *bool {
|
|||||||
type hiddenAPIModule interface {
|
type hiddenAPIModule interface {
|
||||||
android.Module
|
android.Module
|
||||||
hiddenAPIIntf
|
hiddenAPIIntf
|
||||||
|
|
||||||
|
MinSdkVersion(ctx android.EarlyModuleContext) android.SdkSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
type hiddenAPIIntf interface {
|
type hiddenAPIIntf interface {
|
||||||
@@ -148,7 +150,7 @@ func (h *hiddenAPI) hiddenAPIEncodeDex(ctx android.ModuleContext, dexJar android
|
|||||||
// Create a copy of the dex jar which has been encoded with hiddenapi flags.
|
// Create a copy of the dex jar which has been encoded with hiddenapi flags.
|
||||||
flagsCSV := hiddenAPISingletonPaths(ctx).flags
|
flagsCSV := hiddenAPISingletonPaths(ctx).flags
|
||||||
outputDir := android.PathForModuleOut(ctx, "hiddenapi").OutputPath
|
outputDir := android.PathForModuleOut(ctx, "hiddenapi").OutputPath
|
||||||
encodedDex := hiddenAPIEncodeDex(ctx, dexJar, flagsCSV, uncompressDex, outputDir)
|
encodedDex := hiddenAPIEncodeDex(ctx, dexJar, flagsCSV, uncompressDex, android.SdkSpecNone, outputDir)
|
||||||
|
|
||||||
// Use the encoded dex jar from here onwards.
|
// Use the encoded dex jar from here onwards.
|
||||||
return encodedDex
|
return encodedDex
|
||||||
@@ -246,7 +248,7 @@ var hiddenAPIEncodeDexRule = pctx.AndroidStaticRule("hiddenAPIEncodeDex", bluepr
|
|||||||
// The encode dex rule requires unzipping, encoding and rezipping the classes.dex files along with
|
// The encode dex rule requires unzipping, encoding and rezipping the classes.dex files along with
|
||||||
// all the resources from the input jar. It also ensures that if it was uncompressed in the input
|
// all the resources from the input jar. It also ensures that if it was uncompressed in the input
|
||||||
// it stays uncompressed in the output.
|
// it stays uncompressed in the output.
|
||||||
func hiddenAPIEncodeDex(ctx android.ModuleContext, dexInput, flagsCSV android.Path, uncompressDex bool, outputDir android.OutputPath) android.OutputPath {
|
func hiddenAPIEncodeDex(ctx android.ModuleContext, dexInput, flagsCSV android.Path, uncompressDex bool, minSdkVersion android.SdkSpec, outputDir android.OutputPath) android.OutputPath {
|
||||||
|
|
||||||
// The output file has the same name as the input file and is in the output directory.
|
// The output file has the same name as the input file and is in the output directory.
|
||||||
output := outputDir.Join(ctx, dexInput.Base())
|
output := outputDir.Join(ctx, dexInput.Base())
|
||||||
@@ -274,6 +276,15 @@ func hiddenAPIEncodeDex(ctx android.ModuleContext, dexInput, flagsCSV android.Pa
|
|||||||
hiddenapiFlags = "--no-force-assign-all"
|
hiddenapiFlags = "--no-force-assign-all"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the library is targeted for Q and/or R then make sure that they do not
|
||||||
|
// have any S+ flags encoded as that will break the runtime.
|
||||||
|
minApiLevel := minSdkVersion.ApiLevel
|
||||||
|
if !minApiLevel.IsNone() {
|
||||||
|
if minApiLevel.LessThanOrEqualTo(android.ApiLevelOrPanic(ctx, "R")) {
|
||||||
|
hiddenapiFlags = hiddenapiFlags + " --max-hiddenapi-level=max-target-r"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctx.Build(pctx, android.BuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: hiddenAPIEncodeDexRule,
|
Rule: hiddenAPIEncodeDexRule,
|
||||||
Description: "hiddenapi encode dex",
|
Description: "hiddenapi encode dex",
|
||||||
|
@@ -1104,7 +1104,7 @@ func hiddenAPIRulesForBootclasspathFragment(ctx android.ModuleContext, contents
|
|||||||
for _, name := range android.SortedStringKeys(bootDexInfoByModule) {
|
for _, name := range android.SortedStringKeys(bootDexInfoByModule) {
|
||||||
bootDexInfo := bootDexInfoByModule[name]
|
bootDexInfo := bootDexInfoByModule[name]
|
||||||
unencodedDex := bootDexInfo.path
|
unencodedDex := bootDexInfo.path
|
||||||
encodedDex := hiddenAPIEncodeDex(ctx, unencodedDex, allFlagsCSV, bootDexInfo.uncompressDex, outputDir)
|
encodedDex := hiddenAPIEncodeDex(ctx, unencodedDex, allFlagsCSV, bootDexInfo.uncompressDex, bootDexInfo.minSdkVersion, outputDir)
|
||||||
encodedBootDexJarsByModule[name] = encodedDex
|
encodedBootDexJarsByModule[name] = encodedDex
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1188,6 +1188,9 @@ type bootDexInfo struct {
|
|||||||
|
|
||||||
// Indicates whether the dex jar needs uncompressing before encoding.
|
// Indicates whether the dex jar needs uncompressing before encoding.
|
||||||
uncompressDex bool
|
uncompressDex bool
|
||||||
|
|
||||||
|
// The minimum sdk version that the dex jar will be used on.
|
||||||
|
minSdkVersion android.SdkSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
// bootDexInfoByModule is a map from module name (as returned by module.Name()) to the boot dex
|
// bootDexInfoByModule is a map from module name (as returned by module.Name()) to the boot dex
|
||||||
@@ -1213,6 +1216,7 @@ func extractBootDexInfoFromModules(ctx android.ModuleContext, contents []android
|
|||||||
bootDexJarsByModule[module.Name()] = bootDexInfo{
|
bootDexJarsByModule[module.Name()] = bootDexInfo{
|
||||||
path: bootDexJar,
|
path: bootDexJar,
|
||||||
uncompressDex: *hiddenAPIModule.uncompressDex(),
|
uncompressDex: *hiddenAPIModule.uncompressDex(),
|
||||||
|
minSdkVersion: hiddenAPIModule.MinSdkVersion(ctx),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2211,6 +2211,13 @@ func (module *SdkLibraryImport) UniqueApexVariations() bool {
|
|||||||
return module.uniqueApexVariations()
|
return module.uniqueApexVariations()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MinSdkVersion - Implements hiddenAPIModule
|
||||||
|
func (module *SdkLibraryImport) MinSdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
|
||||||
|
return android.SdkSpecNone
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ hiddenAPIModule = (*SdkLibraryImport)(nil)
|
||||||
|
|
||||||
func (module *SdkLibraryImport) OutputFiles(tag string) (android.Paths, error) {
|
func (module *SdkLibraryImport) OutputFiles(tag string) (android.Paths, error) {
|
||||||
return module.commonOutputFiles(tag)
|
return module.commonOutputFiles(tag)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user