1*055d4590SKeyi Gui#!/bin/bash 2*055d4590SKeyi Gui# 3*055d4590SKeyi Gui# Copyright (C) 2017 The Android Open Source Project 4*055d4590SKeyi Gui# 5*055d4590SKeyi Gui# Licensed under the Apache License, Version 2.0 (the "License"); 6*055d4590SKeyi Gui# you may not use this file except in compliance with the License. 7*055d4590SKeyi Gui# You may obtain a copy of the License at 8*055d4590SKeyi Gui# 9*055d4590SKeyi Gui# http://www.apache.org/licenses/LICENSE-2.0 10*055d4590SKeyi Gui# 11*055d4590SKeyi Gui# Unless required by applicable law or agreed to in writing, software 12*055d4590SKeyi Gui# distributed under the License is distributed on an "AS IS" BASIS, 13*055d4590SKeyi Gui# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*055d4590SKeyi Gui# See the License for the specific language governing permissions and 15*055d4590SKeyi Gui# limitations under the License. 16*055d4590SKeyi Gui 17*055d4590SKeyi GuiJAVAC_SOURCE=1.8 18*055d4590SKeyi GuiJAVAC_TARGET=1.8 19*055d4590SKeyi Gui 20*055d4590SKeyi GuiJAVAC_FLAGS="-source ${JAVAC_SOURCE} -target ${JAVAC_TARGET}" 21*055d4590SKeyi Gui 22*055d4590SKeyi Gui# Suppress warning over bootclass path from Java 9 compiler (if used). 23*055d4590SKeyi GuiJAVAC_FLAGS="${JAVAC_FLAGS} -Xlint:-options" 24*055d4590SKeyi Gui 25*055d4590SKeyi Gui# Check interface method defintions cause warnings and {default,static} 26*055d4590SKeyi Gui# interface method invocations fail hard. 27*055d4590SKeyi Guideclare -A SUPPORT_THRESHOLD 28*055d4590SKeyi GuiSUPPORT_THRESHOLD["DefaultDefinition.class"]=0 29*055d4590SKeyi GuiSUPPORT_THRESHOLD["InvokeStatic.class"]=24 30*055d4590SKeyi GuiSUPPORT_THRESHOLD["InvokeDefault.class"]=24 31*055d4590SKeyi GuiSUPPORT_THRESHOLD["StaticDefinition.class"]=0 32*055d4590SKeyi Gui 33*055d4590SKeyi GuiCLASS_FILES=${!SUPPORT_THRESHOLD[@]} 34*055d4590SKeyi GuiSOURCE_FILES=${CLASS_FILES//class/java} 35*055d4590SKeyi Gui 36*055d4590SKeyi Gui${JAVAC} ${JAVAC_FLAGS} ${SOURCE_FILES} 37*055d4590SKeyi Gui 38*055d4590SKeyi Guifor API_LEVEL in 19 20 21 22 23 24 25; do 39*055d4590SKeyi Gui echo --------------------- Testing $API_LEVEL ------------------------ 40*055d4590SKeyi Gui for c in $CLASS_FILES; do 41*055d4590SKeyi Gui echo $c 42*055d4590SKeyi Gui dx --dex --dump-width=500 --dump-to=$c.log --min-sdk-version=$API_LEVEL $c 43*055d4590SKeyi Gui if [ $? = 0 ]; then 44*055d4590SKeyi Gui if [[ $API_LEVEL -lt ${SUPPORT_THRESHOLD[$c]} ]]; then 45*055d4590SKeyi Gui echo Unexpected success for $c at API level $API_LEVEL 1>&2 46*055d4590SKeyi Gui cat $c.log 47*055d4590SKeyi Gui exit 0 48*055d4590SKeyi Gui fi 49*055d4590SKeyi Gui else 50*055d4590SKeyi Gui if [[ $API_LEVEL -ge ${SUPPORT_THRESHOLD[$c]} ]]; then 51*055d4590SKeyi Gui echo Unexpected failure for $c at API level $API_LEVEL 1>&2 52*055d4590SKeyi Gui exit 0 53*055d4590SKeyi Gui fi 54*055d4590SKeyi Gui fi 55*055d4590SKeyi Gui done 56*055d4590SKeyi Guidone 57*055d4590SKeyi Gui 58*055d4590SKeyi Gui# Now repeat with --allowAllInterfaceMethodInvokes which turns hard 59*055d4590SKeyi Gui# failures for {default,static} interface invokes to warnings. 60*055d4590SKeyi GuiEXTRA_DX_FLAG=--allow-all-interface-method-invokes 61*055d4590SKeyi Gui 62*055d4590SKeyi GuiSUPPORT_THRESHOLD["DefaultDefinition.class"]=0 63*055d4590SKeyi GuiSUPPORT_THRESHOLD["InvokeStatic.class"]=21 64*055d4590SKeyi GuiSUPPORT_THRESHOLD["InvokeDefault.class"]=0 65*055d4590SKeyi GuiSUPPORT_THRESHOLD["StaticDefinition.class"]=0 66*055d4590SKeyi Gui 67*055d4590SKeyi GuiCLASS_FILES=${!SUPPORT_THRESHOLD[@]} 68*055d4590SKeyi GuiSOURCE_FILES=${CLASS_FILES//class/java} 69*055d4590SKeyi Gui 70*055d4590SKeyi Gui${JAVAC} ${JAVAC_FLAGS} ${SOURCE_FILES} 71*055d4590SKeyi Gui 72*055d4590SKeyi Guifor API_LEVEL in 19 20 21 22 23 24 25; do 73*055d4590SKeyi Gui echo --------------------- Testing $API_LEVEL ------------------------ 74*055d4590SKeyi Gui for c in $CLASS_FILES; do 75*055d4590SKeyi Gui echo $c 76*055d4590SKeyi Gui dx --dex --dump-width=500 --dump-to=$c.log --min-sdk-version=$API_LEVEL $EXTRA_DX_FLAG $c 77*055d4590SKeyi Gui if [ $? = 0 ]; then 78*055d4590SKeyi Gui if [[ $API_LEVEL -lt ${SUPPORT_THRESHOLD[$c]} ]]; then 79*055d4590SKeyi Gui echo Unexpected success for $c at API level $API_LEVEL 1>&2 80*055d4590SKeyi Gui cat $c.log 81*055d4590SKeyi Gui exit 0 82*055d4590SKeyi Gui fi 83*055d4590SKeyi Gui else 84*055d4590SKeyi Gui if [[ $API_LEVEL -ge ${SUPPORT_THRESHOLD[$c]} ]]; then 85*055d4590SKeyi Gui echo Unexpected failure for $c at API level $API_LEVEL 1>&2 86*055d4590SKeyi Gui exit 0 87*055d4590SKeyi Gui fi 88*055d4590SKeyi Gui fi 89*055d4590SKeyi Gui done 90*055d4590SKeyi Guidone 91