├── .gitignore ├── .gradle ├── 4.1 │ ├── fileChanges │ │ └── last-build.bin │ ├── fileContent │ │ └── fileContent.lock │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ ├── javaCompile │ │ ├── classAnalysis.bin │ │ ├── jarAnalysis.bin │ │ ├── javaCompile.lock │ │ ├── taskHistory.bin │ │ └── taskJars.bin │ └── taskHistory │ │ ├── fileSnapshots.bin │ │ ├── taskHistory.bin │ │ └── taskHistory.lock └── buildOutputCleanup │ ├── built.bin │ ├── cache.properties │ └── cache.properties.lock ├── .idea ├── codeStyles │ └── Project.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── JDouyin.iml ├── LICENSE ├── README.md ├── ScreenShot ├── d1.jpg ├── d2.jpg └── douyin.jpg ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── javaer │ │ └── jdouyin │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── xposed_init │ ├── java │ │ ├── aweme │ │ │ ├── MyLinear.java │ │ │ ├── custom │ │ │ │ ├── CustomButton.java │ │ │ │ ├── CustomLabelTextView.java │ │ │ │ ├── CustomLinearLayout.java │ │ │ │ ├── PlusButton.java │ │ │ │ └── PlusTextView.java │ │ │ └── ui │ │ │ │ ├── adapter │ │ │ │ └── InfoAdapter.java │ │ │ │ └── base │ │ │ │ └── BaseListAdapter.java │ │ ├── com │ │ │ └── javaer │ │ │ │ └── jdouyin │ │ │ │ ├── MainActivity.java │ │ │ │ └── TestActivity.java │ │ ├── data │ │ │ ├── Info.java │ │ │ ├── InfoEnum.java │ │ │ └── VersionEnum.java │ │ ├── hook │ │ │ ├── Hook.java │ │ │ ├── HookAwemeUI.java │ │ │ ├── HookCommentUI.java │ │ │ ├── HookRemoveAd.java │ │ │ └── Test.java │ │ ├── log │ │ │ └── Vlog.java │ │ ├── util │ │ │ ├── PackageUtil.java │ │ │ ├── Util.java │ │ │ └── ViewUtil.java │ │ ├── version │ │ │ └── Version.java │ │ └── xposed │ │ │ ├── Main.java │ │ │ └── MainHook.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── icondouyin.png │ │ ├── layout │ │ ├── activity_main.xml │ │ └── activity_test.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── 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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── javaer │ └── jdouyin │ └── ExampleUnitTest.java ├── build.gradle ├── build └── android-profile │ ├── profile-2018-07-03-00-13-12-952.json │ ├── profile-2018-07-03-00-13-12-952.rawproto │ ├── profile-2018-07-03-00-13-23-341.json │ ├── profile-2018-07-03-00-13-23-341.rawproto │ ├── profile-2018-07-03-00-15-53-827.json │ ├── profile-2018-07-03-00-15-53-827.rawproto │ ├── profile-2018-07-03-00-15-58-432.json │ ├── profile-2018-07-03-00-15-58-432.rawproto │ ├── profile-2018-07-03-00-16-27-459.json │ ├── profile-2018-07-03-00-16-27-459.rawproto │ ├── profile-2018-07-03-00-16-31-667.json │ ├── profile-2018-07-03-00-16-31-667.rawproto │ ├── profile-2018-07-03-00-30-21-828.json │ ├── profile-2018-07-03-00-30-21-828.rawproto │ ├── profile-2018-07-03-00-39-23-350.json │ ├── profile-2018-07-03-00-39-23-350.rawproto │ ├── profile-2018-07-03-21-24-28-421.json │ ├── profile-2018-07-03-21-24-28-421.rawproto │ ├── profile-2018-07-03-21-29-05-032.json │ ├── profile-2018-07-03-21-29-05-032.rawproto │ ├── profile-2018-07-04-00-06-36-553.json │ ├── profile-2018-07-04-00-06-36-553.rawproto │ ├── profile-2018-07-04-00-10-16-253.json │ └── profile-2018-07-04-00-10-16-253.rawproto ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/assetWizardSettings.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | .idea/caches 44 | 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | 49 | # External native build folder generated in Android Studio 2.2 and later 50 | .externalNativeBuild 51 | 52 | # Google Services (e.g. APIs or Firebase) 53 | google-services.json 54 | 55 | # Freeline 56 | freeline.py 57 | freeline/ 58 | freeline_project_description.json 59 | 60 | # fastlane 61 | fastlane/report.xml 62 | fastlane/Preview.html 63 | fastlane/screenshots 64 | fastlane/test_output 65 | fastlane/readme.md 66 | 67 | *.bin 68 | *.lock 69 | -------------------------------------------------------------------------------- /.gradle/4.1/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/4.1/fileContent/fileContent.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/fileContent/fileContent.lock -------------------------------------------------------------------------------- /.gradle/4.1/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/4.1/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/4.1/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/4.1/javaCompile/classAnalysis.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/javaCompile/classAnalysis.bin -------------------------------------------------------------------------------- /.gradle/4.1/javaCompile/jarAnalysis.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/javaCompile/jarAnalysis.bin -------------------------------------------------------------------------------- /.gradle/4.1/javaCompile/javaCompile.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/javaCompile/javaCompile.lock -------------------------------------------------------------------------------- /.gradle/4.1/javaCompile/taskHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/javaCompile/taskHistory.bin -------------------------------------------------------------------------------- /.gradle/4.1/javaCompile/taskJars.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/javaCompile/taskJars.bin -------------------------------------------------------------------------------- /.gradle/4.1/taskHistory/fileSnapshots.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/taskHistory/fileSnapshots.bin -------------------------------------------------------------------------------- /.gradle/4.1/taskHistory/taskHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/taskHistory/taskHistory.bin -------------------------------------------------------------------------------- /.gradle/4.1/taskHistory/taskHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/4.1/taskHistory/taskHistory.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/built.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/.gradle/buildOutputCleanup/built.bin -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Tue Jul 03 00:13:12 CST 2018 2 | gradle.version=4.1 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties.lock: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /JDouyin.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # douyin 2 | # download a video from douyin that without any watermark. 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ScreenShot/d1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/ScreenShot/d1.jpg -------------------------------------------------------------------------------- /ScreenShot/d2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/ScreenShot/d2.jpg -------------------------------------------------------------------------------- /ScreenShot/douyin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/ScreenShot/douyin.jpg -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build/* 2 | *.iml 3 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | defaultConfig { 6 | applicationId "com.javaer.jdouyin" 7 | minSdkVersion 21 8 | targetSdkVersion 26 9 | versionCode 1 10 | versionName "1.0.1" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.squareup.okhttp3:okhttp:3.11.0' 24 | implementation 'com.android.support:appcompat-v7:26.1.0' 25 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 26 | provided 'de.robv.android.xposed:api:82' 27 | provided 'de.robv.android.xposed:api:82:sources' 28 | } 29 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -repackageclass "" 23 | -allowaccessmodification 24 | -keepattributes SourceFile,LineNumberTable 25 | 26 | -optimizationpasses 5 27 | -allowaccessmodification 28 | -dontpreverify 29 | -dontusemixedcaseclassnames 30 | -dontskipnonpubliclibraryclasses 31 | -verbose 32 | 33 | -keep public class xposed.Main 34 | -dontwarn com.squareup.okhttp3.** 35 | -keep class com.squareup.okhttp3.** { *;} 36 | -dontwarn okio.** 37 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/javaer/jdouyin/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.javaer.jdouyin; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.javaer.jdouyin", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | xposed.Main -------------------------------------------------------------------------------- /app/src/main/java/aweme/MyLinear.java: -------------------------------------------------------------------------------- 1 | package aweme; 2 | 3 | import android.content.Context; 4 | import android.os.Environment; 5 | import android.os.Handler; 6 | import android.os.Looper; 7 | import android.view.View; 8 | import android.widget.AdapterView; 9 | import android.widget.ArrayAdapter; 10 | import android.widget.LinearLayout; 11 | import android.widget.ListView; 12 | import android.widget.Toast; 13 | 14 | import java.io.File; 15 | import java.io.FileOutputStream; 16 | import java.io.IOException; 17 | import java.io.InputStream; 18 | import java.util.List; 19 | 20 | import de.robv.android.xposed.XposedHelpers; 21 | import hook.Hook; 22 | import log.Vlog; 23 | import okhttp3.Call; 24 | import okhttp3.Callback; 25 | import okhttp3.OkHttpClient; 26 | import okhttp3.Request; 27 | import okhttp3.Response; 28 | import util.Util; 29 | import version.Version; 30 | 31 | /** 32 | * Created by javaer on 2018/7/5. 33 | */ 34 | 35 | public class MyLinear extends LinearLayout implements AdapterView.OnItemClickListener{ 36 | private Context mContext; 37 | public MyLinear(Context context) { 38 | super(context); 39 | this.mContext = context; 40 | init(); 41 | } 42 | private void init(){ 43 | LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 44 | layoutParams.setMargins(dp2px(10), dp2px(5), dp2px(10), dp2px(5)); 45 | this.setLayoutParams(layoutParams); 46 | 47 | ListView listView = new ListView(mContext); 48 | listView.setOnItemClickListener(this); 49 | LinearLayout.LayoutParams lv_params = new LayoutParams(LayoutParams.MATCH_PARENT,dp2px(50)); 50 | lv_params.setMargins(dp2px(10), dp2px(10), dp2px(10), dp2px(0)); 51 | listView.setLayoutParams(lv_params); 52 | String[] str = new String[]{"下载无水印视频"}; 53 | ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_1, str); 54 | listView.setAdapter(adapter); 55 | 56 | // LayoutParams tv_p = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 57 | // tv_p.setMargins(dp2px(10), dp2px(10), dp2px(10), dp2px(0)); 58 | // TextView textView = new TextView(mContext); 59 | // textView.setGravity(Gravity.CENTER_HORIZONTAL); 60 | // textView.setTextColor(Color.RED); 61 | // textView.setText("抖音助手-下载无水印视频"); 62 | // textView.setTextSize(18); 63 | // textView.setLayoutParams(tv_p); 64 | // textView.setOnClickListener(new OnClickListener() { 65 | // @Override 66 | // public void onClick(View v) { 67 | // Object f = XposedHelpers.getObjectField(Hook.Holder, "f"); 68 | // Object video = XposedHelpers.callMethod(f, "getVideo"); 69 | // Object playAddr = XposedHelpers.getObjectField(video, "playAddr"); 70 | // List list = (List) XposedHelpers.getObjectField(playAddr, "urlList"); 71 | // Handler handler = new Handler(Looper.getMainLooper()); 72 | // downLoad(list, mContext, handler); 73 | // Vlog.log("抖音助手"); 74 | // } 75 | // }); 76 | 77 | this.addView(listView); 78 | // this.addView(textView); 79 | } 80 | 81 | public void downLoad(List list, final Context activity, final Handler handler){ 82 | OkHttpClient okHttpClient = new OkHttpClient(); 83 | final Request request = new Request.Builder().url(list.get(0)).get().build(); 84 | Call call = okHttpClient.newCall(request); 85 | call.enqueue(new Callback() { 86 | @Override 87 | public void onFailure(Call call,final IOException e) { 88 | handler.postDelayed(new Runnable() { 89 | @Override 90 | public void run() { 91 | Toast.makeText(activity, "下载失败:\n"+"错误信息:\n"+e.getMessage(), Toast.LENGTH_LONG).show(); 92 | } 93 | },0); 94 | } 95 | 96 | @Override 97 | public void onResponse(Call call, Response response) throws IOException { 98 | 99 | InputStream is = response.body().byteStream(); 100 | int len = 0; 101 | String directory = Util.getDefaultCameraPath(); 102 | 103 | Vlog.log("保存目录>>>>"+directory); 104 | 105 | File file = new File(directory); 106 | if (!file.exists()){ 107 | file.mkdir(); 108 | Vlog.log("创建目录"); 109 | } 110 | Vlog.log("目录存在"); 111 | try { 112 | final File file2 = new File(directory + "/" + System.currentTimeMillis() + ".mp4"); 113 | FileOutputStream fos = new FileOutputStream(file2); 114 | byte[] buffer = new byte[2048]; 115 | while ((len = is.read(buffer)) != -1){ 116 | fos.write(buffer, 0, len); 117 | } 118 | fos.flush(); 119 | fos.close(); 120 | is.close(); 121 | handler.postDelayed(new Runnable() { 122 | @Override 123 | public void run() { 124 | Toast.makeText(activity, "无水印视频下载成功!\n"+"保存在:"+file2.getAbsolutePath(), Toast.LENGTH_LONG).show(); 125 | } 126 | }, 0); 127 | }catch (final Throwable throwable){ 128 | handler.postDelayed(new Runnable() { 129 | @Override 130 | public void run() { 131 | Toast.makeText(activity, "下载失败:\n"+"错误信息:\n"+throwable.getMessage(), Toast.LENGTH_LONG).show(); 132 | } 133 | }, 0); 134 | } 135 | } 136 | }); 137 | } 138 | 139 | private int dp2px(float value){ 140 | final float scale = mContext.getResources().getDisplayMetrics().density; 141 | return (int) (scale * value + 0.5); 142 | } 143 | 144 | @Override 145 | public void onItemClick(AdapterView parent, View view, int position, long id) { 146 | switch (position){ 147 | case 0: 148 | if (Hook.Holder == null){ 149 | Toast.makeText(mContext, "播放信息获取出错!", Toast.LENGTH_SHORT).show(); 150 | break; 151 | } 152 | Object f = XposedHelpers.getObjectField(Hook.Holder, Version.ViewHolder_Field_f); 153 | Object video = XposedHelpers.callMethod(f, Version.Aweme_Method_getVideo); 154 | Object playAddr = XposedHelpers.getObjectField(video, Version.Video_Field_playAddr); 155 | List list = (List) XposedHelpers.getObjectField(playAddr, Version.UrlModel_Field_urlList); 156 | Handler handler = new Handler(Looper.getMainLooper()); 157 | downLoad(list, mContext, handler); 158 | Vlog.log("抖音助手"); 159 | break; 160 | } 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/custom/CustomButton.java: -------------------------------------------------------------------------------- 1 | package aweme.custom; 2 | 3 | import android.content.Context; 4 | import android.content.res.ColorStateList; 5 | import android.graphics.Color; 6 | import android.graphics.drawable.GradientDrawable; 7 | import android.widget.TextView; 8 | 9 | import static util.ViewUtil.createColorStateList; 10 | 11 | /** 12 | * Created by javaer on 2018/7/20. 13 | */ 14 | 15 | public class CustomButton extends TextView { 16 | public CustomButton(Context context) { 17 | super(context); 18 | init(); 19 | } 20 | 21 | private void init() { 22 | int strokeWidth = 3; 23 | int roundRadius = 12; 24 | int strokeColor = Color.parseColor("#606060"); 25 | 26 | GradientDrawable drawable = new GradientDrawable(); 27 | drawable.setCornerRadius(roundRadius); 28 | drawable.setStroke(strokeWidth, strokeColor); 29 | ColorStateList colorStateList = createColorStateList(0xffe29334, 0xaf4169e1, 0xff0000ff, 0xff000000); 30 | drawable.setColor(colorStateList); 31 | this.setBackground(drawable); 32 | this.setClickable(true); 33 | this.setTextColor(Color.WHITE); 34 | } 35 | 36 | public int dp2px(float dp){ 37 | final float scale = getContext().getResources().getDisplayMetrics().density; 38 | return (int) (dp * scale + 0.5f); 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/aweme/custom/CustomLabelTextView.java: -------------------------------------------------------------------------------- 1 | package aweme.custom; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.graphics.drawable.GradientDrawable; 6 | import android.widget.LinearLayout; 7 | import android.widget.TextView; 8 | 9 | import java.util.Random; 10 | 11 | import util.ViewUtil; 12 | 13 | /** 14 | * Created by Administrator on 2018/7/26. 15 | */ 16 | 17 | public class CustomLabelTextView extends LinearLayout{ 18 | 19 | private int colorLeft = Color.parseColor("#58575c"); 20 | private int colorRight = Color.parseColor("#61a52a"); 21 | public String leftText; 22 | public String rightText; 23 | private Context mContext; 24 | private String colorLeftString; 25 | private String colorRightString = "#61a52a"; 26 | 27 | public CustomLabelTextView(Context context, String leftText, String rightText) { 28 | super(context); 29 | this.mContext = context; 30 | this.leftText = leftText; 31 | this.rightText = rightText; 32 | init(); 33 | } 34 | 35 | public CustomLabelTextView(Context context, String leftText, String rightText, String colorLeft, String colorRight){ 36 | super(context); 37 | this.mContext = context; 38 | this.leftText = leftText; 39 | this.rightText = rightText; 40 | this.colorLeft = Color.parseColor(colorLeft); 41 | this.colorRight = Color.parseColor(colorRight); 42 | this.colorLeftString = colorLeft; 43 | this.colorRightString = colorRight; 44 | init(); 45 | } 46 | 47 | private void init(){ 48 | this.setOrientation(HORIZONTAL); 49 | this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, dp2px(28))); 50 | this.setPadding(dp2px(10), 0, 0, 0); 51 | LayoutParams tv_params = new LayoutParams(LayoutParams.WRAP_CONTENT, dp2px(24)); 52 | 53 | TextView tv_left = new TextView(mContext); 54 | tv_left.setText(leftText); 55 | tv_left.setTextColor(Color.WHITE); 56 | tv_left.setClickable(true); 57 | tv_left.setPadding(dp2px(10), dp2px(2), dp2px(10), dp2px(2)); 58 | GradientDrawable drawable1 = ViewUtil.createGradientDrawableRadius(2, new float[]{14, 14, 0, 0, 0, 0, 14, 14}, colorLeft); 59 | drawable1.setColor(ViewUtil.createColorStateList( 60 | Color.parseColor("#58575c"), 61 | Color.parseColor("#ae58575c"), 62 | Color.parseColor("#58575c"), 63 | Color.parseColor("#a158575c"))); 64 | tv_left.setBackground(drawable1); 65 | tv_left.setLayoutParams(tv_params); 66 | 67 | TextView tv_right = new TextView(mContext); 68 | tv_right.setText(rightText); 69 | tv_right.setTextColor(Color.WHITE); 70 | tv_right.setClickable(true); 71 | tv_right.setPadding(dp2px(10), dp2px(2), dp2px(10), dp2px(2)); 72 | GradientDrawable drawable2 = ViewUtil.createGradientDrawableRadius(2, new float[]{0, 0, 14, 14, 14, 14, 0, 0}, colorRight); 73 | drawable2.setColor(ViewUtil.createColorStateList( 74 | colorRight, 75 | Color.parseColor("#aa"+colorRightString.substring(1)), 76 | colorRight, 77 | colorRight)); 78 | tv_right.setBackground(drawable2); 79 | tv_right.setLayoutParams(tv_params); 80 | 81 | this.addView(tv_left); 82 | this.addView(tv_right); 83 | } 84 | 85 | public int dp2px(float dp){ 86 | final float scale = getContext().getResources().getDisplayMetrics().density; 87 | return (int) (dp * scale + 0.5f); 88 | } 89 | 90 | public static int randomColor(String[] colors){ 91 | if (colors == null || colors.length <= 0){ 92 | return Color.RED; 93 | } 94 | int random = new Random().nextInt(colors.length); 95 | return Color.parseColor(colors[random]); 96 | } 97 | 98 | public static String randomColorString(String[] strings){ 99 | if (strings == null || strings.length <= 0){ 100 | return "#ff0000"; 101 | } 102 | int random = new Random().nextInt(strings.length); 103 | return strings[random]; 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/custom/CustomLinearLayout.java: -------------------------------------------------------------------------------- 1 | package aweme.custom; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | /** 9 | * Created by javaer on 2018/7/20. 10 | */ 11 | 12 | public class CustomLinearLayout extends ViewGroup{ 13 | 14 | public CustomLinearLayout(Context context) { 15 | super(context); 16 | } 17 | 18 | public CustomLinearLayout(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { 23 | super(context, attrs, defStyleAttr); 24 | } 25 | 26 | public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 27 | super(context, attrs, defStyleAttr, defStyleRes); 28 | } 29 | 30 | @Override 31 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 32 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 33 | measureChildren(widthMeasureSpec, heightMeasureSpec); 34 | 35 | setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), 36 | getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); 37 | } 38 | 39 | @Override 40 | protected void onLayout(boolean changed, int l, int t, int r, int b) { 41 | final int count = getChildCount(); 42 | int childMeasureWidth = 0; 43 | int childMeasureHeight = 0; 44 | int layoutWidth = 0; // 容器已经占据的宽度 45 | int layoutHeight = 0; // 容器已经占据的宽度 46 | int maxChildHeight = 0; //一行中子控件最高的高度,用于决定下一行高度应该在目前基础上累加多少 47 | 48 | for (int i = 0; i < count; i++){ 49 | View child = getChildAt(i); 50 | childMeasureWidth = child.getMeasuredWidth(); 51 | childMeasureHeight = child.getMeasuredHeight(); 52 | if ((layoutWidth+childMeasureWidth) < getWidth()){ 53 | //如果一行没有排满,继续往右排列 54 | l = layoutWidth; 55 | r = l + childMeasureWidth; 56 | t = layoutHeight; 57 | b = t + childMeasureHeight; 58 | }else { 59 | //排满后换行 60 | layoutWidth = 0; 61 | layoutHeight += maxChildHeight; 62 | maxChildHeight = 0; 63 | 64 | l = layoutWidth; 65 | r = l + childMeasureWidth; 66 | t = layoutHeight; 67 | b = t + childMeasureHeight; 68 | } 69 | layoutWidth += childMeasureWidth + 20;////宽度累加 70 | if (childMeasureHeight > maxChildHeight){ 71 | maxChildHeight = childMeasureHeight + 20; 72 | } 73 | child.layout(l, t, r, b); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/custom/PlusButton.java: -------------------------------------------------------------------------------- 1 | package aweme.custom; 2 | 3 | import android.content.Context; 4 | import android.content.res.ColorStateList; 5 | import android.graphics.Color; 6 | import android.graphics.drawable.GradientDrawable; 7 | import android.view.Gravity; 8 | import android.widget.FrameLayout; 9 | import android.widget.TextView; 10 | 11 | public class PlusButton extends FrameLayout { 12 | 13 | private String text = "PlusButton"; 14 | 15 | private int textColor = Color.WHITE; 16 | 17 | private int backgroundColor = Color.parseColor("#417BC7"); //normal focus 18 | 19 | private int pressedColor = Color.parseColor("#aa417BC7"); //press 20 | 21 | private int unencbleColor = Color.parseColor("#aaff0000"); //不可用颜色 22 | 23 | private TextView textView; 24 | 25 | private Context context; 26 | 27 | public PlusButton(Context context) { 28 | super(context); 29 | this.context = context; 30 | 31 | init(); 32 | } 33 | 34 | private void init(){ 35 | textView = new TextView(context); 36 | textView.setText(text); 37 | textView.setTextSize(18); 38 | textView.setTextColor(textColor); 39 | textView.setClickable(true); 40 | textView.setGravity(Gravity.CENTER); 41 | textView.setPadding(dp2px(10), dp2px(2), dp2px(10), dp2px(2)); 42 | 43 | GradientDrawable drawable1 = createGradientDrawableRadius(2, 44 | new float[]{14, 14, 14, 14, 14, 14, 14, 14}, backgroundColor); 45 | drawable1.setColor(createColorStateList( 46 | backgroundColor, 47 | pressedColor, 48 | backgroundColor, 49 | unencbleColor)); 50 | textView.setBackground(drawable1); 51 | 52 | LayoutParams params = new LayoutParams( 53 | LayoutParams.MATCH_PARENT, 54 | LayoutParams.MATCH_PARENT 55 | ); 56 | textView.setLayoutParams(params); 57 | 58 | this.addView(textView); 59 | 60 | } 61 | 62 | public void setOnClickListener(OnClickListener onClickListener){ 63 | textView.setOnClickListener(onClickListener); 64 | } 65 | 66 | public int dp2px(float dp){ 67 | final float scale = context.getResources().getDisplayMetrics().density; 68 | return (int) (dp * scale + 0.5f); 69 | } 70 | 71 | public void setText(String text) { 72 | textView.setText(text); 73 | } 74 | 75 | public void setTextColor(int textColor) { 76 | this.textColor = textColor; 77 | } 78 | 79 | @Override 80 | public void setBackgroundColor(int backgroundColor) { 81 | this.backgroundColor = backgroundColor; 82 | } 83 | 84 | public void setPressedColor(int pressedColor) { 85 | this.pressedColor = pressedColor; 86 | } 87 | 88 | public void setUnencbleColor(int unencbleColor) { 89 | this.unencbleColor = unencbleColor; 90 | } 91 | 92 | 93 | /** 94 | * 单个圆角度 95 | * @param strokeWidth 96 | * @param roundRadius 97 | * @param strokeColor 98 | * @return 99 | */ 100 | public GradientDrawable createGradientDrawable(int strokeWidth, int roundRadius, int strokeColor){ 101 | GradientDrawable drawable = new GradientDrawable(); 102 | drawable.setCornerRadius(roundRadius); 103 | drawable.setStroke(strokeWidth, strokeColor); 104 | 105 | return drawable; 106 | } 107 | 108 | /** 109 | * 设置圆角数组 110 | * @param strokeWidth 111 | * @param Radius 112 | * @param strokeColor 113 | * @return 114 | */ 115 | public GradientDrawable createGradientDrawableRadius(int strokeWidth, float[] Radius, int strokeColor){ 116 | GradientDrawable drawable = new GradientDrawable(); 117 | drawable.setCornerRadii(Radius); 118 | drawable.setStroke(strokeWidth, strokeColor); 119 | 120 | return drawable; 121 | } 122 | 123 | /** 124 | * 状态选择器 125 | * @param normal 126 | * @param pressed 127 | * @param focused 128 | * @param unable 129 | * @return 130 | */ 131 | public ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) { 132 | int[] colors = new int[]{pressed, focused, normal, focused, unable, normal}; 133 | int[][] states = new int[6][]; 134 | states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}; 135 | states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}; 136 | states[2] = new int[]{android.R.attr.state_enabled}; 137 | states[3] = new int[]{android.R.attr.state_focused}; 138 | states[4] = new int[]{android.R.attr.state_window_focused}; 139 | states[5] = new int[]{}; 140 | return new ColorStateList(states, colors); 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/custom/PlusTextView.java: -------------------------------------------------------------------------------- 1 | package aweme.custom; 2 | 3 | import android.content.Context; 4 | import android.content.res.ColorStateList; 5 | import android.graphics.Color; 6 | import android.graphics.drawable.GradientDrawable; 7 | import android.support.annotation.NonNull; 8 | import android.view.Gravity; 9 | import android.widget.FrameLayout; 10 | import android.widget.LinearLayout; 11 | import android.widget.TextView; 12 | 13 | public class PlusTextView extends FrameLayout { 14 | 15 | 16 | private String text; 17 | 18 | private int textColor; 19 | 20 | private int backgroundColor; //normal focus 21 | 22 | private int pressedColor; //press 23 | 24 | private int unencbleColor; //不可用颜色 25 | 26 | private TextView textView; 27 | 28 | private OnClickListener onClickListener; 29 | 30 | private Context context; 31 | 32 | public PlusTextView(@NonNull Context context) { 33 | super(context); 34 | } 35 | 36 | public PlusTextView(PlusBuilder builder){ 37 | super(builder.context); 38 | 39 | this.text = builder.text; 40 | this.textColor = builder.textColor; 41 | this.backgroundColor = builder.backgroundColor; 42 | this.pressedColor = builder.pressedColor; 43 | this.unencbleColor = builder.unencbleColor; 44 | this.textView = builder.textView; 45 | this.onClickListener = builder.clickListener; 46 | this.context = builder.context; 47 | 48 | init(); 49 | } 50 | 51 | private void init(){ 52 | textView.setText(text); 53 | textView.setTextSize(18); 54 | textView.setTextColor(textColor); 55 | textView.setClickable(true); 56 | textView.setGravity(Gravity.CENTER); 57 | textView.setPadding(dp2px(10), dp2px(2), dp2px(10), dp2px(2)); 58 | 59 | GradientDrawable drawable1 = createGradientDrawableRadius(2, 60 | new float[]{14, 14, 14, 14, 14, 14, 14, 14}, backgroundColor); 61 | drawable1.setColor(createColorStateList( 62 | backgroundColor, 63 | pressedColor, 64 | backgroundColor, 65 | unencbleColor)); 66 | textView.setBackground(drawable1); 67 | 68 | LayoutParams params = new LayoutParams( 69 | LayoutParams.MATCH_PARENT, 70 | LayoutParams.MATCH_PARENT 71 | ); 72 | textView.setLayoutParams(params); 73 | if (onClickListener != null){ 74 | textView.setOnClickListener(onClickListener); 75 | } 76 | 77 | LinearLayout linearLayout = new LinearLayout(context); 78 | linearLayout.setOrientation(LinearLayout.HORIZONTAL); 79 | LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 80 | LinearLayout.LayoutParams.MATCH_PARENT, 81 | dp2px(40) 82 | ); 83 | layoutParams.setMargins(dp2px(18), dp2px(3), dp2px(18), dp2px(18)); 84 | linearLayout.setLayoutParams(layoutParams); 85 | 86 | linearLayout.addView(textView); 87 | 88 | this.addView(linearLayout); 89 | } 90 | 91 | public int dp2px(float dp){ 92 | final float scale = context.getResources().getDisplayMetrics().density; 93 | return (int) (dp * scale + 0.5f); 94 | } 95 | 96 | public static PlusTextView createPlusText(Context context, String text, int textColor, int backgroundColor, int pressedColor, OnClickListener onClickListener){ 97 | PlusTextView.PlusBuilder builder = new PlusTextView.PlusBuilder(context); 98 | builder.text(text); 99 | builder.backgroundColor(backgroundColor); 100 | builder.textColor(textColor); 101 | builder.pressColor(pressedColor); 102 | builder.unableColor(Color.parseColor("#aaff0000")); 103 | builder.click(onClickListener); 104 | 105 | return new PlusTextView(builder); 106 | } 107 | 108 | public static final class PlusBuilder{ 109 | String text; 110 | 111 | int textColor; 112 | 113 | int backgroundColor; 114 | 115 | int pressedColor; //press 116 | 117 | int unencbleColor; 118 | 119 | private TextView textView; 120 | 121 | public Context context; 122 | 123 | private OnClickListener clickListener; 124 | 125 | public PlusBuilder(Context context) { 126 | this.context = context; 127 | this.text = "PlusTextView"; 128 | this.textColor = Color.WHITE; 129 | this.backgroundColor = Color.parseColor("#417BC7"); 130 | this.pressedColor = Color.parseColor("#aa417BC7"); 131 | this.unencbleColor = Color.parseColor("#aaff0000"); //不可用颜色 132 | this.textView = new TextView(context); 133 | } 134 | 135 | public PlusBuilder text(String s){ 136 | this.text = s; 137 | return this; 138 | } 139 | 140 | public PlusBuilder textColor(int textColor){ 141 | this.textColor = textColor; 142 | return this; 143 | } 144 | 145 | public PlusBuilder backgroundColor(int backgroundColor){ 146 | this.backgroundColor = backgroundColor; 147 | return this; 148 | } 149 | 150 | public PlusBuilder pressColor(int pressedColor){ 151 | this.pressedColor = pressedColor; 152 | return this; 153 | } 154 | 155 | public PlusBuilder unableColor(int unencbleColor){ 156 | this.unencbleColor = unencbleColor; 157 | return this; 158 | } 159 | 160 | public PlusBuilder textView(TextView textView){ 161 | this.textView = textView; 162 | return this; 163 | } 164 | 165 | public PlusBuilder click(OnClickListener clickListener){ 166 | this.clickListener = clickListener; 167 | return this; 168 | } 169 | 170 | public PlusTextView build(){ 171 | return new PlusTextView(this); 172 | } 173 | } 174 | 175 | /** 176 | * 单个圆角度 177 | * @param strokeWidth 178 | * @param roundRadius 179 | * @param strokeColor 180 | * @return 181 | */ 182 | public GradientDrawable createGradientDrawable(int strokeWidth, int roundRadius, int strokeColor){ 183 | GradientDrawable drawable = new GradientDrawable(); 184 | drawable.setCornerRadius(roundRadius); 185 | drawable.setStroke(strokeWidth, strokeColor); 186 | 187 | return drawable; 188 | } 189 | 190 | /** 191 | * 设置圆角数组 192 | * @param strokeWidth 193 | * @param Radius 194 | * @param strokeColor 195 | * @return 196 | */ 197 | public GradientDrawable createGradientDrawableRadius(int strokeWidth, float[] Radius, int strokeColor){ 198 | GradientDrawable drawable = new GradientDrawable(); 199 | drawable.setCornerRadii(Radius); 200 | drawable.setStroke(strokeWidth, strokeColor); 201 | 202 | return drawable; 203 | } 204 | 205 | /** 206 | * 状态选择器 207 | * @param normal 208 | * @param pressed 209 | * @param focused 210 | * @param unable 211 | * @return 212 | */ 213 | public ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) { 214 | int[] colors = new int[]{pressed, focused, normal, focused, unable, normal}; 215 | int[][] states = new int[6][]; 216 | states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}; 217 | states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}; 218 | states[2] = new int[]{android.R.attr.state_enabled}; 219 | states[3] = new int[]{android.R.attr.state_focused}; 220 | states[4] = new int[]{android.R.attr.state_window_focused}; 221 | states[5] = new int[]{}; 222 | return new ColorStateList(states, colors); 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/ui/adapter/InfoAdapter.java: -------------------------------------------------------------------------------- 1 | package aweme.ui.adapter; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.RelativeLayout; 9 | import android.widget.RelativeLayout.LayoutParams; 10 | import android.widget.TextView; 11 | 12 | import aweme.ui.base.BaseListAdapter; 13 | import data.Info; 14 | 15 | /** 16 | * Created by Administrator on 2018/7/22. 17 | */ 18 | @SuppressWarnings("ResourceType") 19 | public class InfoAdapter extends BaseListAdapter{ 20 | 21 | public InfoAdapter(Context context) { 22 | super(context); 23 | } 24 | 25 | @Override 26 | public View onCreateView(LayoutInflater layoutInflater, ViewGroup parent, int viewType) { 27 | RelativeLayout layout = new RelativeLayout(getContext()); 28 | LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, dp2px(45)); 29 | layout.setLayoutParams(layoutParams); 30 | 31 | TextView title = new TextView(getContext()); 32 | title.setId(0); 33 | LayoutParams title_params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 34 | title_params.addRule(RelativeLayout.CENTER_VERTICAL); 35 | title_params.setMargins(dp2px(18), 0, 0, 0); 36 | title.setLayoutParams(title_params); 37 | 38 | TextView subTitle = new TextView(getContext()); 39 | subTitle.setId(1); 40 | LayoutParams subTitle_params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 41 | subTitle_params.addRule(RelativeLayout.CENTER_VERTICAL); 42 | subTitle_params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 43 | subTitle_params.setMargins(0, 0, dp2px(20), 0); 44 | subTitle.setLayoutParams(subTitle_params); 45 | 46 | layout.addView(title); 47 | layout.addView(subTitle); 48 | return layout; 49 | } 50 | 51 | @Override 52 | public ViewHolder onCreateViewHolder(View view, int viewType) { 53 | return new InfoHolder(view, this); 54 | } 55 | 56 | public final class InfoHolder extends ViewHolder{ 57 | 58 | TextView title_view; 59 | TextView subTitle_view; 60 | 61 | public InfoHolder(View view, BaseListAdapter baseListAdapter) { 62 | super(view, baseListAdapter); 63 | } 64 | 65 | @Override 66 | public void onInitialize() { 67 | title_view = mItemView.findViewById(0); 68 | title_view.setTextSize(dp2px(6)); 69 | title_view.setTextColor(Color.BLACK); 70 | subTitle_view = mItemView.findViewById(1); 71 | } 72 | 73 | @Override 74 | public void onBind(int position, int viewType) { 75 | Info info = getItem(position); 76 | title_view.setText(info.getTitle()); 77 | subTitle_view.setText(info.getSubTitle()); 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/aweme/ui/base/BaseListAdapter.java: -------------------------------------------------------------------------------- 1 | package aweme.ui.base; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Created by Administrator on 2018/7/22. 13 | */ 14 | 15 | public abstract class BaseListAdapter extends BaseAdapter{ 16 | private Context mContext; 17 | private List mItems; 18 | private LayoutInflater mLayoutInflater; 19 | 20 | public BaseListAdapter(Context context) { 21 | mContext = context; 22 | mLayoutInflater = LayoutInflater.from(context); 23 | } 24 | 25 | public List getmItems(){ 26 | return mItems; 27 | } 28 | 29 | public Context getContext(){ 30 | return mContext; 31 | } 32 | 33 | public void setItems(List items){ 34 | mItems = items; 35 | } 36 | 37 | @Override 38 | public int getCount() { 39 | return mItems == null ? 0 : mItems.size(); 40 | } 41 | 42 | @Override 43 | public T getItem(int position) { 44 | return mItems == null ? null : mItems.get(position); 45 | } 46 | 47 | @Override 48 | public long getItemId(int position) { 49 | return position; 50 | } 51 | 52 | @Override 53 | public View getView(int position, View convertView, ViewGroup parent) { 54 | 55 | int viewType = getItemViewType(position); 56 | 57 | if (convertView == null){ 58 | 59 | //创建View 60 | convertView = onCreateView(mLayoutInflater, parent, viewType); 61 | 62 | //创建ViewHolder 63 | ViewHolder viewHolder = onCreateViewHolder(convertView, viewType); 64 | 65 | //初始化操作 66 | if (viewHolder != null) viewHolder.onInitialize(); 67 | 68 | //保存 69 | convertView.setTag(viewHolder); 70 | } 71 | 72 | ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 73 | 74 | if (viewHolder != null){ 75 | //进行绑定 76 | viewHolder.mPosition = position; 77 | viewHolder.onBind(position,viewType); 78 | } 79 | 80 | return convertView; 81 | } 82 | 83 | /** 84 | * 实例显示的View 85 | * @param layoutInflater 86 | * @param parent 87 | * @param viewType 88 | * @return 89 | */ 90 | public abstract View onCreateView(LayoutInflater layoutInflater, ViewGroup parent, int viewType); 91 | 92 | /** 93 | * 初始化View 94 | * @param view 95 | * @param viewType 96 | * @return 97 | */ 98 | public abstract ViewHolder onCreateViewHolder(View view, int viewType); 99 | 100 | public abstract class ViewHolder{ 101 | 102 | protected int mPosition; 103 | protected View mItemView; 104 | private BaseListAdapter mBaseListAdapter; 105 | 106 | public ViewHolder(View view, BaseListAdapter baseListAdapter) { 107 | this.mItemView = view; 108 | this.mBaseListAdapter = baseListAdapter; 109 | } 110 | 111 | public void onInitialize(){ 112 | 113 | } 114 | 115 | public View getItemView(){ 116 | return mItemView; 117 | } 118 | 119 | /** 120 | * 绑定View, 用于数据跟View进行绑定 121 | * @param position 122 | * @param viewType 123 | */ 124 | public abstract void onBind(int position, int viewType); 125 | 126 | /** 127 | * 获取指定索引id的内容信息 128 | * @param position 索引id 129 | * @return 指定id的内容信息 130 | */ 131 | public T getItem(int position){ 132 | return mBaseListAdapter.getItem(position); 133 | } 134 | 135 | /** 136 | * 获取适配器中数据下标 137 | * @return 138 | */ 139 | public int getAdapterPosition() { 140 | return mPosition; 141 | } 142 | } 143 | 144 | protected int dp2px(float dp){ 145 | final float scale = getContext().getResources().getDisplayMetrics().density; 146 | return (int) (dp * scale + 0.5f); 147 | 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /app/src/main/java/com/javaer/jdouyin/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.javaer.jdouyin; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.graphics.Color; 6 | import android.graphics.drawable.GradientDrawable; 7 | import android.os.Bundle; 8 | import android.view.Gravity; 9 | import android.view.View; 10 | import android.widget.AdapterView; 11 | import android.widget.LinearLayout; 12 | import android.widget.ListView; 13 | import android.widget.TextView; 14 | import android.widget.Toast; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | import java.util.Random; 19 | 20 | import aweme.custom.CustomLabelTextView; 21 | import aweme.custom.CustomLinearLayout; 22 | import aweme.custom.PlusButton; 23 | import aweme.ui.adapter.InfoAdapter; 24 | import data.Info; 25 | import data.InfoEnum; 26 | import data.VersionEnum; 27 | import util.PackageUtil; 28 | import util.Util; 29 | import util.ViewUtil; 30 | 31 | public class MainActivity extends Activity implements AdapterView.OnItemClickListener{ 32 | 33 | public static final String MAIN_PKG = "com.javaer.jdouyin"; 34 | public static final String DOUYIN_PKG = "com.ss.android.ugc.aweme"; 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | LinearLayout root = new LinearLayout(this); 40 | root.setOrientation(LinearLayout.VERTICAL); 41 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 42 | LinearLayout.LayoutParams.MATCH_PARENT, 43 | LinearLayout.LayoutParams.MATCH_PARENT); 44 | root.setLayoutParams(params); 45 | root.setGravity(Gravity.CENTER_VERTICAL); 46 | 47 | LinearLayout linearLayout1 = new LinearLayout(this); 48 | LinearLayout linearLayout2 = new LinearLayout(this); 49 | linearLayout2.setPadding(20, 20, 20, 0); 50 | linearLayout2.setLayoutParams( 51 | new LinearLayout.LayoutParams( 52 | LinearLayout.LayoutParams.MATCH_PARENT, 53 | LinearLayout.LayoutParams.WRAP_CONTENT 54 | )); 55 | 56 | CustomLinearLayout layout = new CustomLinearLayout(this); 57 | 58 | linearLayout2.addView(layout); 59 | 60 | 61 | root.addView(linearLayout1); 62 | root.addView(linearLayout2); 63 | setContentView(root); 64 | 65 | 66 | init(linearLayout1, layout); 67 | } 68 | 69 | public void init(LinearLayout linearLayout1, CustomLinearLayout layout){ 70 | 71 | ListView listView = new ListView(this); 72 | listView.setLayoutParams(new LinearLayout.LayoutParams( 73 | LinearLayout.LayoutParams.MATCH_PARENT, 74 | LinearLayout.LayoutParams.WRAP_CONTENT 75 | )); 76 | listView.setOnItemClickListener(this); 77 | InfoAdapter adapter = new InfoAdapter(this); 78 | adapter.setItems(getList()); 79 | listView.setAdapter(adapter); 80 | 81 | linearLayout1.addView(listView); 82 | 83 | String[] colors = new String[]{"#417BC7", "#6FA13E", "#DB9548", "#C8382E", "#753B94"}; 84 | // for (int i = 0; i < 10; i++){ 85 | // CustomLabelTextView customLabelTextView = new CustomLabelTextView( 86 | // this, 87 | // "测试文字", 88 | // "test"+i, 89 | // "#58575c", 90 | // CustomLabelTextView.randomColorString(colors)); 91 | // layout.addView(customLabelTextView); 92 | // } 93 | initModel(layout); 94 | for (VersionEnum versionEnum : VersionEnum.values()){ 95 | CustomLabelTextView customLabelTextView = new CustomLabelTextView( 96 | this, 97 | versionEnum.isSupported() ? "已支持版本" : "不支持版本", 98 | versionEnum.getVersion(), 99 | "#58575c", 100 | CustomLabelTextView.randomColorString(colors)); 101 | layout.addView(customLabelTextView); 102 | } 103 | 104 | TextView tv_left = new TextView(this); 105 | tv_left.setText("测试"); 106 | tv_left.setTextColor(Color.WHITE); 107 | tv_left.setClickable(true); 108 | tv_left.setPadding(dp2px(10), dp2px(2), dp2px(10), dp2px(2)); 109 | GradientDrawable drawable1 = ViewUtil.createGradientDrawableRadius(2, new float[]{14, 14, 0, 0, 0, 0, 14, 14}, Color.MAGENTA); 110 | drawable1.setColor(ViewUtil.createColorStateList( 111 | Color.parseColor("#58575c"), 112 | Color.parseColor("#ae58575c"), 113 | Color.parseColor("#58575c"), 114 | Color.parseColor("#a158575c"))); 115 | tv_left.setBackground(drawable1); 116 | 117 | LinearLayout.LayoutParams tv_params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, dp2px(24)); 118 | 119 | tv_left.setLayoutParams(tv_params); 120 | 121 | layout.addView(tv_left); 122 | 123 | 124 | PlusButton plusButton = new PlusButton(this); 125 | plusButton.setText("测试按钮"); 126 | plusButton.setOnClickListener(new View.OnClickListener() { 127 | @Override 128 | public void onClick(View view) { 129 | Toast.makeText(MainActivity.this, "点击事件", Toast.LENGTH_SHORT).show(); 130 | 131 | Intent intent = new Intent(MainActivity.this, TestActivity.class); 132 | MainActivity.this.startActivity(intent); 133 | } 134 | }); 135 | layout.addView(plusButton); 136 | } 137 | 138 | public int dp2px(float dp){ 139 | final float scale = this.getResources().getDisplayMetrics().density; 140 | return (int) (dp * scale + 0.5f); 141 | } 142 | 143 | private void initModel(CustomLinearLayout layout){ 144 | CustomLabelTextView customLabelTextView_Title = new CustomLabelTextView(this, "已支持", "去除视频广告"); 145 | 146 | layout.addView(customLabelTextView_Title); 147 | 148 | CustomLabelTextView customLabelTextView_Title1 = new CustomLabelTextView(this, "已支持", "下载无水印视频"); 149 | layout.addView(customLabelTextView_Title1); 150 | CustomLabelTextView customLabelTextView_Title2 = new CustomLabelTextView(this, "已支持", "跳过首页广告"); 151 | layout.addView(customLabelTextView_Title2); 152 | } 153 | 154 | private List getList(){ 155 | List list = new ArrayList<>(); 156 | list.addAll(getModel()); 157 | for (InfoEnum infoEnum : InfoEnum.values()){ 158 | Info info = new Info(); 159 | info.setType(infoEnum.getType()); 160 | info.setTitle(infoEnum.getTitle()); 161 | info.setSubTitle(infoEnum.getSubTitle()); 162 | list.add(info); 163 | } 164 | return list; 165 | } 166 | 167 | private List getModel(){ 168 | List list = new ArrayList<>(); 169 | Info info = new Info(); 170 | info.setType(1); 171 | info.setTitle("插件版本"); 172 | info.setSubTitle("Build_"+ PackageUtil.getAppVersion(MAIN_PKG, this)); 173 | list.add(info); 174 | info = new Info(); 175 | info.setType(1); 176 | info.setTitle("抖音版本"); 177 | info.setSubTitle(PackageUtil.getAppVersion(DOUYIN_PKG, this) + "_" + PackageUtil.getAppVersionCode(DOUYIN_PKG, this)); 178 | list.add(info); 179 | return list; 180 | } 181 | 182 | @Override 183 | public void onItemClick(AdapterView adapterView, View view, int i, long l) { 184 | switch (i){ 185 | case 0: 186 | break; 187 | case 1: 188 | break; 189 | case 2: 190 | break; 191 | case 3: 192 | String url = "https://github.com/javaeryang/douyin"; 193 | Util.openUrl(url, this); 194 | break; 195 | case 4: 196 | String[] urls = new String[]{"HTTPS://QR.ALIPAY.COM/FKX09291CRJV1DVWMYRF47?t=1532799394783", 197 | "https://qr.alipay.com/c1x06037wulhdkegmso7rec"}; 198 | int random = new Random().nextInt(2); 199 | Util.gotoAlipay(this, urls[random]); 200 | break; 201 | case 5: 202 | String key = "024zhiRbVwMHKsVZc1MN3t5Pq8vA99Mb"; 203 | Util.joinGroup(key, this); 204 | break; 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /app/src/main/java/com/javaer/jdouyin/TestActivity.java: -------------------------------------------------------------------------------- 1 | package com.javaer.jdouyin; 2 | 3 | import android.app.Activity; 4 | import android.graphics.Color; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.LinearLayout; 8 | import android.widget.Toast; 9 | 10 | import aweme.custom.PlusButton; 11 | import aweme.custom.PlusTextView; 12 | 13 | public class TestActivity extends Activity { 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | 19 | LinearLayout root = new LinearLayout(this); 20 | root.setLayoutParams(new LinearLayout.LayoutParams( 21 | LinearLayout.LayoutParams.MATCH_PARENT, 22 | LinearLayout.LayoutParams.MATCH_PARENT 23 | )); 24 | root.setOrientation(LinearLayout.VERTICAL); 25 | 26 | LinearLayout l1 = new LinearLayout(this); 27 | l1.setOrientation(LinearLayout.VERTICAL); 28 | 29 | l1.setLayoutParams(new LinearLayout.LayoutParams( 30 | LinearLayout.LayoutParams.MATCH_PARENT, 31 | LinearLayout.LayoutParams.WRAP_CONTENT 32 | )); 33 | 34 | 35 | PlusButton plusButton = new PlusButton(this); 36 | plusButton.setText("测试2"); 37 | 38 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 39 | LinearLayout.LayoutParams.MATCH_PARENT, 40 | dp2px(40) 41 | ); 42 | params.setMargins(dp2px(18), dp2px(3), dp2px(18), dp2px(3)); 43 | plusButton.setLayoutParams(params); 44 | plusButton.setOnClickListener(new View.OnClickListener() { 45 | @Override 46 | public void onClick(View view) { 47 | Toast.makeText(TestActivity.this, "测试2", Toast.LENGTH_SHORT).show(); 48 | } 49 | }); 50 | 51 | l1.addView(plusButton); 52 | 53 | 54 | root.addView(l1); 55 | 56 | 57 | setContentView(root); 58 | 59 | PlusTextView.PlusBuilder builder = new PlusTextView.PlusBuilder(this); 60 | builder.text("新按钮"); 61 | builder.backgroundColor(Color.parseColor("#aaff0980")); 62 | builder.pressColor(Color.parseColor("#ff0980")); 63 | builder.unableColor(Color.parseColor("#ff0000")); 64 | builder.click(new View.OnClickListener() { 65 | @Override 66 | public void onClick(View view) { 67 | 68 | Toast.makeText(TestActivity.this, "新按钮测试", Toast.LENGTH_SHORT).show(); 69 | } 70 | }); 71 | 72 | PlusTextView plusTextView = new PlusTextView(builder); 73 | root.addView(plusTextView); 74 | } 75 | 76 | public int dp2px(float dp){ 77 | final float scale = this.getResources().getDisplayMetrics().density; 78 | return (int) (dp * scale + 0.5f); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/data/Info.java: -------------------------------------------------------------------------------- 1 | package data; 2 | 3 | /** 4 | * Created by Administrator on 2018/7/22. 5 | */ 6 | 7 | public class Info { 8 | 9 | //normal 0 10 | //with subTitle 1 11 | //update info 2 12 | 13 | private int type; 14 | private String title; 15 | private String subTitle; 16 | 17 | public Info() { 18 | } 19 | 20 | public Info(int type, String title, String subTitle) { 21 | this.type = type; 22 | this.title = title; 23 | this.subTitle = subTitle; 24 | } 25 | 26 | public int getType() { 27 | return type; 28 | } 29 | 30 | public String getTitle() { 31 | return title; 32 | } 33 | 34 | public String getSubTitle() { 35 | return subTitle; 36 | } 37 | 38 | public void setType(int type) { 39 | this.type = type; 40 | } 41 | 42 | public void setTitle(String title) { 43 | this.title = title; 44 | } 45 | 46 | public void setSubTitle(String subTitle) { 47 | this.subTitle = subTitle; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/data/InfoEnum.java: -------------------------------------------------------------------------------- 1 | package data; 2 | 3 | /** 4 | * Created by javaer on 2018/7/25. 5 | */ 6 | 7 | public enum InfoEnum { 8 | INFO_ENUM_MD(1, "关于插件", "Javaer"), 9 | INFO_ENUM_PA(1, "项目地址", "Star"), 10 | INFO_ENUM_AU(1, "支持一下", "Welcome"), 11 | INFO_ENUM_JO(1, "加入我们", "Join"); 12 | int type; 13 | String title; 14 | String subTitle; 15 | 16 | InfoEnum(int type, String title, String subTitle) { 17 | this.type = type; 18 | this.title = title; 19 | this.subTitle = subTitle; 20 | } 21 | 22 | public int getType() { 23 | return type; 24 | } 25 | 26 | public String getTitle() { 27 | return title; 28 | } 29 | 30 | public String getSubTitle() { 31 | return subTitle; 32 | } 33 | 34 | public void setType(int type) { 35 | this.type = type; 36 | } 37 | 38 | public void setTitle(String title) { 39 | this.title = title; 40 | } 41 | 42 | public void setSubTitle(String subTitle) { 43 | this.subTitle = subTitle; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/data/VersionEnum.java: -------------------------------------------------------------------------------- 1 | package data; 2 | 3 | public enum VersionEnum { 4 | VERSION_1_9_0("1.9.0", true), 5 | VERSION_2_0_0("2.0.0", false), 6 | VERSION_2_0_1("2.0.1", false), 7 | VERSION_2_1_0("2.1.0", true); 8 | String version; 9 | boolean isSupported; 10 | 11 | VersionEnum(String version, boolean isSupported) { 12 | this.version = version; 13 | this.isSupported = isSupported; 14 | } 15 | 16 | public String getVersion() { 17 | return version; 18 | } 19 | 20 | public boolean isSupported() { 21 | return isSupported; 22 | } 23 | 24 | public void setVersion(String version) { 25 | this.version = version; 26 | } 27 | 28 | public void setSupported(boolean supported) { 29 | isSupported = supported; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/hook/Hook.java: -------------------------------------------------------------------------------- 1 | package hook; 2 | 3 | import de.robv.android.xposed.XC_MethodHook; 4 | import de.robv.android.xposed.XposedHelpers; 5 | import version.Version; 6 | 7 | /** 8 | * Created by javaer on 2018/7/3. 9 | */ 10 | 11 | public class Hook { 12 | 13 | /** ViewHolder */ 14 | public static Object Holder; 15 | 16 | /** 17 | * 获取当前ViewHolder 18 | * @param classLoader 19 | */ 20 | public static void hookViewHolder(ClassLoader classLoader){ 21 | 22 | XposedHelpers.findAndHookMethod(Version.BaseListFragmentPanel, 23 | classLoader, 24 | Version.BaseListFragmentPanel_Method_D, 25 | new XC_MethodHook() { 26 | @Override 27 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 28 | Object ViewHolder = param.getResult(); 29 | if (ViewHolder != null){ 30 | Holder = ViewHolder; 31 | } 32 | } 33 | } 34 | ); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/hook/HookAwemeUI.java: -------------------------------------------------------------------------------- 1 | package hook; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.FrameLayout; 6 | import android.widget.LinearLayout; 7 | import android.widget.TextView; 8 | 9 | import aweme.MyLinear; 10 | import de.robv.android.xposed.XC_MethodHook; 11 | import de.robv.android.xposed.XposedHelpers; 12 | import log.Vlog; 13 | import version.Version; 14 | 15 | /** 16 | * Created by javaer on 2018/7/5. 17 | */ 18 | 19 | public class HookAwemeUI { 20 | public static Activity globalActivity; 21 | 22 | /** 23 | * Hook Activity 注入UI界面 24 | * @param classLoader 25 | */ 26 | public static void hookUI(ClassLoader classLoader){ 27 | XposedHelpers.findAndHookMethod(Activity.class, 28 | "onResume", 29 | new XC_MethodHook() { 30 | @Override 31 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 32 | globalActivity = (Activity) param.thisObject; 33 | } 34 | } 35 | ); 36 | XposedHelpers.findAndHookMethod(Version.baseshare_a_a, 37 | classLoader, 38 | Version.baseshare_a_a_onCreate, 39 | Bundle.class, 40 | new XC_MethodHook() { 41 | @Override 42 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 43 | Vlog.log("com.douyin.baseshare.a.a>>>>onCreate"+param.thisObject); 44 | TextView r = (TextView) 45 | XposedHelpers.getObjectField(param.thisObject, Version.baseshare_a_a_filed_r); 46 | MyLinear myLinear = new MyLinear(globalActivity); 47 | 48 | LinearLayout parent = (LinearLayout) r.getParent(); //TextView的父布局 49 | 50 | parent.addView(myLinear, 0); 51 | Vlog.log("add view success"+r.getParent()); 52 | } 53 | } 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/hook/HookCommentUI.java: -------------------------------------------------------------------------------- 1 | package hook; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | import android.view.ViewGroup; 6 | import android.widget.LinearLayout; 7 | 8 | import aweme.MyLinear; 9 | import de.robv.android.xposed.XC_MethodHook; 10 | import de.robv.android.xposed.XposedHelpers; 11 | import log.Vlog; 12 | import version.Version; 13 | 14 | /** 15 | * Created by Administrator on 2018/7/21. 16 | */ 17 | 18 | public class HookCommentUI { 19 | public static void hookCommentUI(ClassLoader classLoader){ 20 | XposedHelpers.findAndHookMethod(Version.VideoCommentDialogFragment2, 21 | classLoader, 22 | "onCreateView", 23 | LayoutInflater.class, 24 | ViewGroup.class, 25 | Bundle.class, 26 | new XC_MethodHook() { 27 | @Override 28 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 29 | Object o = param.getResult(); 30 | Vlog.log("评论界面View>>"+o); 31 | LinearLayout linearLayout = (LinearLayout) param.getResult(); 32 | if (linearLayout != null){ 33 | MyLinear myLinear = new MyLinear(HookAwemeUI.globalActivity); 34 | linearLayout.addView(myLinear, 0); 35 | } 36 | } 37 | } 38 | ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/hook/HookRemoveAd.java: -------------------------------------------------------------------------------- 1 | package hook; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | 7 | import java.util.List; 8 | 9 | import de.robv.android.xposed.XC_MethodHook; 10 | import de.robv.android.xposed.XposedHelpers; 11 | import log.Vlog; 12 | import version.Version; 13 | 14 | /** 15 | * Created by javaer on 2018/7/18. 16 | */ 17 | 18 | public class HookRemoveAd { 19 | /** 20 | * 移除广告 21 | * @param classLoader 22 | */ 23 | public static void hookRemoveAd(final ClassLoader classLoader){ 24 | XposedHelpers.findAndHookMethod(Version.adapter_h, 25 | classLoader, 26 | Version.adapter_h_a, 27 | List.class, 28 | new XC_MethodHook() { 29 | @Override 30 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 31 | List list = (List) param.args[0]; 32 | if (list != null && list.size() > 0){ 33 | for (Object o : list){ 34 | boolean isAd = (boolean) XposedHelpers.callMethod(o, Version.Aweme_Method_isAd); 35 | if (isAd){ 36 | list.remove(o); 37 | Vlog.log("移除广告>>>>>>"); 38 | } 39 | } 40 | } 41 | param.args[0] = list; 42 | } 43 | } 44 | ); 45 | 46 | XposedHelpers.findAndHookMethod(Version.SplashActivity, 47 | classLoader, 48 | "onCreate", 49 | Bundle.class, 50 | new XC_MethodHook() { 51 | @Override 52 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 53 | Activity activity = (Activity) param.thisObject; 54 | activity.finish(); 55 | Intent intent = new Intent(); 56 | Class Main = classLoader.loadClass(Version.MainActivity); 57 | intent.setClass(activity, Main); 58 | activity.startActivity(intent); 59 | Vlog.log("跳过首页onCreate"); 60 | } 61 | } 62 | ); 63 | 64 | XposedHelpers.findAndHookMethod(Version.SplashAdActivity, 65 | classLoader, 66 | "onCreate", 67 | Bundle.class, 68 | new XC_MethodHook() { 69 | @Override 70 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 71 | Activity activity = (Activity) param.thisObject; 72 | activity.finish(); 73 | Intent intent = new Intent(); 74 | Class Main = classLoader.loadClass(Version.MainActivity); 75 | intent.setClass(activity, Main); 76 | activity.startActivity(intent); 77 | Vlog.log("跳过首页广告"); 78 | } 79 | } 80 | ); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/hook/Test.java: -------------------------------------------------------------------------------- 1 | package hook; 2 | 3 | /** 4 | * Created by javaer on 2018/7/18. 5 | */ 6 | 7 | public class Test { 8 | public static void test(ClassLoader classLoader){ 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/log/Vlog.java: -------------------------------------------------------------------------------- 1 | package log; 2 | 3 | import android.util.Log; 4 | 5 | /** 6 | * Created by javaer on 2018/7/3. 7 | */ 8 | 9 | public class Vlog { 10 | public static void log(String message){ 11 | Log.i("douyin", message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/util/PackageUtil.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import android.content.Context; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | 7 | /** 8 | * Created by javaer on 2018/7/25. 9 | */ 10 | 11 | public class PackageUtil { 12 | /** 13 | * 获取应用版本名 14 | * @param packageName 15 | * @param context 16 | * @return 17 | */ 18 | public static String getAppVersion(String packageName, Context context){ 19 | String version = ""; 20 | try { 21 | PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); 22 | if (info != null){ 23 | version = info.versionName; 24 | } 25 | } catch (PackageManager.NameNotFoundException e) { 26 | e.printStackTrace(); 27 | } 28 | return version; 29 | } 30 | 31 | /** 32 | * 获取应用版本号 33 | * @param packageName 34 | * @param context 35 | * @return 36 | */ 37 | public static int getAppVersionCode(String packageName, Context context){ 38 | int version = -1; 39 | try { 40 | PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); 41 | if (info != null){ 42 | version = info.versionCode; 43 | } 44 | } catch (PackageManager.NameNotFoundException e) { 45 | e.printStackTrace(); 46 | } 47 | return version; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/util/Util.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Environment; 7 | import android.text.TextUtils; 8 | import android.widget.Toast; 9 | 10 | import log.Vlog; 11 | 12 | public class Util { 13 | public static String getDefaultCameraPath(){ 14 | String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Camera"; 15 | if (path != null && !TextUtils.isEmpty(path)){ 16 | return path; 17 | }else { 18 | return Environment.getExternalStorageDirectory().getAbsolutePath() + "/JDHelper"; 19 | } 20 | } 21 | 22 | public static void gotoAlipay(Activity activity, String payUrl){ 23 | Intent intent = new Intent(); 24 | intent.setAction("android.intent.action.VIEW"); 25 | intent.setData(Uri.parse("alipayqr://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=" + payUrl)); 26 | 27 | if (intent.resolveActivity(activity.getPackageManager()) != null) { 28 | activity.startActivity(intent); 29 | } else { 30 | intent.setData(Uri.parse(payUrl)); 31 | activity.startActivity(intent); 32 | } 33 | } 34 | 35 | /**************** 36 | * 37 | * 发起添加群流程。群号:Javaer(二)(260056346) 的 key 为: 024zhiRbVwMHKsVZc1MN3t5Pq8vA99Mb 38 | * 调用 joinQQGroup(024zhiRbVwMHKsVZc1MN3t5Pq8vA99Mb) 即可发起手Q客户端申请加群 Javaer(二)(260056346) 39 | * 40 | * @param key 由官网生成的key 41 | * @return 返回true表示呼起手Q成功,返回fals表示呼起失败 42 | ******************/ 43 | public static boolean joinGroup(String key, Activity activity) { 44 | Intent intent = new Intent(); 45 | intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key)); 46 | // 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 47 | try { 48 | activity.startActivity(intent); 49 | return true; 50 | } catch (Exception e) { 51 | // 未安装手Q或安装的版本不支持 52 | Toast.makeText(activity, "未安装手Q或安装的版本不支持", Toast.LENGTH_SHORT).show(); 53 | return false; 54 | } 55 | } 56 | 57 | public static void openUrl(String url, Activity activity){ 58 | Uri uri = Uri.parse(url); 59 | Intent intent = new Intent(); 60 | intent.setAction("android.intent.action.VIEW"); 61 | intent.setData(uri); 62 | activity.startActivity(intent); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/util/ViewUtil.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import android.content.res.ColorStateList; 4 | import android.graphics.drawable.GradientDrawable; 5 | 6 | /** 7 | * Created by Administrator on 2018/7/26. 8 | */ 9 | 10 | public class ViewUtil { 11 | 12 | /** 13 | * 单个圆角度 14 | * @param strokeWidth 15 | * @param roundRadius 16 | * @param strokeColor 17 | * @return 18 | */ 19 | public static GradientDrawable createGradientDrawable(int strokeWidth, int roundRadius, int strokeColor){ 20 | GradientDrawable drawable = new GradientDrawable(); 21 | drawable.setCornerRadius(roundRadius); 22 | drawable.setStroke(strokeWidth, strokeColor); 23 | 24 | return drawable; 25 | } 26 | 27 | /** 28 | * 设置圆角数组 29 | * @param strokeWidth 30 | * @param Radius 31 | * @param strokeColor 32 | * @return 33 | */ 34 | public static GradientDrawable createGradientDrawableRadius(int strokeWidth, float[] Radius, int strokeColor){ 35 | GradientDrawable drawable = new GradientDrawable(); 36 | drawable.setCornerRadii(Radius); 37 | drawable.setStroke(strokeWidth, strokeColor); 38 | 39 | return drawable; 40 | } 41 | 42 | /** 43 | * 状态选择器 44 | * @param normal 45 | * @param pressed 46 | * @param focused 47 | * @param unable 48 | * @return 49 | */ 50 | public static ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) { 51 | int[] colors = new int[]{pressed, focused, normal, focused, unable, normal}; 52 | int[][] states = new int[6][]; 53 | states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}; 54 | states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}; 55 | states[2] = new int[]{android.R.attr.state_enabled}; 56 | states[3] = new int[]{android.R.attr.state_focused}; 57 | states[4] = new int[]{android.R.attr.state_window_focused}; 58 | states[5] = new int[]{}; 59 | return new ColorStateList(states, colors); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/version/Version.java: -------------------------------------------------------------------------------- 1 | package version; 2 | 3 | /** 4 | * Created by javaer on 2018/7/3. 5 | */ 6 | 7 | public class Version { 8 | 9 | //default version is 1.9.0 10 | 11 | public static String SplashActivity = "com.ss.android.ugc.aweme.splash.SplashActivity"; 12 | public static String MainActivity = "com.ss.android.ugc.aweme.main.MainActivity"; 13 | public static String SplashAdActivity = "com.ss.android.ugc.aweme.splash.SplashAdActivity"; 14 | 15 | public static String BaseListFragmentPanel = "com.ss.android.ugc.aweme.feed.panel.BaseListFragmentPanel"; 16 | public static String BaseListFragmentPanel_Method_D = "D"; 17 | 18 | public static String ViewHolder_Field_f = "f"; //Aweme 上述D方法返回类的Field 19 | public static String Aweme_Method_getVideo = "getVideo"; //Video 20 | public static String Video_Field_playAddr = "playAddr"; //VideoUrlModel 21 | public static String UrlModel_Field_urlList = "urlList"; //UrlModel 22 | 23 | public static String baseshare_a_a = "com.douyin.baseshare.a.a"; 24 | public static String baseshare_a_a_onCreate = "onCreate"; 25 | public static String baseshare_a_a_filed_r = "m"; 26 | 27 | public static String adapter_h = "com.ss.android.ugc.aweme.feed.adapter.h"; 28 | public static String adapter_h_a = "a"; 29 | public static String Aweme_Method_isAd = "isAd"; 30 | 31 | public static String VideoCommentDialogFragment2 = "com.ss.android.ugc.aweme.comment.ui.VideoCommentDialogFragment2"; 32 | //adjust high versions 33 | public static void init(int version){ 34 | 35 | switch (version){ 36 | case 210: 37 | BaseListFragmentPanel_Method_D = "D"; 38 | ViewHolder_Field_f = "f"; //Aweme 上述D方法返回类的Field 39 | Aweme_Method_getVideo = "getVideo"; //Video 40 | Video_Field_playAddr = "playAddr"; //VideoUrlModel 41 | UrlModel_Field_urlList = "urlList"; //UrlModel 42 | 43 | baseshare_a_a = "com.ss.android.ugc.aweme.share.v"; // extends SharePage implements OnTouchListener 44 | baseshare_a_a_onCreate = "onCreate"; 45 | baseshare_a_a_filed_r = "e"; //TextView 46 | 47 | adapter_h = "com.ss.android.ugc.aweme.feed.adapter.h"; //compiled from: FeedPagerAdapter "homepage_follow", "video" 48 | adapter_h_a = "a"; 49 | Aweme_Method_isAd = "isAd"; 50 | 51 | VideoCommentDialogFragment2 = "com.ss.android.ugc.aweme.comment.ui.VideoCommentDialogFragment2"; 52 | break; 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/xposed/Main.java: -------------------------------------------------------------------------------- 1 | package xposed; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.javaer.jdouyin.MainActivity; 7 | 8 | import de.robv.android.xposed.IXposedHookLoadPackage; 9 | import de.robv.android.xposed.XC_MethodHook; 10 | import de.robv.android.xposed.XposedHelpers; 11 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 12 | import log.Vlog; 13 | import version.Version; 14 | 15 | /** 16 | * Created by javaer on 2018/7/3. 17 | */ 18 | 19 | public class Main implements IXposedHookLoadPackage{ 20 | 21 | //com.ss.android.ugc.aweme 22 | public static Context globalContext; 23 | public static ClassLoader globalClassloader; 24 | public static int version = 0; 25 | 26 | @Override 27 | public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { 28 | if (lpparam.packageName.equals(MainActivity.DOUYIN_PKG)){ 29 | XposedHelpers.findAndHookMethod(Application.class, 30 | "onCreate", 31 | new XC_MethodHook() { 32 | @Override 33 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 34 | Context context = (Context) param.thisObject; 35 | int ver = context.getPackageManager().getPackageInfo(MainActivity.DOUYIN_PKG,0).versionCode; 36 | if (version == 0){ 37 | version = ver; 38 | Version.init(version); 39 | Vlog.log("version>>>>>>"+version); 40 | } 41 | globalClassloader = lpparam.classLoader; 42 | globalContext = context; 43 | 44 | MainHook.hookMain(lpparam.classLoader); 45 | } 46 | } 47 | ); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/xposed/MainHook.java: -------------------------------------------------------------------------------- 1 | package xposed; 2 | 3 | import hook.Hook; 4 | import hook.HookAwemeUI; 5 | import hook.HookCommentUI; 6 | import hook.HookRemoveAd; 7 | 8 | /** 9 | * Created by javaer on 2018/7/3. 10 | */ 11 | 12 | public class MainHook { 13 | public static void hookMain(ClassLoader classLoader){ 14 | 15 | try { 16 | Hook.hookViewHolder(classLoader); 17 | }catch (Throwable throwable){ 18 | throwable.printStackTrace(); 19 | } 20 | try { 21 | HookAwemeUI.hookUI(classLoader); 22 | }catch (Throwable throwable){ 23 | throwable.printStackTrace(); 24 | } 25 | try { 26 | HookRemoveAd.hookRemoveAd(classLoader); 27 | }catch (Throwable throwable){ 28 | throwable.printStackTrace(); 29 | } 30 | try { 31 | HookCommentUI.hookCommentUI(classLoader); 32 | }catch (Throwable throwable){ 33 | throwable.printStackTrace(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icondouyin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/drawable/icondouyin.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /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/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | JDHelper 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/test/java/com/javaer/jdouyin/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.javaer.jdouyin; 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() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.0.0' 11 | 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | jcenter() 22 | } 23 | } 24 | 25 | task clean(type: Delete) { 26 | delete rootProject.buildDir 27 | } 28 | -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-13-12-952.json: -------------------------------------------------------------------------------- 1 | [{"pid":0,"ph":"i","name":"Memory sample","ts":1530547991612000,"args":{"JVM stats":"heap_memory_usage: 270515576\nnon_heap_memory_usage: 104567944\nloaded_class_count: 13376\nthread_count: 22\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 0\n gc_time: 0\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":0,"ph":"i","name":"Memory sample","ts":1530547992955000,"args":{"JVM stats":"heap_memory_usage: 107994632\nnon_heap_memory_usage: 107412352\nloaded_class_count: 13398\nthread_count: 22\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 1\n gc_time: 103\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":1,"tid":2,"id":2,"name":"base plugin project configure","args":{"span_id":"2","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547991614000,"dur":21000},{"pid":1,"tid":2,"id":3,"name":"base plugin project base extension creation","args":{"span_id":"3","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547991635000,"dur":35000},{"pid":1,"tid":2,"id":5,"name":"task manager create tasks","args":{"span_id":"5","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547991670000,"dur":11000},{"pid":1,"tid":2,"id":4,"name":"base plugin project tasks creation","args":{"span_id":"4","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547991670000,"dur":11000},{"pid":1,"tid":2,"id":8,"name":"variant manager create variants","args":{"span_id":"8","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992120000,"dur":11000},{"pid":1,"tid":2,"id":9,"name":"variant manager create tests tasks","args":{"span_id":"9","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992131000,"dur":2000},{"pid":1,"tid":2,"id":11,"name":"app task manager create merge manifest task","args":{"span_id":"11","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992136000,"dur":4000},{"pid":1,"tid":2,"id":12,"name":"app task manager create generate res values task","args":{"span_id":"12","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992140000,"dur":2000},{"pid":1,"tid":2,"id":13,"name":"app task manager create create renderscript task","args":{"span_id":"13","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992142000,"dur":3000},{"pid":1,"tid":2,"id":14,"name":"app task manager create merge resources task","args":{"span_id":"14","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992145000,"dur":3000},{"pid":1,"tid":2,"id":15,"name":"app task manager create merge assets task","args":{"span_id":"15","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992148000,"dur":1000},{"pid":1,"tid":2,"id":16,"name":"app task manager create build config task","args":{"span_id":"16","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992149000,"dur":1000},{"pid":1,"tid":2,"id":17,"name":"app task manager create process res task","args":{"span_id":"17","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992150000,"dur":9000},{"pid":1,"tid":2,"id":18,"name":"app task manager create aidl task","args":{"span_id":"18","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992159000,"dur":4000},{"pid":1,"tid":2,"id":19,"name":"app task manager create shader task","args":{"span_id":"19","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992163000,"dur":1000},{"pid":1,"tid":2,"id":20,"name":"app task manager create ndk task","args":{"span_id":"20","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992164000,"dur":3000},{"pid":1,"tid":2,"id":21,"name":"app task manager create external native build task","args":{"span_id":"21","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992167000,"dur":100},{"pid":1,"tid":2,"id":22,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"22","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992167000,"dur":2000},{"pid":1,"tid":2,"id":23,"name":"app task manager create compile task","args":{"span_id":"23","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992169000,"dur":13000},{"pid":1,"tid":2,"id":24,"name":"app task manager create packaging task","args":{"span_id":"24","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992184000,"dur":5000},{"pid":1,"tid":2,"id":25,"name":"app task manager create lint task","args":{"span_id":"25","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992189000,"dur":100},{"pid":1,"tid":2,"id":10,"name":"variant manager create tasks for variant","args":{"span_id":"10","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992133000,"dur":56000},{"pid":1,"tid":2,"id":26,"name":"variant manager create tasks for variant","args":{"span_id":"26","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992189000,"dur":11000},{"pid":1,"tid":2,"id":28,"name":"app task manager create merge manifest task","args":{"span_id":"28","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992203000,"dur":1000},{"pid":1,"tid":2,"id":29,"name":"app task manager create generate res values task","args":{"span_id":"29","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992204000,"dur":100},{"pid":1,"tid":2,"id":30,"name":"app task manager create create renderscript task","args":{"span_id":"30","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992204000,"dur":100},{"pid":1,"tid":2,"id":31,"name":"app task manager create merge resources task","args":{"span_id":"31","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992206000,"dur":1000},{"pid":1,"tid":2,"id":32,"name":"app task manager create merge assets task","args":{"span_id":"32","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992207000,"dur":100},{"pid":1,"tid":2,"id":33,"name":"app task manager create build config task","args":{"span_id":"33","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992207000,"dur":100},{"pid":1,"tid":2,"id":34,"name":"app task manager create process res task","args":{"span_id":"34","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992208000,"dur":1000},{"pid":1,"tid":2,"id":35,"name":"app task manager create aidl task","args":{"span_id":"35","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992209000,"dur":100},{"pid":1,"tid":2,"id":36,"name":"app task manager create shader task","args":{"span_id":"36","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992209000,"dur":1000},{"pid":1,"tid":2,"id":37,"name":"app task manager create ndk task","args":{"span_id":"37","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992210000,"dur":100},{"pid":1,"tid":2,"id":38,"name":"app task manager create external native build task","args":{"span_id":"38","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992210000,"dur":100},{"pid":1,"tid":2,"id":39,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"39","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992210000,"dur":2000},{"pid":1,"tid":2,"id":40,"name":"app task manager create compile task","args":{"span_id":"40","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992212000,"dur":3000},{"pid":1,"tid":2,"id":41,"name":"app task manager create packaging task","args":{"span_id":"41","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992216000,"dur":1000},{"pid":1,"tid":2,"id":42,"name":"app task manager create lint task","args":{"span_id":"42","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992217000,"dur":1000},{"pid":1,"tid":2,"id":27,"name":"variant manager create tasks for variant","args":{"span_id":"27","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530547992200000,"dur":18000},{"pid":1,"tid":2,"id":43,"name":"variant manager create tasks for variant","args":{"span_id":"43","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992218000,"dur":7000},{"pid":1,"tid":2,"id":44,"name":"variant manager create tasks for variant","args":{"span_id":"44","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992225000,"dur":21000},{"pid":1,"tid":2,"id":7,"name":"variant manager create android tasks","args":{"span_id":"7","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992119000,"dur":130000},{"pid":1,"tid":2,"id":45,"name":"variant manager external native config values","args":{"span_id":"45","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992249000,"dur":100},{"pid":1,"tid":2,"id":6,"name":"base plugin create android tasks","args":{"span_id":"6","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547991715000,"dur":534000},{"pid":1,"tid":2,"id":46,"name":"base plugin build finished","args":{"span_id":"46","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530547992896000,"dur":100}] -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-13-12-952.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-13-12-952.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-13-23-341.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-13-23-341.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-15-53-827.json: -------------------------------------------------------------------------------- 1 | [{"pid":0,"ph":"i","name":"Memory sample","ts":1530548153345000,"args":{"JVM stats":"heap_memory_usage: 90891520\nnon_heap_memory_usage: 111323936\nloaded_class_count: 13473\nthread_count: 22\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 1\n gc_time: 102\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":0,"ph":"i","name":"Memory sample","ts":1530548153828000,"args":{"JVM stats":"heap_memory_usage: 113451952\nnon_heap_memory_usage: 112461592\nloaded_class_count: 13486\nthread_count: 22\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 0\n gc_time: 0\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":1,"tid":3,"id":2,"name":"base plugin project configure","args":{"span_id":"2","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153346000,"dur":12000},{"pid":1,"tid":3,"id":3,"name":"base plugin project base extension creation","args":{"span_id":"3","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153358000,"dur":44000},{"pid":1,"tid":3,"id":5,"name":"task manager create tasks","args":{"span_id":"5","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153402000,"dur":14000},{"pid":1,"tid":3,"id":4,"name":"base plugin project tasks creation","args":{"span_id":"4","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153402000,"dur":14000},{"pid":1,"tid":3,"id":8,"name":"variant manager create variants","args":{"span_id":"8","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153445000,"dur":12000},{"pid":1,"tid":3,"id":9,"name":"variant manager create tests tasks","args":{"span_id":"9","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153457000,"dur":2000},{"pid":1,"tid":3,"id":11,"name":"app task manager create merge manifest task","args":{"span_id":"11","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153462000,"dur":3000},{"pid":1,"tid":3,"id":12,"name":"app task manager create generate res values task","args":{"span_id":"12","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153465000,"dur":1000},{"pid":1,"tid":3,"id":13,"name":"app task manager create create renderscript task","args":{"span_id":"13","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153466000,"dur":1000},{"pid":1,"tid":3,"id":14,"name":"app task manager create merge resources task","args":{"span_id":"14","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153467000,"dur":2000},{"pid":1,"tid":3,"id":15,"name":"app task manager create merge assets task","args":{"span_id":"15","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153469000,"dur":2000},{"pid":1,"tid":3,"id":16,"name":"app task manager create build config task","args":{"span_id":"16","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153471000,"dur":1000},{"pid":1,"tid":3,"id":17,"name":"app task manager create process res task","args":{"span_id":"17","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153472000,"dur":8000},{"pid":1,"tid":3,"id":18,"name":"app task manager create aidl task","args":{"span_id":"18","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153480000,"dur":1000},{"pid":1,"tid":3,"id":19,"name":"app task manager create shader task","args":{"span_id":"19","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153481000,"dur":2000},{"pid":1,"tid":3,"id":20,"name":"app task manager create ndk task","args":{"span_id":"20","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153484000,"dur":5000},{"pid":1,"tid":3,"id":21,"name":"app task manager create external native build task","args":{"span_id":"21","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153489000,"dur":100},{"pid":1,"tid":3,"id":22,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"22","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153489000,"dur":2000},{"pid":1,"tid":3,"id":23,"name":"app task manager create compile task","args":{"span_id":"23","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153491000,"dur":8000},{"pid":1,"tid":3,"id":24,"name":"app task manager create packaging task","args":{"span_id":"24","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153503000,"dur":3000},{"pid":1,"tid":3,"id":25,"name":"app task manager create lint task","args":{"span_id":"25","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153506000,"dur":1000},{"pid":1,"tid":3,"id":10,"name":"variant manager create tasks for variant","args":{"span_id":"10","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153459000,"dur":48000},{"pid":1,"tid":3,"id":26,"name":"variant manager create tasks for variant","args":{"span_id":"26","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153507000,"dur":12000},{"pid":1,"tid":3,"id":28,"name":"app task manager create merge manifest task","args":{"span_id":"28","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153520000,"dur":100},{"pid":1,"tid":3,"id":29,"name":"app task manager create generate res values task","args":{"span_id":"29","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153520000,"dur":100},{"pid":1,"tid":3,"id":30,"name":"app task manager create create renderscript task","args":{"span_id":"30","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153520000,"dur":100},{"pid":1,"tid":3,"id":31,"name":"app task manager create merge resources task","args":{"span_id":"31","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153520000,"dur":1000},{"pid":1,"tid":3,"id":32,"name":"app task manager create merge assets task","args":{"span_id":"32","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153521000,"dur":100},{"pid":1,"tid":3,"id":33,"name":"app task manager create build config task","args":{"span_id":"33","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153521000,"dur":100},{"pid":1,"tid":3,"id":34,"name":"app task manager create process res task","args":{"span_id":"34","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153521000,"dur":2000},{"pid":1,"tid":3,"id":35,"name":"app task manager create aidl task","args":{"span_id":"35","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153523000,"dur":100},{"pid":1,"tid":3,"id":36,"name":"app task manager create shader task","args":{"span_id":"36","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153523000,"dur":100},{"pid":1,"tid":3,"id":37,"name":"app task manager create ndk task","args":{"span_id":"37","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153523000,"dur":1000},{"pid":1,"tid":3,"id":38,"name":"app task manager create external native build task","args":{"span_id":"38","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153524000,"dur":100},{"pid":1,"tid":3,"id":39,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"39","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153524000,"dur":100},{"pid":1,"tid":3,"id":40,"name":"app task manager create compile task","args":{"span_id":"40","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153524000,"dur":5000},{"pid":1,"tid":3,"id":41,"name":"app task manager create packaging task","args":{"span_id":"41","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153531000,"dur":1000},{"pid":1,"tid":3,"id":42,"name":"app task manager create lint task","args":{"span_id":"42","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153532000,"dur":100},{"pid":1,"tid":3,"id":27,"name":"variant manager create tasks for variant","args":{"span_id":"27","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548153519000,"dur":13000},{"pid":1,"tid":3,"id":43,"name":"variant manager create tasks for variant","args":{"span_id":"43","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153532000,"dur":5000},{"pid":1,"tid":3,"id":44,"name":"variant manager create tasks for variant","args":{"span_id":"44","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153537000,"dur":14000},{"pid":1,"tid":3,"id":7,"name":"variant manager create android tasks","args":{"span_id":"7","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153444000,"dur":109000},{"pid":1,"tid":3,"id":45,"name":"variant manager external native config values","args":{"span_id":"45","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153553000,"dur":100},{"pid":1,"tid":3,"id":6,"name":"base plugin create android tasks","args":{"span_id":"6","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153428000,"dur":125000},{"pid":1,"tid":3,"id":46,"name":"base plugin build finished","args":{"span_id":"46","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548153822000,"dur":100}] -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-15-53-827.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-15-53-827.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-15-58-432.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-15-58-432.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-16-27-459.json: -------------------------------------------------------------------------------- 1 | [{"pid":0,"ph":"i","name":"Memory sample","ts":1530548187048000,"args":{"JVM stats":"heap_memory_usage: 262599904\nnon_heap_memory_usage: 115270272\nloaded_class_count: 13639\nthread_count: 26\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 0\n gc_time: 0\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":0,"ph":"i","name":"Memory sample","ts":1530548187459000,"args":{"JVM stats":"heap_memory_usage: 284909488\nnon_heap_memory_usage: 115936000\nloaded_class_count: 13646\nthread_count: 26\ngarbage_collection_stats {\n name: \"PS Scavenge\"\n gc_collections: 0\n gc_time: 0\n}\ngarbage_collection_stats {\n name: \"PS MarkSweep\"\n gc_collections: 0\n gc_time: 0\n}\n"}},{"pid":1,"tid":3,"id":2,"name":"base plugin project configure","args":{"span_id":"2","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187049000,"dur":12000},{"pid":1,"tid":3,"id":3,"name":"base plugin project base extension creation","args":{"span_id":"3","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187061000,"dur":11000},{"pid":1,"tid":3,"id":5,"name":"task manager create tasks","args":{"span_id":"5","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187072000,"dur":6000},{"pid":1,"tid":3,"id":4,"name":"base plugin project tasks creation","args":{"span_id":"4","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187072000,"dur":6000},{"pid":1,"tid":3,"id":8,"name":"variant manager create variants","args":{"span_id":"8","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187115000,"dur":6000},{"pid":1,"tid":3,"id":9,"name":"variant manager create tests tasks","args":{"span_id":"9","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187121000,"dur":1000},{"pid":1,"tid":3,"id":11,"name":"app task manager create merge manifest task","args":{"span_id":"11","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187125000,"dur":1000},{"pid":1,"tid":3,"id":12,"name":"app task manager create generate res values task","args":{"span_id":"12","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187126000,"dur":1000},{"pid":1,"tid":3,"id":13,"name":"app task manager create create renderscript task","args":{"span_id":"13","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187127000,"dur":100},{"pid":1,"tid":3,"id":14,"name":"app task manager create merge resources task","args":{"span_id":"14","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187127000,"dur":1000},{"pid":1,"tid":3,"id":15,"name":"app task manager create merge assets task","args":{"span_id":"15","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187128000,"dur":1000},{"pid":1,"tid":3,"id":16,"name":"app task manager create build config task","args":{"span_id":"16","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187129000,"dur":1000},{"pid":1,"tid":3,"id":17,"name":"app task manager create process res task","args":{"span_id":"17","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187130000,"dur":10000},{"pid":1,"tid":3,"id":18,"name":"app task manager create aidl task","args":{"span_id":"18","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187140000,"dur":100},{"pid":1,"tid":3,"id":19,"name":"app task manager create shader task","args":{"span_id":"19","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187140000,"dur":100},{"pid":1,"tid":3,"id":20,"name":"app task manager create ndk task","args":{"span_id":"20","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187140000,"dur":1000},{"pid":1,"tid":3,"id":21,"name":"app task manager create external native build task","args":{"span_id":"21","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187141000,"dur":100},{"pid":1,"tid":3,"id":22,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"22","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187141000,"dur":1000},{"pid":1,"tid":3,"id":23,"name":"app task manager create compile task","args":{"span_id":"23","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187142000,"dur":8000},{"pid":1,"tid":3,"id":24,"name":"app task manager create packaging task","args":{"span_id":"24","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187155000,"dur":2000},{"pid":1,"tid":3,"id":25,"name":"app task manager create lint task","args":{"span_id":"25","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187157000,"dur":100},{"pid":1,"tid":3,"id":10,"name":"variant manager create tasks for variant","args":{"span_id":"10","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 1\nis_debug: true\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187122000,"dur":35000},{"pid":1,"tid":3,"id":26,"name":"variant manager create tasks for variant","args":{"span_id":"26","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187157000,"dur":4000},{"pid":1,"tid":3,"id":28,"name":"app task manager create merge manifest task","args":{"span_id":"28","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187162000,"dur":100},{"pid":1,"tid":3,"id":29,"name":"app task manager create generate res values task","args":{"span_id":"29","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187162000,"dur":1000},{"pid":1,"tid":3,"id":30,"name":"app task manager create create renderscript task","args":{"span_id":"30","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187163000,"dur":100},{"pid":1,"tid":3,"id":31,"name":"app task manager create merge resources task","args":{"span_id":"31","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187163000,"dur":100},{"pid":1,"tid":3,"id":32,"name":"app task manager create merge assets task","args":{"span_id":"32","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187163000,"dur":100},{"pid":1,"tid":3,"id":33,"name":"app task manager create build config task","args":{"span_id":"33","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187163000,"dur":100},{"pid":1,"tid":3,"id":34,"name":"app task manager create process res task","args":{"span_id":"34","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187163000,"dur":3000},{"pid":1,"tid":3,"id":35,"name":"app task manager create aidl task","args":{"span_id":"35","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187167000,"dur":100},{"pid":1,"tid":3,"id":36,"name":"app task manager create shader task","args":{"span_id":"36","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187167000,"dur":100},{"pid":1,"tid":3,"id":37,"name":"app task manager create ndk task","args":{"span_id":"37","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187167000,"dur":100},{"pid":1,"tid":3,"id":38,"name":"app task manager create external native build task","args":{"span_id":"38","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187167000,"dur":100},{"pid":1,"tid":3,"id":39,"name":"app task manager create merge jnilibs folders task","args":{"span_id":"39","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187167000,"dur":1000},{"pid":1,"tid":3,"id":40,"name":"app task manager create compile task","args":{"span_id":"40","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187168000,"dur":2000},{"pid":1,"tid":3,"id":41,"name":"app task manager create packaging task","args":{"span_id":"41","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187174000,"dur":1000},{"pid":1,"tid":3,"id":42,"name":"app task manager create lint task","args":{"span_id":"42","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187175000,"dur":100},{"pid":1,"tid":3,"id":27,"name":"variant manager create tasks for variant","args":{"span_id":"27","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n","variant":"id: 2\nis_debug: false\nminify_enabled: false\nuse_multidex: false\nuse_legacy_multidex: false\nvariant_type: APPLICATION\nmin_sdk_version {\n api_level: 21\n}\ntarget_sdk_version {\n api_level: 26\n}\ndex_builder: DX_DEXER\ndex_merger: DX_MERGER\n"},"ph":"X","ts":1530548187161000,"dur":14000},{"pid":1,"tid":3,"id":43,"name":"variant manager create tasks for variant","args":{"span_id":"43","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187175000,"dur":3000},{"pid":1,"tid":3,"id":44,"name":"variant manager create tasks for variant","args":{"span_id":"44","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187178000,"dur":23000},{"pid":1,"tid":3,"id":7,"name":"variant manager create android tasks","args":{"span_id":"7","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187112000,"dur":91000},{"pid":1,"tid":3,"id":45,"name":"variant manager external native config values","args":{"span_id":"45","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187203000,"dur":100},{"pid":1,"tid":3,"id":6,"name":"base plugin create android tasks","args":{"span_id":"6","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187085000,"dur":118000},{"pid":1,"tid":3,"id":46,"name":"base plugin build finished","args":{"span_id":"46","project":"id: 1\nandroid_plugin_version: \"3.0.0\"\nandroid_plugin: APPLICATION\nplugin_generation: FIRST\nbuild_tools_version: \"26.0.2\"\ncompile_sdk: \"android-26\"\nsplits {\n}\n"},"ph":"X","ts":1530548187455000,"dur":1000}] -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-16-27-459.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-16-27-459.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-16-31-667.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-16-31-667.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-30-21-828.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-30-21-828.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-00-39-23-350.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-00-39-23-350.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-21-24-28-421.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-21-24-28-421.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-03-21-29-05-032.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-03-21-29-05-032.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-04-00-06-36-553.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-04-00-06-36-553.rawproto -------------------------------------------------------------------------------- /build/android-profile/profile-2018-07-04-00-10-16-253.rawproto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/build/android-profile/profile-2018-07-04-00-10-16-253.rawproto -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaeryang/douyin/37c2ae74d23c217e71591088b179429d48554af3/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Jul 03 00:13:10 CST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Thu Jan 02 14:44:33 CST 2020 8 | ndk.dir=/Users/javaer/Library/Android/sdk/ndk-bundle 9 | sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk 10 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------