mali graphics debugger在unroot的机器上运行unity

来源:互联网 发布:婆婆定期揍儿媳 知乎 编辑:程序博客网 时间:2024/06/18 09:32

传统上,Mali图形调试器(MGD)在root的设备上工作,在这种模式下,拦截器层位于应用程序和驱动程序之间。你的应用程序调用这个拦截器层,然后拦截器把这个调用数据的一个副本发送回MGD应用程序,并将调用传递给驱动程序。

这里写图片描述
但是,这不是MGD可以使用的唯一方法。第二个选项具有第一个选项的所有功能,还有一个额外的好处,它可以在没有修改的标准Android设备上工作。 条件是你需要访问你想要分析的应用程序的完整源代码。本博客探讨了第二个选项,以便您可以在非root用户设备上调试您的应用程序。

前提条件:

  1. 电脑应该配备Android开发环境:
    安装sdk和ndk
    系统路径包含adb库;
  2. 能访问你的应用程序的完整代码;
  3. 你的设备至少运行Android 4.2.

在unity应用程序用MGD

包含3部分:
1. 将拦截器库加入你的编译系统中;
2. 编辑你的activity以加载拦截器库;
3. 在你的设备上 安装MGDDaemon应用程序。

拷贝lib库

  1. 在你的工程中创建Assets\Plugins\Android文件夹;
  2. 在mgd安装目录下找到target\android-non-root\arm[armaebi-v7a/arm64-v8a下的libMGD.so文件,拷贝到1中文件夹;
  3. 让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

阅读全文
0 0
原创粉丝点击