標籤:
怎麼防止sdk反覆啟動呢?---->一次啟動對於應用來說算一次啟動次數
private static boolean started = false;
public void start(Context context) //sdk初始化執行的邏輯 { if (started) { //用一個變數防止重複初始化. log.debug("NewRelic is already running."); return; } try { AgentLogManager.setAgentLog(new NullAgentLog()); log.setLevel(this.logLevel); if (isInstrumented()) { //如果使能成功才改變started的值. AndroidAgentImpl.init(context, agentConfiguration); started = true; } else { log.error("Failed to detect New Relic instrumentation. Something likely went wrong during your build process and you should contact [email protected]"); return; } } catch (Throwable e) { log.error("Error occurred while starting the New Relic agent!", e); } }
private boolean isInstrumented() { return false; //是不是感覺很奇怪?為什麼直接返回false?那麼sdk怎麼改變started的值? }
雖然在sdk中 isInstrumented()返回的是false,但是編譯成功以後這個值就變成true了(表明rewriter在使用者apk中嵌碼的流程已經生效了,而不僅僅是添加了agent的jar包版本, 這個過程俗稱使能.)
為了防止sdk反覆初始化.要求上面的初始化方法必須嵌入在Activity的onCreate()方法中. 如果嵌在非同步線程中可能會出現多次初始化.
注意點:
1.初始化代碼不要嵌在Appliation的onCreate()方法中. 有可能出現多進程多次初始化的問題.
2.Asm是通過對java的位元組碼進行操作嵌碼的. 位元組碼中只有類的父類資訊.沒有其父類以上的繼承資訊. 所以如果ActivityA extends BaseActivity; BaseActivity extends Activity.
那麼ActivityA因為其父類BaseActivity無法確認是否是Activity的子類,所以不會被嵌碼. BaseActivity會正常嵌碼.
幸好JAVA是運行時. ActivityA生命週期的onStart() onStop()調用的時候.其父類BaseActivity的onStart(),onStop()也會正常執行.前面的ApplicationStateMonitor.activityStart()和activityStop()也會正常執行一次.
3.低端版本的Android可能存在按電源鍵鎖屏 不會走Activity生命週期的onStop()方法.------->一個apk minsdkVersion=4的時候出現過.
APM之Android應用的啟動次數(2)