의심가는부분

성능의심가는 부분들최대한 찾아보기


supresswarnings 관련자료

viewrootimpl.java

@SuppressWarnings(
{ 
"EmptyCatchBlock", "PointlessBooleanExpression"
} 
)

java.lang.SuppressWarning : 어노테이션을 사용하여 컴파일 단위의 서브세트와 관련된 컴파일 경고를 사용하지 않도록 설정할 수 있게 해주는기능.

-여기서는 2가지의 경고를 제외했는데

어떤경우에 뜨는 경고들을 억제하는 것인지 정적 코드 분석 도구 Checkstyle 소스포지 (checkstyle – Checkstyle 8.34) 에서 관련 경고내용이 실려있습니다.

EmptyCatchBlock

// Such empty blocks would be both suppressed: 

try {
  throw new RuntimeException();
} catch (RuntimeException expected) {
}
try {
  throw new RuntimeException();
} catch (RuntimeException ignore) {
}
      

1456fd3852f288656fa25ef4ef1b2196.png 65bf06b0ec1023734f0afc9f1265cdb6.png

주석만있거나

c3c721233e8187afe4b0858474ed79f1.png 빈블럭

주요 클래스에서 약 20개정도 발견할수있었습니다

###### 2.PointlessBooleanExpression 부분

     boolean method (string string) {
            return string.endswith ("a") == true;   // violation
      }      
 boolean method (string string) {
        return string.endswith ("a");
    }

“a” == true.fasle 등 true.false로 끝나는 의미없는 expression

발생이유는 자동리팩터링 혹은 , 프로그래머가 알아보기쉬우려고 if(boolean == false)꼴로 풀어쓴것

위 코드 최적화시 바이트 코드 5byte를 절약가능하다고 합니다.

viewrootimpl.java   ㅡ
  
      private void reportNextDraw() {
        if (mReportNextDraw == false) {
            drawPending();
        }
        mReportNextDraw = true;
        }

61d7cc0e0000b5c904072c3ab86f3a11.png

주요 클래스 검색결과 3개의 경우를 발견할수있었습니다

반복문 관련
viewrootimpl.java
   
   private final ArrayList<WindowStoppedCallback> mWindowStoppedCallbacks =  new ArrayList<>();
	
	
	
	
    void addWindowStoppedCallback(WindowStoppedCallback c) 
	{ 
        mWindowStoppedCallbacks.add(c);
		
	} 
	
    void removeWindowStoppedCallback(WindowStoppedCallback c) 
	{ 
        mWindowStoppedCallbacks.remove(c);
		
	}  
   
      void setWindowStopped(boolean stopped) {
        if (mStopped != stopped) {
            mStopped = stopped;
            final ThreadedRenderer renderer = mAttachInfo.mThreadedRenderer;
            if (renderer != null) {
                if (DEBUG_DRAW) Log.d(mTag, "WindowStopped on " + getTitle() + " set to " + mStopped);
                renderer.setStopped(mStopped);
            }
            if (!mStopped) {
                scheduleTraversals();
            } else {
                if (renderer != null) {
                    renderer.destroyHardwareResources(mView);
                }
            }

            for (int i = 0; i < mWindowStoppedCallbacks.size(); i++) {
                mWindowStoppedCallbacks.get(i).windowStopped(stopped);
            }
        }
    }

setWindowStopped이란 메소드의 끝부분 for문에서 .size()를 호출함.

private final ArrayList mWindowStoppedCallbacks = new ArrayList<>(); //WindowStoppedCallback 의 arraylist

public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallback { //WindowStoppedCallback은 SurfaceView 클래스로 구현됨

``

호출은 windowmanager global

  public void setStoppedState(IBinder token, boolean stopped) {
        synchronized (mLock) {
            int count = mViews.size();
            for (int i = 0; i < count; i++) {
                if (token == null || mParams.get(i).token == token) {
                    ViewRootImpl root = mRoots.get(i);
                    root.setWindowStopped(stopped);
                }
            }
        }
    }

ViewRootImple 객체인 mRoot를 돌면서 전부 정지?? .. 정말 필요해서 size를 매번 구하는건지 좀더 파악해야 알수있을것같습니다

e861d81eaac63dbe9ef39cb81d16278c.png

view 디렉토리 내 주요 java클래스에서 검색한결과