Skip to content
/ mmat Public

An automatically testing and analysis hprof library for android app ( tự động phân tích Android nội tồn tiết lộ )

License

Notifications You must be signed in to change notification settings

hehonghui/mmat

Repository files navigation

MMAT - Android tự động hoá nội tồn phân tích công cụ

Download CircleCI

Ở khai phá Android App trong quá trình chúng ta thông thường sử dụngLeakCanaryTiến hành nội tồn tiết lộ kiểm tra đo lường, nó cơ bản nguyên lý là ở App vận hành khi kiểm tra đo lường Activity, Fragment hay không sinh ra nội tồn tiết lộ, nếu có nội tồn tiết lộ tắc tiến hành dump hprof, sau đó phân tích nên tiết lộ GC ROOT, cuối cùng thông qua thông tri lan thông tri người dùng nội tồn tiết lộ tình huống. Phương thức này có thể ở khai phá app khi đơn giản, hữu hiệu mà tìm ra nội tồn tiết lộ.

Nhưng là bởi vìLeakCanaryLà app vận hành khi phát hiện tiết lộ lúc sau lập tức dump nội tồn mau chiếu, hơn nữa thật khi tiến hành nội tồn phân tích, mà bởi vì di động thiết bị tính toán năng lực hữu hạn, dẫn tới nếu nội tồn tiết lộ so lâu ngày sử dụngLeakCanaryCũng không thể ở vận hành thời gian phân ra sở hữu nội tồn tiết lộ, tỷ như đươngLeakCanaryĐang ở phân tích một lần nội tồn tiết lộ khi lại sinh ra mặt khác nội tồn tiết lộ, mà ở LeakCanary phân tích xong sở hữu nội tồn tiết lộ phía trước người dùng khả năng đã rời khỏi app.

Bởi vậy yêu cầu mặt khác một loạiBổ sung cơ chế,Có thể ở App vận hành sau khi chấm dứt tiến hành toàn diện, tự động mà ly tuyến phân tích app nội tồn tiết lộ, dùng một lần phân tích ra lần này App vận hành sinh ra sở hữu Activity, Fragment nội tồn tiết lộ, như vậy sẽ làm nội tồn tiết lộ phân tích càng thêm toàn diện, hiệu suất cao.

MMAT chính là vì giải quyết vấn đề này, nó trung tâm ý nghĩ là người dùng ở thao tác xong app ( có thể là kỹ sư chính mình thao tác, cũng có thể thông qua vận hành Monkey tiến hành tùy cơ thao tác ) lúc sau, thông quaadb shellMệnh lệnh đem app lui trở lại chủ giao diện, sau đó lại lui về mặt bàn ( lúc này ứng dụng Application còn tồn tại, nhưng là sở hữu Activity đều hẳn là bị tiêu hủy, app ở vào hậu trường trạng thái. Nếu lúc này còn có Activity, Fragment ví dụ thực tế, như vậy đại biểu sinh ra nội tồn tiết lộ ). Đương App ở vào hậu trường trạng thái khi dump App nội tồn mau chiếu đến pc thượng, sau đó lại thông qua MMAT tiến hành ly tuyến phân tích, cuối cùng được đến nội tồn tiết lộ hoàn chỉnh báo cáo.

Một, MMAT công tác lưu trình

  1. Nếu có phối trí monkey thí nghiệm mệnh lệnh, tắc chấp hành monkey thí nghiệm (monkey thí nghiệm sẽ khiến cho App sẽ tùy cơ tiến vào các loại Activity, loại này áp lực thí nghiệm cũng dễ dàng sinh ra nội tồn tiết lộ; )
    • 1.1 chấp hành monkey thí nghiệm
    • 1.2 trở lại app chủ giao diện
    • 1.3 đem app thối lui đến hậu trường, trở lại di động mặt bàn
    • 1.4 thông quaadb shell kill -10Mệnh lệnh chấp hành app force gc ( yêu cầu di động là root)
  2. Nếu ngươi không nghĩ sử dụng monkey, cũng có thể chính mình tay động thao tác App, hoàn thành sở hữu thao tác lúc sau đem App thối lui đến hậu trường
  3. Vận hành MMAT, dump hprof nội tồn mau chiếu
  4. Phân tích hprof, được đến sở hữu Activity, Fragment tiết lộ ký lục cùng với vượt qua nhất định lớn nhỏ Bitmap văn kiện
  5. Đem phân tích kết quả phát ra vì html báo cáo

MMAT Demo biểu thị thỉnh điểm đánh xuống mặt video:

Nhị, sử dụng MMAT

Chú ý: Bởi vì MMAT ở thông qua monkey thao tác app sau sẽ sử dụng adb mệnh lệnh dump ứng dụng nội tồn tin tức, bởi vậy nếu ngươi yêu cầu dump release bản app nội tồn tin tức, thỉnh bảo đảm ngươi app ở thí nghiệm khi nhưng điều chỉnh thử, tức yêu cầu ở AndroidManifest.xml application tiết điểm trúng tăng thêmandroid:debuggable= "true",Thỉnh tham khảoAndroidManifest.xml phối trí(Nguy hiểm nhắc nhở: Kiến nghị chỉ ở thí nghiệm khi mở ra debuggable=true, đối ngoại tuyên bố apk không cần thiết trí vì true).

Sử dụng MMAT có hai loại phương thức, một loại là thông qua mmat gradle cắm kiện, một loại là trực tiếp chấp hành jar văn kiện, thỉnh tham khảo2.1 chươngCùng2.2 chương

2.1 thông qua gradle plugin sử dụng MMAT

  • Ở hạng mục build.gradle trung tăng thêmmmat-pluginTrích dẫn;
    Thí dụ mẫu như sau:
buildscript{

repositories {
//...
}

dependencies {
classpath'com.android.tools.build:gradle:3.4.1'

//add mmat plugin library
classpath'org.mrcd:mmat-plugin:0.9.2'
}
}
  • Ở app module build.gralde trung tăng thêm mmat-plugin cùng phối trí
applyplugin:'com.mrcd.mmat.plugin'


//Phối trí mmat plugin
mmat{
//json config file
jsonConfigFile'app/mmat-config.json'
//Hay không cấm dùng monkey thí nghiệm
disableMonkey false

//Nếu giả thiết nên tham số, MMAT sẽ trực tiếp phân tích nên nội tồn mau chiếu,monkey kịch bản gốc sẽ bị xem nhẹ
//hprofFile "your-hprof-file-path"
}
  • Chấp hành./gradlew startMmatRunnerTiến hành app tự động nội tồn phân tích, cuối cùng báo cáo sẽ tồn tại bị thí nghiệm apphprof_analysis/report/Mục lục hạ, báo cáo thí dụ mẫu tham khảoHprof Analysis Report.

2.2 thông qua jar văn kiện sử dụng MMAT

Đemmmat-1.0.jarDownload đến hạng mục căn mục lục, mặt khác ở hạng mụcCăn mục lụcHạ tăng thêmmmat-config.jsonPhối trí ( như thế nào phối trí thỉnh tham khảommat config phối trí), sau đó chấp hành mmat nhưng chấp hành jar văn kiện. Tỷ như ta thí nghiệm hạng mục đường nhỏ là/User/mrsimple/test-project/,Tăng thêmmmat-config.jsonVăn kiện, hơn nữa tiến hành tương quan phối trí, cuối cùng trang bị muốn thí nghiệm apk lúc sau, ở hạng mục căn mục lục hạ chấp hành tiến vào đến như sau mệnh lệnh:

java -jar mmat-1.0.jar /User/mrsimple/test-project/mmat-config.json

Chấp hành xong lúc sau có thể ở/User/mrsimple/test-project/hprof-analysis/reportHạ nhìn đến nội tồn phân tích html báo cáo. Như sau đồ sở kỳ:

Báo cáo trung đệ nhất hành vi báo cáo tiêu đề, đệ nhị hành cấp ra vận hành thí nghiệm di động kích cỡ, hệ thống phiên bản chờ tin tức. Lại sau này chính là nội tồn tiết lộ ký lục danh sách, tỷ như điều thứ nhất ký lục vì:

1.com.example.mmat.MemoryLeakActivity(0x12d552d0)instance(2.06MB)

*leaked==>com.example.mmat.MemoryLeakActivity(0x12d552d0)instance(2.06MB)
item->java.util.LinkedList$Node
first->java.util.LinkedList
sActivityLeaked->staticcom.example.mmat.MemoryLeakActivity
[15] ->arrayjava.lang.Object[]
runtimeInternalObjects->dalvik.system.PathClassLoader
contextClassLoader->threadjava.lang.Thread(named'null')

Trong đó leaked ==> sau MemoryLeakActivity chính là tiết lộ Activity, nó nội tồn địa chỉ vì 0x12d552d0, kiềm giữ nội tồn lớn nhỏ vì 2.06MB. Kế tiếp đi theo chính là cái này Activity ví dụ thực tế trích dẫn liên, thông qua phân tích cái này trích dẫn liên là có thể đủ tìm được tạo thành nội tồn tiết lộ điểm mấu chốt. Toàn bộ trích dẫn liên phát ra trình tự là dựa theo MAT cách thức phát ra, nếu chúng ta đem lần này được đến nội tồn mau chiếu trải qua hprof-conv lúc sau dẫn vào MAT ( cũng chính là Memory Analyzer Tool, chúng ta thường dùng tới phân tích nội tồn tiết lộ công cụ, MMAT chính là căn cứ vào MAT mệnh danh.), tìm được địa chỉ vì 0x12d552d0 MemoryLeakActivity, được đến trích dẫn liên như sau đồ sở kỳ:

Có thể nhìn đến, chúng ta thông quaMMATPhát ra trích dẫn liên cùng thông qua MAT được đến cơ bản nhất trí.

Lại quay đầu phân tích thượng đồ trung điều thứ nhất nội tồn tiết lộ ký lục, đối với chúng ta tới nói, tạo thành nội tồn tiết lộ điểm mấu chốt làstatic com.example.mmat.MemoryLeakActivity.sActivityLeaked( cái này yêu cầu căn cứ chính mình số hiệu cùng với báo cáo trung tin tức cụ thể phân tích ), Tỏ vẻ chính là MemoryLeakActivity loại trung trạng thái tĩnh tự đoạnsActivityLeakedTrích dẫn cái nàyMemoryLeakActivityVí dụ thực tế. Từ kế tiếp trích dẫn liên tin tức xem, cái nàysActivityLeakedHẳn là một cái LinkedList loại hình,MemoryLeakActivityLà nó trong đó một cái nguyên tố.

Chúng ta lại đến MemoryLeakActivity trung xem xétsActivityLeakedTương quan số hiệu, như sau sở kỳ:

/**
* sinh ra nội tồn tiết lộ giao diện
*/
publicclassMemoryLeakActivityextendsAppCompatActivity{

privatestaticList<Activity>sActivityLeaked=newLinkedList<>();

//... Mặt khác số hiệu

@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);

// memory leaked
sActivityLeaked.add(this);
}
}

Có thể nhìn đến, chúng ta ở onCreate hàm số trung tướng MemoryLeakActivity tăng thêm đến sActivityLeaked trung, nhưng là không có ở bất luận cái gì địa phương xóa bỏ, bởi vậy tạo thành nội tồn tiết lộ, xóa tương quan số hiệu có thể giải quyết cái này nội tồn tiết lộ.

Mặt khác nội tồn tiết lộ cũng là thông qua cùng loại phương pháp căn cứ báo cáo tiến hành phân tích là được.

Mặt khác quan trọng phối trí

Nếu ngươi không nghĩ thông qua Monkey thao tác App, cũng có thể chính mình thao tác App tiến vào, rời khỏi các Activity, sau đó đem App thối lui đến hậu trường, lại đem mmat phối trí văn kiện trungmonkey_commandTrí không, sau đó lại chấp hành./gradlew startMmatRunner,Lúc này liền sẽ trực tiếp dump app nội tồn mau chiếu, sau đó tiến hành kế tiếp kéo lấy nội tồn mau chiếu cùng với phân tích nội tồn công tác.

Mà nếu ngươi đã có một phần App nội tồn mau chiếu hprof văn kiện, ngươi có thể ở mmat phối trí trung chấp hành hprof đường nhỏ ( tứchprofFileTham số ), sau đó chấp hành./gradlew startMmatRunnerNhiệm vụ, MMAT đem trực tiếp phân tích cái này hprof văn kiện, cuối cùng phân tích ra nên nội tồn mau chiếu trung nội tồn tiết lộ.

Tam, mmat-config.json phối trí thuyết minh

  • package:Muốn thí nghiệm ứng dụng bao danh, tất điền
  • main_activity:Ứng dụng chủ giao diện loại đường nhỏ, tất điền ( yêu cầu ở AndroidManifest.xml đăng ký khi tăng thêmexported=true)
  • monkey_command:monkey mệnh lệnh ( tự phù xuyến mệnh lệnh ) hoặc là shell kịch bản gốc đường nhỏ ( hoàn chỉnh văn kiện đường nhỏ )
  • enable_force_gc:dump hprof văn kiện phía trước hay không đối mục tiêu App force gc ( cam chịu vì true)
  • hprof_dir:dump ra tới hprof gửi ở Android thiết bị trung căn mục lục ( cam chịu vì/sdcard/), Android hệ thống cam chịu không cho phép phỏng vấn/sdcard/Khi có thể phối trí cái này tham số sửa chữa hprof tồn trữ đường nhỏ, nếu không vô phápadb pull hprofVăn kiện.
  • detect_leak_classes:Muốn kiểm tra đo lường nội tồn tiết lộ loại danh sách, chủ yếu là Activity, Fragment tử loại. Nếu ngươi không có mặt khác loại hình yêu cầu kiểm tra đo lường, tắc không cần sửa chữa cái này phối trí;
  • excluded_refs:Muốn bài trừ sinh ra tiết lộ đối tượng ( tỷ như Android hệ thống chính mình nội tồn tiết lộ ), chỉ có nhược trích dẫn cùng mềm trích dẫn đối tượng thông thường cũng muốn bài trừ
    • class: Muốn bài trừ loại danh
    • fields: Tự đoạn danh sách, tức bài trừ nào đó loại nào đó tự đoạn sinh ra nội tồn tiết lộ
    • type: Đại biểu là trạng thái tĩnh tự đoạn (static) vẫn là ví dụ thực tế tự đoạn (instance) sinh ra nội tồn tiết lộ
  • bitmap_report:bitmap báo cáo phối trí
    • max_report_count:Báo cáo trung nhiều nhất phát ra nhiều ít trương hình ảnh, thiết trí vì -1 khi không làm số lượng hạn chế
    • min_width:Báo cáo trung nếu hình ảnh độ rộng nhỏ hơn cái này giá trị tắc không phát ra
    • min_height:Báo cáo trung nếu hình ảnh độ cao nhỏ hơn cái này giá trị tắc không phát ra

mmat-config.json thí dụ mẫu như sau:

{
"package":"com.example.mmat",
"main_activity":"com.example.mmat.MainActivity",
"monkey_command":"adb shell monkey -p com.example.mmat --ignore-crashes --ignore-timeouts --ignore-native-crashes --ignore-security-exceptions --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 -s 12358 -v -v -v --throttle 300 200",
// "monkey_command": "/User/mrsimple/test_monkey.sh", // monkey kịch bản gốc phối trí
"enable_force_gc":true,
"hprof_dir":"/data/local/tmp/",
"detect_leak_classes":[
"android.app.Activity",
"android.app.Fragment",
"android.support.v4.app.Fragment"
],
"excluded_refs":[
{
"class":"java.lang.ref.WeakReference",
"fields":["referent"],
"type":"instance"
},
{
"class":"java.lang.ref.SoftReference",
"fields":["referent"],
"type":"instance"
},
{
"class":"java.lang.ref.FinalizerReference",
"fields":["referent"],
"type":"instance"
},
{
"class":"android.arch.lifecycle.ReportFragment",
"fields":[],
"type":"static"
}
],
"bitmap_report":{
"max_report_count":20,
"min_width":200,
"min_height":200
}
}

Kể trên thí dụ mẫu trung Monkey sự kiện số lượng chỉ có 200 thứ, chân thật thí nghiệm cảnh tượng có thể thiết trí vì càng cao sự kiện số, tỷ như chúng ta Jenkins ngôi cao trung Monkey thí nghiệm sự kiện số sẽ thiết trí vì mấy vạn thứ. Cụ thể sự kiện số lượng khai phá giả có thể căn cứ tình huống tiến hành giả thiết, nhưng không nên thiết trí vì quá thấp sự kiện số, nếu không nội tồn tiết lộ khả năng không dễ dàng xuất hiện.

Bốn, AndroidManifest.xml application phối trí dạng lệ

Chú ý, chỉ ở 【 thí nghiệm khi 】 tăng thêm này đó phối trí có thể ( có thể thông qua flavor đối bất đồng phiên bản tiến hành bất đồng phối trí ).

  • application trung phối tríandroid:debuggable= "true",Như vậy bảo đảm ở debug, release hình thức hạ có thể thông qua adb shell dump nội tồn số liệu (hprof)
  • MainActivity (App chủ giao diện ) trung phối tríandroid:exported= "true"Cùngandroid:launchMode= "singleTask"
    • android:exported= "true":Bảo đảm có thể thông qua adb shell khởi động chủ giao diện
    • android:launchMode= "singleTask":Bảo đảm thông qua adb shell khởi động chủ giao diện khi, Activity sạn trung mặt khác giao diện sẽ bị thanh trừ. Lúc này chỉ có chủ giao diện ở sạn đỉnh, tức trừ bỏ chủ giao diện ở ngoài mặt khác Activity đều hẳn là đã tiêu hủy.Như vậy thông qua Monkey thí nghiệm xong lúc sau, lại thông qua adb shell khởi động chủ giao diện sau cũng chỉ có chủ giao diện tồn tại, sau đó lại thông qua adb shell đem app thối lui đến hậu trường, lúc này chủ giao diện cũng sẽ bị tiêu hủy, sau đó lại dump nội tồn mau chiếu, lại phân tích nội tồn, lúc này nếu còn tồn tại Activity, Fragment tắc tỏ vẻ sinh ra nội tồn tiết lộ.

Thí dụ mẫu như sau:

<application
android:debuggable="true"

android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<activityandroid:name=".MainActivity"android:exported="true"android:launchMode="singleTask">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

License

Copyright (C) 2019 Mr.Simple <simplecoder.h@gmail >

Licensed under the Apache License, Version 2.0 (the "License" );
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http:// apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

An automatically testing and analysis hprof library for android app ( tự động phân tích Android nội tồn tiết lộ )

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages