传统上,Mali图形调试器(MGD)在root的设备上工作,在这种模式下,拦截器层位于应用程序和驱动程序之间。你的应用程序调用这个拦截器层,然后拦截器把这个调用数据的一个副本发送回MGD应用程序,并将调用传递给驱动程序。
但是,这不是MGD可以使用的唯一方法。第二个选项具有第一个选项的所有功能,还有一个额外的好处,它可以在没有修改的标准Android设备上工作。 条件是你需要访问你想要分析的应用程序的完整源代码。本博客探讨了第二个选项,以便您可以在非root用户设备上调试您的应用程序。
前提条件:
- 电脑应该配备Android开发环境:
安装sdk和ndk
系统路径包含adb库; - 能访问你的应用程序的完整代码;
- 你的设备至少运行Android 4.2.
在unity应用程序用MGD
包含3部分:
1. 将拦截器库加入你的编译系统中;
2. 编辑你的activity以加载拦截器库;
3. 在你的设备上 安装MGDDaemon应用程序。
拷贝lib库
- 在你的工程中创建Assets\Plugins\Android文件夹;
- 在mgd安装目录下找到target\android-non-root\arm[armaebi-v7a/arm64-v8a下的libMGD.so文件,拷贝到1中文件夹;
- 让unity的标准activity默认加载mgd拦截库。
package test.application;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.util.Log;
public class StandardActivity extends UnityPlayerActivity
{
protected void onCreate(Bundle savedInstanceState)
{
try
{
System.loadLibrary("MGD");
}
catch( UnsatisfiedLinkError e)
{
Log.i("[ MGD ]", "libMGD.so not loaded.");
}
super.onCreate(savedInstanceState);
}
}
注意java文件所在目录需要与package路径一致。如果你的package叫A.B,那么你的java文件需要放在A\B目录下,比如上述情况需要把java文件放到A\B下。
由于你需要一些来自Android的函数,你需要将Android.jar放到你的系统的类路径下,一般放在Android Sdk的platforms\android-X路径下,X是你的目标sdk版本号。由于要继承UnityPlayerActivity类,需要加入Unity的classes.jar文件,在unity安装路径下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes。如果用的java sdk大于1.6需要加入命令-source 1.6和target 1.6 ,所以命令行是:
C:\scratch>javac -cp “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar;C:\android\sdk\platforms\android-21\android.jar” -source 1.6
-target 1.6 test\application\StandardActivity.java
如果是mac电脑:javac -cp “/Users/exampleUser/android-sdk-macosx/platforms/android-23/android.jar:/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar” -source 1.6
-target 1.6 test/application/StandardActivity.java
然后需要把编译的class加入一个jar文件
jar cvf myActivity.jar test\application\StandardActivity.class。
将jar文件放入1中文件夹下。
创建AndroidManifest.xml文件
我们创建了activity类,并不代表unity会用。我们需要覆盖AndroidManifest文件。在assets/Android文件夹下创建一个AndroidManifest.xml文件,unity会自动调用。需要放在这个文件里:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity android:name="StandardActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
android:name是你创建的activity的名字。一旦完成,你可以用平常的方式编译Android应用程序。最后注意打包时候的bundleId要和activity的包名一致。这里是test.Application。
参考:https://community.arm.com/graphics/b/blog/posts/using-mali-graphics-debugger-on-a-non-rooted-device
https://community.arm.com/graphics/b/blog/posts/building-a-unity-application-with-mali-graphics-debugger-support
https://community.arm.com/graphics/b/blog/posts/mgd-integration-in-unity