针对普通手机,最低版本支持到android 5.0

GVR修改

修改sDaydreamPhoneOverrideForTesting
修改libgvr.so
修改MutableEGLConfigChooser
修改scanlineRacer的swapmode

1.0.2
.text:000834F6                 CMP             R4, #0
.text:000834F8                 ITE NE
.text:000834FA                 MOVNE           R4, #4
.text:000834FC                 MOVEQ           R4, #0
00 2C 14 BF 04 24 00 24
改为
00 2C 14 BF 04 24 04 24
只有dev-keys

1.0.3
.text:000834F6                 CMP             R4, #0
.text:000834F8                 ITE NE
.text:000834FA                 MOVNE           R4, #4
.text:000834FC                 MOVEQ           R4, #0
有dev-keys和test-keys

1.1.0
.text:000834F6                 CMP             R4, #0
.text:000834F8                 ITE NE
.text:000834FA                 MOVNE           R4, #4
.text:000834FC                 MOVEQ           R4, #0
00 2C 14 BF 04 24 00 24
有dev-keys和test-keys

2,3,4,6,7同上

8
.text:000A6CC2                 CMP             R3, #0
.text:000A6CC4                 ITE EQ
.text:000A6CC6                 MOVEQ           R4, #0
.text:000A6CC8                 MOVNE           R4, #4
00 2B 0C BF 00 24  04 24
改为
00 2B 0C BF 04 24  04 24

1.libgvr.so修改, 改方法有兼容问题,使用上面的方法
FEATURE_VR_MODE_HIGH_PERFORMANCE
46 45 41 54 55 52 45 5F 56 52 5F 4D 4F 44 45 5F 48 49 47 48 5F 50 45
52 46 4F 52 4D 41 4E 43 45 0setSwapMode0

FEATURE_WIFI
46 45 41 54 55 52 45 5F 57 49 46 49 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

2.0 替换mySDK.smali, 替换libmy.so

2.1 GvrSurfaceView.smali修改

com/google/vr/ndk/base/GvrSurfaceView
.method public setSwapMode(I)V
    .locals 2
    .prologue
    添加
    invoke-static {}, Lcom/play/my/mySDK;->getSwapMode()I
    move-result p1

2.2 com/play/my/unity/myVrActivity,onCreate函数 添加

invoke-virtual {p0}, Lcom/play/my/unity/myVrActivity;->getApplicationContext()Landroid/content/Context;
    move-result-object v3
    sput-object v3, Lcom/play/my/mySDK;->mContext:Landroid/content/Context;

2.3  com/play/my/unity/myVrActivity,onCreate函数
          invoke-virtual {v3, v4}, Ljava/lang/reflect/Constructor;->newInstance([Ljava/lang/Object;)Ljava/lang/Object;
          move-result-object v4
          check-cast v4, Lcom/unity3d/player/UnityPlayer;
          iput-object v4, p0, Lcom/play/my/unity/myVrActivity;->mUnityPlayer:Lcom/unity3d/player/UnityPlayer;
      后面添加
 invoke-static {}, Lcom/play/my/mySDK;->hookUnityFun()V

3.在程序启动时运行,在
    com/play/my/unity/myVrActivity,onCreate函数 添加

.line 121
    invoke-static {}, Lcom/play/my/mySDK;->setsDaydreamPhoneOverrideForTesting()V

.line 122
    invoke-static {}, Lcom/play/my/mySDK;->setsFingerprint()V

代码实现如下:
    private static void setsDaydreamPhoneOverrideForTesting() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                Class cls = Class.forName("com.google.vr.ndk.base.DaydreamUtils");
                Field f = cls.getDeclaredField("sDaydreamPhoneOverrideForTesting");
                f.setAccessible(true);
                f.set(null, true);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

private static void setsFingerprint() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                Class cls = Class.forName("android.os.Build");
                Field f = cls.getDeclaredField("FINGERPRINT");
                f.setAccessible(true);
                String fingerPrint = (String) f.get(null);
                if (!TextUtils.isEmpty(fingerPrint)) {
                    if (!fingerPrint.endsWith("dev-keys")) {
                        String end = fingerPrint.substring(fingerPrint.length() - 8);
                        String newFingerPrint = fingerPrint.replace(end, "dev-keys");
                        f.set(null, newFingerPrint);
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

4,封装egl hook接口,添加位置:com/google/vr/ndk/base/GvrLayout->init-> return-void 前,
  invoke-static {}, Lcom/play/my/mySDK;->hookFun()V
  com.unity3d.unitygvr.GoogleVR->resume() 添加  mySDK.enableShowTip(true);
  smali :
  const/4 v0, 0x1
  invoke-static {v0}, Lcom/play/my/mySDK;->enableShowTip(Z)V

com.unity3d.unitygvr.GoogleVR->pause() 添加  mySDK.enableShowTip(false);
  smali:
  const/4 v0, 0x0
  invoke-static {v0}, Lcom/play/my/mySDK;->enableShowTip(Z)V

代码并且实现如下:
typedef EGLImageKHR (*FP_eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
FP_eglCreateImageKHR pfun_eglCreateImageKHR = NULL;
EGLImageKHR myeglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
{
    LOGE("myeglCreateImageKHR");
    EGLint eglImgAttrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE };
    EGLImageKHR img = pfun_eglCreateImageKHR(dpy, eglGetCurrentContext(), EGL_GL_TEXTURE_2D_KHR, buffer, eglImgAttrs);
    return img;
}

typedef EGLClientBuffer (*FP_eglCreateNativeClientBufferANDROID)(const EGLint *attrib_list);
FP_eglCreateNativeClientBufferANDROID pfun_eglCreateNativeClientBufferANDROID = NULL;
EGLClientBuffer myeglCreateNativeClientBufferANDROID (const EGLint *attrib_list)
{
    LOGE("myeglCreateNativeClientBufferANDROID");
    GLuint textureId;
    glGenTextures ( 1, &textureId );
    glBindTexture ( GL_TEXTURE_2D, textureId );
    int width = attrib_list[1];
    int height = attrib_list[3];
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
    return (EGLClientBuffer)textureId;
}

//typedef void (*__eglMustCastToProperFunctionPointerType)(void);
EGLAPI __eglMustCastToProperFunctionPointerType (*old_eglGetProcAddress)(const char *procname) = NULL;
EGLAPI __eglMustCastToProperFunctionPointerType my_eglGetProcAddress(const char *procname)
{
    LOGE("my_eglGetProcAddress");
    __eglMustCastToProperFunctionPointerType pfun = old_eglGetProcAddress(procname);

if(strcmp(procname, "eglCreateImageKHR") == 0)
    {
        LOGE("my_eglGetProcAddress, eglCreateImageKHR");
        pfun_eglCreateImageKHR = (FP_eglCreateImageKHR)pfun;
        pfun = (__eglMustCastToProperFunctionPointerType)myeglCreateImageKHR;
    }
    if(strcmp(procname, "eglCreateNativeClientBufferANDROID") == 0 )
    {
        LOGE("my_eglGetProcAddress, eglCreateNativeClientBufferANDROID");
        pfun_eglCreateNativeClientBufferANDROID = (FP_eglCreateNativeClientBufferANDROID)pfun;
        pfun = (__eglMustCastToProperFunctionPointerType)myeglCreateNativeClientBufferANDROID;
    }
    return pfun;
}

5、
com/google/vr/cardboard/MutableEglConfigChooser类中
public EGLConfig chooseConfig(EGL10 var1, EGLDisplay var2) {
  // int[] var3 = new int[]{12324, 8, 12323, 8, 12322, 8, 12321, 0, 12325, 0, 12326, 0, 12352, 64, 12339, 4100, 12344};
  4100 修改为4

5.1 针对华为等手机闪退 修改
    com/google/vr/cardboard/MutableEglConfigChooser类中
    public EGLConfig chooseConfig(EGL10 var1, EGLDisplay var2) 函数中

EGLConfig[] configs = new EGLConfig[1];
        if(!var1.eglChooseConfig(var2, var3, configs, 1, var4) && this.forceMutableBuffer) {
            throw new IllegalArgumentException("eglChooseConfig failed");
        } else {
     添加 configs变量,同时修改addScanlineRacingView 函数中,
     this.eglFactory.setUsePriorityContext(false);

6、
com/google/vr/cardboard/MutableEglConfigChooser类中
  private static EGLConfig chooseConfig(EGL10 var0, EGLDisplay var1, EGLConfig[] var2, boolean var3) {
        EGLConfig[] var4 = var2;
        int var5 = var2.length;

for(int var6 = 0; var6 < var5; ++var6) {
            EGLConfig var7 = var4[var6];
            int var8 = findConfigAttrib(var0, var1, var7, 12325, 0);
            int var9 = findConfigAttrib(var0, var1, var7, 12326, 0);
            int var10 = findConfigAttrib(var0, var1, var7, 12324, 0);
            int var11 = findConfigAttrib(var0, var1, var7, 12323, 0);
            int var12 = findConfigAttrib(var0, var1, var7, 12322, 0);
            int var13 = findConfigAttrib(var0, var1, var7, 12339, 0);
            if(var10 == 8 && var11 == 8 && var12 == 8 && var8 == 0 && var9 == 0 && (!var3 || (var13 & 0x4) != 0)) {
                return var7;
            }
        }
// 4094 ->4
//        for(int var6 = 0; var6 < var5; ++var6)
//        {
//            EGLConfig var7 = var4[var6];
//            return var7;
//
//        }

return null;
    }

任意android 手机支持daydream相关推荐

  1. android 手机支持什么格式的视频格式,手机高清小普及:手机支持那些视频格式?...

    背景 虽然在2010年众多的手机厂商都推出了他们的高清手机,可是由于手机的硬件以及操作系统的限制,因此并不是所有的高清格式都能够在目前市面上那些支持高清播放的手机中播放.那么如果大家想要在手机上欣赏高 ...

  2. 原生android看netflix,现在有四款Android手机支持Netflix HD

    如果有针对全球大流行量身定制的应用程序,那就是Netflix.有了瑞安·墨菲(Ryan Murphy)的好莱坞(Hollywood),黑色喜剧片<死给我>(Dead to Me)和富勒之家 ...

  3. 让你的Android手机支持LKM

    前言 调试Android程序的时候不可避免的会遇到一些恶心的反调试,为了一劳永逸的解决这些反调试问题,使用LKM模块来制作一个调试沙箱是一个很不错的想法,就像当年Windows平台上盛行一时的relo ...

  4. C++学习(四四三)Android手机支持的opengl特性

    const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字 const GLubyte* biaoshifu = glGet ...

  5. android rmvb格式下载,顶峰-Android手机视频转换器

    主要特点: 输入视频格式 支持视频如 RM,RMVB,AVI,MPEG,MPG,MKV,DAT,VOB,ASF,WMV,FLV,MOV,MP4,3GP,MTS,M2TS,MOD,TOD,F4V,TS, ...

  6. android手机启动u盘,十款适合Android手机使用的U盘

    为了实现更好的便携性,越来越多的手机开始采用超薄一体式机身设计,所以需要做出一些牺牲,比如舍弃了存储卡插槽.而相对来说,大容量版本的价格偏高.基本容量又不够用,让用户陷入两难境地.不过,如果你的 An ...

  7. 如何将你的android手机和outlook的通讯录同步?

    前几天一个朋友给我提的一个问题,他说android手机好像无法和outlook的联系人同步,这个很麻烦,因为他已经用习惯了outlook.当然,他要的不仅仅是备份,而是同步(即其中有一端修改了,另一端 ...

  8. Android手机导出微信聊天记录

    如果android手机上有重要的微信聊天记录,一定有备份的需要,可参考以下方法: 1.首先需要您的android手机支持root,用可root的"手机资源管理器"进入目录拷贝微信数 ...

  9. android canvas 保存图片,ionic3 html5 video 抓图保存到手机相册,解决Android手机不支持Canvas drawImage问题...

    当然百度出上W条答案 上代码,相信下面代码和小伙伴大同吧 相信好多做webview app的小伙伴们都有同样的问题,在pc上能轻松实现video 抓图.但是在android手机大多是不支持canvas ...

最新文章

  1. Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
  2. python元组元素的提取比_Python 元组数据类型(tuple)详解 [访问元组元素][修改元组元素][删除元组][学习 Python 必备基础知识][看此一篇就够了]...
  3. P2396 yyy loves Maths VII 状压dp 变态卡常
  4. WiFi行业9大趋势解析
  5. 2015国产手机圈成绩单
  6. windows常见软件库
  7. 中国城市人口分布区域分析
  8. PIL.Image convert to numpy array
  9. python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...
  10. 刚刚,阿里开源 iOS 协程开发框架 coobjc!
  11. 站酷用HTML5播放视频,站酷:动效展示实践的问题及解决
  12. python中float可以和int计算吗_python 中int ,float,字符串的操作
  13. python电脑下载安装-Python的下载安装与Python编辑器的安装
  14. 堆排序-java实现
  15. Python 生命游戏(tkinter版)
  16. 重复抽样与不重复抽样的抽样平均误差大小?
  17. Ubuntu18.04忘记超级用户root密码,重新设置密码
  18. [noip2014]解方程 hash+秦九昭
  19. 淘宝直通车新功能智能推广 智能推广计划设置 智能推广优化 智能推广优化原则
  20. 软件测试证述职报告ppt,实验室检测员的述职报告ppt

热门文章

  1. 2022下半年软考各地报名时间汇总
  2. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章 PL读写PS端DDR数据
  3. 本地化社交问答网站Drumo瞄准亚洲和澳洲市场
  4. 一个手镯让女孩们找到编程的乐趣
  5. 2023 首发 DiscuzX 基础功能开发的小米模板
  6. 2022年全球市场小型耕耘机总体规模、主要生产商、主要地区、产品和应用细分研究报告
  7. 信息、信息技术、信息系统、软件、信息化、企业信息化
  8. 上海大学操作系统(12)实验报告分享(SHU-OS)
  9. 智慧产业园区标准体系总体框架
  10. 分体式空调控制器厂家对比