├── docs ├── 13.课程总结.md ├── 12.App专项技术优化.md ├── 11.App稳定性优化.md ├── 1.课程导学与学习指南.md ├── 2.App性能概览与平台化实践.md ├── 10.App瘦身优化.md ├── 9.App电量优化.md ├── 5.App布局优化.md ├── 7.App线程优化.md ├── 8.App网络优化.md ├── 4.App内存优化.md ├── 6.App卡顿优化.md └── 3.App启动优化.md ├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── chris.png │ │ │ │ ├── joanna.png │ │ │ │ ├── shailen.png │ │ │ │ ├── splash.png │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── layout │ │ │ │ ├── activity_droid_cards.xml │ │ │ │ ├── activity_memoryleak.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_memory.xml │ │ │ │ ├── testblank.xml │ │ │ │ ├── news_item.xml │ │ │ │ └── news_item_constrainlayout.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── drawable │ │ │ │ ├── lanucher.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── optimize │ │ │ │ └── performance │ │ │ │ ├── memory │ │ │ │ ├── CallBack.java │ │ │ │ ├── CallBackManager.java │ │ │ │ ├── MemoryLeakActivity.java │ │ │ │ ├── MemoryShakeActivity.java │ │ │ │ └── ImageHook.java │ │ │ │ ├── adapter │ │ │ │ ├── OnFeedShowCallBack.java │ │ │ │ └── NewsAdapter.java │ │ │ │ ├── launchstarter │ │ │ │ ├── task │ │ │ │ │ ├── TaskCallBack.java │ │ │ │ │ ├── MainTask.java │ │ │ │ │ ├── ITask.java │ │ │ │ │ ├── DispatchRunnable.java │ │ │ │ │ └── Task.java │ │ │ │ ├── stat │ │ │ │ │ ├── TaskStatBean.java │ │ │ │ │ └── TaskStat.java │ │ │ │ ├── utils │ │ │ │ │ ├── DispatcherLog.java │ │ │ │ │ └── DispatcherExecutor.java │ │ │ │ ├── DelayInitDispatcher.java │ │ │ │ ├── sort │ │ │ │ │ ├── Graph.java │ │ │ │ │ └── TaskSortUtil.java │ │ │ │ └── TaskDispatcher.java │ │ │ │ ├── net │ │ │ │ ├── ConfigManager.java │ │ │ │ ├── OkHttpEvent.java │ │ │ │ ├── APIService.java │ │ │ │ ├── JobSchedulerService.java │ │ │ │ ├── NoNetInterceptor.java │ │ │ │ ├── OkHttpDNS.java │ │ │ │ ├── RetrofitNewsUtils.java │ │ │ │ ├── FrescoTraceListener.java │ │ │ │ └── OkHttpEventListener.java │ │ │ │ ├── aop │ │ │ │ ├── ActivityRecord.java │ │ │ │ ├── PerformanceAop.java │ │ │ │ └── ActivityHooker.java │ │ │ │ ├── utils │ │ │ │ ├── ExceptionMonitor.java │ │ │ │ ├── LaunchTimer.java │ │ │ │ ├── LogUtils.java │ │ │ │ └── Utils.java │ │ │ │ ├── tasks │ │ │ │ ├── InitBuglyTask.java │ │ │ │ ├── InitUmengTask.java │ │ │ │ ├── InitStethoTask.java │ │ │ │ ├── delayinittask │ │ │ │ │ ├── DelayInitTaskA.java │ │ │ │ │ └── DelayInitTaskB.java │ │ │ │ ├── InitWeexTask.java │ │ │ │ ├── GetDeviceIdTask.java │ │ │ │ ├── InitJPushTask.java │ │ │ │ ├── InitFrescoTask.java │ │ │ │ └── InitAMapTask.java │ │ │ │ ├── handler │ │ │ │ ├── GetDetailHandlerHelper.java │ │ │ │ └── SuperHandler.java │ │ │ │ ├── TestBlankActivity.java │ │ │ │ ├── bean │ │ │ │ └── NewsItem.java │ │ │ │ ├── wakelock │ │ │ │ └── WakeLockUtils.java │ │ │ │ ├── ui │ │ │ │ ├── Droid.java │ │ │ │ ├── CustomTextView.java │ │ │ │ ├── SolveOverDrawActivity.java │ │ │ │ ├── DroidCard.java │ │ │ │ └── DroidCardsView.java │ │ │ │ ├── async │ │ │ │ └── ThreadPoolUtils.java │ │ │ │ ├── webview │ │ │ │ └── BlankDetect.java │ │ │ │ ├── block │ │ │ │ └── AppBlockCanaryContext.java │ │ │ │ ├── PerformanceApp.java │ │ │ │ └── MainActivity.java │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── optimize │ │ │ └── performance │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── optimize │ │ └── performance │ │ └── ExampleInstrumentedTest.java ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── udocs ├── iOS代码自测及覆盖率检测方案设计.docx └── 性能测试工具调研设计研发.md ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .idea ├── vcs.xml ├── gradle.xml ├── codeStyles │ └── Project.xml └── misc.xml ├── .gitignore ├── README.md ├── gradle.properties ├── LICENSE ├── gradlew.bat └── gradlew /docs/13.课程总结.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/12.App专项技术优化.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Performance 3 | 4 | -------------------------------------------------------------------------------- /udocs/iOS代码自测及覆盖率检测方案设计.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/udocs/iOS代码自测及覆盖率检测方案设计.docx -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/chris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/chris.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/joanna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/joanna.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/shailen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/shailen.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/memory/CallBack.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.memory; 2 | 3 | public interface CallBack { 4 | void dpOperate(); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuiAndroid/android-performance/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/adapter/OnFeedShowCallBack.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.adapter; 2 | 3 | public interface OnFeedShowCallBack { 4 | void onFeedShow(); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/launchstarter/task/TaskCallBack.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.launchstarter.task; 2 | 3 | public interface TaskCallBack { 4 | 5 | void call(); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/net/ConfigManager.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.net; 2 | 3 | public class ConfigManager { 4 | 5 | public static boolean sOpenClick = true; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches/build_file_checksums.ser 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | .DS_Store 9 | /build 10 | /captures 11 | .externalNativeBuild 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/aop/ActivityRecord.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.aop; 2 | 3 | public class ActivityRecord { 4 | 5 | public long mOnCreateTime; 6 | public long mOnWindowsFocusChangedTime; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/utils/ExceptionMonitor.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.utils; 2 | 3 | public class ExceptionMonitor { 4 | 5 | public static void monitor(String message){ 6 | // 数据缓存及后续上报逻辑 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_droid_cards.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/launchstarter/task/MainTask.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.launchstarter.task; 2 | 3 | public abstract class MainTask extends Task { 4 | 5 | @Override 6 | public boolean runOnMainThread() { 7 | return true; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/net/OkHttpEvent.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.net; 2 | 3 | /** 4 | * 统计对象 5 | */ 6 | public class OkHttpEvent { 7 | public long dnsStartTime; 8 | public long dnsEndTime; 9 | public long responseBodySize; 10 | public boolean apiSuccess; 11 | public String errorReason; 12 | } 13 | -------------------------------------------------------------------------------- /docs/11.App稳定性优化.md: -------------------------------------------------------------------------------- 1 | #### 11-1 如何提升App的稳定性 2 | 3 | 1. 正确认识 4 | 1. 稳定性是大问题,Crash是P0优先级 5 | 2. 稳定性可优化的面很广 6 | 2. 稳定性维度 7 | 1. Crash纬度 8 | 2. 性能纬度 9 | 3. 业务高可用纬度 10 | 3. 稳定性优化概览 11 | 1. 重在预防,监控必不可少 12 | 2. 思考更深一层、重视隐含信息 13 | 3. 长效保持需要科学流程 14 | 15 | #### 11-2 高Crash率的破解之道 16 | 17 | #### 11-3 移动端业务高可用方案建设 18 | 19 | #### 11-4 移动端容灾方案 20 | 21 | #### 11-5 稳定性长效治理 22 | 23 | #### 11-6 稳定性优化模拟面试 -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/tasks/InitBuglyTask.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.tasks; 2 | 3 | import com.optimize.performance.launchstarter.task.Task; 4 | import com.tencent.bugly.crashreport.CrashReport; 5 | 6 | public class InitBuglyTask extends Task { 7 | 8 | @Override 9 | public void run() { 10 | CrashReport.initCrashReport(mContext, "注册时申请的APPID", false); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/net/APIService.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.net; 2 | 3 | 4 | import okhttp3.ResponseBody; 5 | import retrofit2.Call; 6 | import retrofit2.http.GET; 7 | import retrofit2.http.Query; 8 | 9 | public interface APIService { 10 | 11 | @GET("news/item") 12 | Call getNBANews(@Query("column") String column, 13 | @Query("articleIds") String articleIds); 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_memoryleak.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | 8 | #ff3357aa 9 | #ff40aa52 10 | #ffaa713b 11 | #ffaa3699 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/handler/GetDetailHandlerHelper.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.handler; 2 | 3 | import android.os.Message; 4 | 5 | import java.util.concurrent.ConcurrentHashMap; 6 | 7 | public class GetDetailHandlerHelper { 8 | 9 | private static ConcurrentHashMap sMsgDetail = new ConcurrentHashMap<>(); 10 | 11 | public static ConcurrentHashMap getMsgDetail() { 12 | return sMsgDetail; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lanucher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/tasks/InitUmengTask.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.tasks; 2 | 3 | import com.optimize.performance.launchstarter.task.Task; 4 | import com.umeng.commonsdk.UMConfigure; 5 | 6 | public class InitUmengTask extends Task { 7 | 8 | @Override 9 | public void run() { 10 | UMConfigure.init(mContext, "58edcfeb310c93091c000be2", "umeng", 11 | UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/optimize/performance/memory/CallBackManager.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance.memory; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class CallBackManager { 6 | 7 | public static ArrayList sCallBacks = new ArrayList<>(); 8 | 9 | public static void addCallBack(CallBack callBack) { 10 | sCallBacks.add(callBack); 11 | } 12 | 13 | public static void removeCallBack(CallBack callBack) { 14 | sCallBacks.remove(callBack); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/test/java/com/optimize/performance/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.optimize.performance; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_memory.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |