jni实现微博登录(代码片段)

东东7_7 东东7_7     2022-10-26     807

关键词:

JNI接入

参考我的另一篇博客
https://blog.csdn.net/dongdong7_77/article/details/127236209?spm=1001.2014.3001.5502

微博SDK导入

参考官方地址
https://open.weibo.com/?from=from_parent_mindnote

导入的一些关键点

资源文件通过UPL导入
将文件放到工程目录,并且要定义路径,让aar文件可以被找到

<buildGradleAdditions>
    <insert>
      repositories 
      flatDir dirs '/src/main/libs/' 
      
      dependencies 
      implementation (name: 'openDefault-9.12.0',ext:'aar')
      
    </insert>
</buildGradleAdditions>
  
<resourceCopies>
    <copyFile  src = "$S(PluginDir)/openDefault-9.12.0.aar"  dst = "$S(BuildDir)/libs/openDefault-9.12.0.aar" /> 
</resourceCopies>

权限的添加

<androidManifestUpdates>
    <!-- 增加权限 -->
     <addPermission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <addPermission android:name="android.permission.INTERNET" />
     <addPermission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <addPermission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</androidManifestUpdates>

混淆的添加

<gradleProperties> 
     <insert>
       -keep public class com.sina.weibo.sdk.***;
     </insert>
</gradleProperties>

安卓工程架构

安卓工程的构建方式和项目架构
https://blog.csdn.net/u012792686/article/details/54869895?from=from_parent_mindnote

安卓项目文件和UPL的对照

主要是以下路径文件UnrealBuildTool/System/UnrealPluginLanguage.cs和官方文档给的部分常用方法

调试方法

安卓调试与Google play打包提交
通过Android Studio进行调试

生成文件

  1. 打包我们的项目,将他生成为APK包
  2. 这时我们项目路径下会生成\\Intermediate目录
    打开Android Studio Launcher
    点击左上角的open,就可以打开UE为我们生成的安卓项目

C:\\YourProjectName\\Intermediate\\Android\\APK\\Gradle(UE4的路径)
C:\\YourProjectName\\Intermediate\\Android\\arm64\\Gradle(UE5的路径)

再进入run =》Edit Configurations,将调试类型改为Dual

转到 LLDB启动命令,选项卡,按下 加号(plus)输入以下信息
命令脚本导入

"C:\\PathToYourUE4EngineInstall\\Engine\\Extras/LLDBDataFormatters\\UE4DataFormatters_2ByteChars.py"

当显示要选择的设备的时候,确定即可,之后选择run下的debug app即可开始调试

现在,打开项目的任意一个.cpp文件,并将断点添加到要调试的行,然后运行调试
配置完成之后就可以在代码中去打断点,下面代码就停到了这里

下方同时有很多工具可以方便我们去调试

总结:这其实是一种调试的方式,但是我们更多的是在windows上将项目调试好,之后打包放在安卓中查看效果

遇到的问题:在生成调试的android文件夹,我们使用的为3.5.3的版本生成的,但是他的项目并不能使用
解决方法:直接升级最新的android版本,项目即可构建成功

Android设备直接启动(不需要打包)

前置条件

  1. 启动开发者模式
  2. 在开发者选项中启动USB调试
    设置好之后就可以直接在这里去启动

通过window工具生成日志

下载ADB工具包
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
测试手机是否连接(手机需要开启USB调试功能)
CMD进入下载的文件夹,输入adb devices查看连接的设备

调试指令

adb logcat -b main -v time *:E >app.log

具体使用到的命令解析:

  1. -b Android中的日志缓冲区 : system缓冲区 - 与系统相关的日志信息, radio缓冲区 - 广播电话相关的日志信息, events缓冲区 - 事件相关的日志信息, main缓冲区 - 默认的缓冲区;
  2. -v time 可以打印出时间
  3. *:E 这个为过滤选择,
    – V : Verbose (明细);
    – D : Debug (调试);
    – I : Info (信息);
    – W : Warn (警告);
    – E : Error (错误);
    – F : Fatal (严重错误);
    – S : Silent(Super all output) (最高的优先级, 可能不会记载东西);

最后为输出的路径 》log.app代表输入到当前文件
注:可以通过 adb logcat --help 来获取详细的信息
C:\\Users\\Administrator\\Desktop\\adb>adb logcat --help
Usage: logcat [options] [filterspecs]
options include:
-s Set default filter to silent.
Like specifying filterspec ‘*😒’
-f Log to file. Default to stdout
-r [] Rotate log every kbytes. (16 if unspecified). Requires -f
-n Sets max number of rotated logs to , default 4
-v Sets the log print format, where is one of:

              brief process tag thread raw time threadtime long  

-c clear (flush) the entire log and exit
-d dump the log and then exit (don’t block)
-t print only the most recent lines (implies -d)
-g get the size of the log’s ring buffer and exit
-b Request alternate ring buffer, ‘main’, ‘system’, ‘radio’
or ‘events’. Multiple -b parameters are allowed and the
results are interleaved. The default is -b main -b system.
-B output the log in binary
filterspecs are a series of
[:priority]

where is a log component tag (or * for all) and priority is:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent (supress all output)

’ means ':d’ and by itself means :v

If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS.
If no filterspec is found, filter defaults to ‘*:I’

If not specified with -v, format is set from ANDROID_PRINTF_LOG
or defaults to “brief”

打开输出我们的文件即可

通过手机生成日志

例子:红米K30 pro
在我的设备 =》全部参数 =》处理器(连点5下)
手机系统就会生成一个5~10分钟的bug报告

Android日志的阅读
log等级的划分:

  1. Log.v:这里的v代表Verbose啰嗦的意思,对应的log等级为VERVOSE。采用该等级的log,任何消息都会输出。
  2. Log.d:这里的d代表Debug调试的意思,对应的log等级为DEBUG。采用该等级的log,除了VERBOSE级别的log外,剩余的4个等级的log都会被输出。
  3. Log.i:这里的i代表information,为一般提示性的消息,对应的log等级为INFO。采用该等级的log,不会输出VERBOSE和DEBUG信息,只会输出剩余3个等级的信息。
  4. Log.w:w代表warning警告信息,一般用于系统提示开发者需要优化android代码等场景,对应的等级为WARN。该级别log,只会输出WARN和ERROR的信息。
  5. Log.e:e代表error错误信息,一般用于输出异常和报错信息。该级别的log,只会输出该级别信息。一般Android系统在输出crassh等致命信息的时候,都会采用该级别的log。
    个人理解:这样子划分有助于调试的时候筛选关键的信息,合理的筛选出需要的信息
    简单的将一条log分析一下

通过log就能很准确的定位到原因和位置

Google play 打包提交

基本概念

在打包提交的时候,我们还应该有一些基本的概念才能更好的帮助我们去理解

  1. obb文件:是一个数据包文件,他是谷歌平台发行软件时候的一种标准,不过从2021年开始,Google已经全面使用abb文件,obb文件已经退出了历史的舞台
  2. AAB文件:AAB文件是经过签名的二进制文件,通常用于发布的产品。优点是小
  3. SDK:则为软件开发工具包,这里使用的则为安卓SDK开发的工具包
  4. JDK:Java Development ToolKit(Java开发工具包)
  5. NDK:是安卓平台对针对C++库的一个支持,就是C++的一个开发工具包

UE设置生成AAB文件

在project=》platforms=》android=》app bundles可以选择分割包的类型

PS:上面解释了AAB文件比传统的apk包要小,其主要原因就是他将apk包分成了很多部分,他会根据手机的类型动态的加载,所以下面的选项是

  1. 是否生成AAB文件
  2. 是否生成支持全部类型的APK包
  3. 是否分割出二进制包
  4. 是否分割出语言包
  5. 是否分割出像素密度包
    其实这些还是比较难以理解,下面来看一下AAB文件的结构

AAB文件结构

从上图可以看出App Bundles文件格式,它包含Base Moudle和我们拆分的文件夹,并且每一个moudle都包含dex,manifest,res,resources.pb等文件,和APK的文件结构基本保持一致。base module和每个Dynamic Feature Module都包含各自的代码和资源,它们共同组成了apk文件的内容。
以下是更详细的列表,摘自官方文档

  • base/、feature1/ 和 feature2/:其中每个顶级目录都表示一个不同的应用模块。应用的基本模块始终包含在 App Bundle 的 base 目录中。不过,为每个功能模块的目录提供的名称由模块清单中的 split 属性指定。如需了解详情,请参阅功能模块清单。
  • asset_pack_1/ 和 asset_pack_2/:对于需要大量图形处理的大型应用或游戏,您可以将资产模块化处理为资源包。资源包因体积上限较高而成为游戏的理想之选。您可以按照三种分发模式(即,安装时分发、快速跟进式分发和按需分发)自定义如何以及何时将各个资源包下载到设备上。所有资源包都在 Google Play 上托管并从 Google Play 提供。如需详细了解如何将资源包添加到您的 app bundle,请参阅 Play Asset Delivery 概览。
  • BUNDLE-METADATA/:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表。此目录中的文件未打包到您应用的 APK 中。
  • 模块协议缓冲区 (*.pb) 文件:这些文件提供了一些元数据,有助于向各个应用商店(如 Google Play)说明每个应用模块的内容。例如,BundleConfig.pb 提供了有关 bundle 本身的信息(如用于构建 app bundle 的构建工具版本),native.pb 和 resources.pb 说明了每个模块中的代码和资源,这在 Google Play 针对不同的设备配置优化 APK 时非常有用。
  • manifest/:与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
  • dex/:与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中。
  • res/、lib/ 和 assets/:这些目录与典型 APK 中的目录完全相同。当您上传 App Bundle 时,Google Play 会检查这些目录并且仅打包满足目标设备配置需求的文件,同时保留文件路径。
  • root/:此目录存储的文件之后会重新定位到包含此目录所在模块的任意 APK 的根目录。例如,app bundle 的
    base/root/ 目录可能包含您的应用使用
    Class.getResource() 加载的基于 Java 的资源。这些文件之后会重新定位到您应用的基本 APK 和 Google Play 生成的每个多 APK 的根目录。此目录中的路径也会保留下来。也就是说,目录(及其子目录)也会重新定位到 APK 的根目录。
    Google play就是基于对AAB文件的处理,将文件拆分为多个维度的包,之后在用户安装的时候,Google paly 会获取用户手机的信息,然后根据拆分的包,为你组装出一个更小的包,其他的都会被剔除掉。

Google play的上传

https://www.jianshu.com/p/d3abf5f514bf(这个是教程链接,由于注册需要25美元,暂时使用官方工具进行模拟)

通过Bundletool模拟googleplay的行为

可以通过官方库安装Bundletool工具
同时我们需要配置好java的环境,来运行bundetool工具,jdk环境变量的设置
Bundletool参考链接:https://developer.android.com/studio/command-line/bundletool

使用Bundletool将AAB文件转为可以处理的.apks文件

java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=my_app.apks

下图是apks文件的解析

他是分为两个目录的,分别为splits和standalones

  1. split目录,可以看出来它是对各个moudle在资源维度,ABI维度(应用二进制接口),还有语言维度的拆分,当我们将AAB文件交给Google play去处理的时候,他就会根据我们手机的语言,API,分辨率等生成一个最小的包安装到手机中
  2. standalones目录,还有一些手机是不支持多apk模式安装的,所以对于这些手机只能生成一个apk,这些满足了他们的需求
    通过install-apks命令将 APK 部署到连接的设备
    这一步就会将上述的包进行动态的组合,根据手机的设备信息来安装对应的apk
    java -jar bundletool-all-0.10.3.jar install-apks --apks=my_app.apks

根据aab文件生成一个全量apk
它支持所有的设备,不会去动态加载(这个包相对会大,在上面UE的选项中也可以选择去生成)
java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=all.apks --mode=universal

bundletool 能够针对 JSON 文件指定的设备配置生成一组 APK。如需首先为已连接的设备生成 JSON 文件,请运行以下命令:
bundletool get-device-spec --output=/tmp/device-spec.json

心得体会

  1. 一个接口怎么去使用,还是应该多去找示例代码,之后通过模仿就可以很快的用起来
  2. 问题的解决,应当多去搜索主要的关键字,并且附带上解决问题的主要特性,如UE,UPL,第三方库等
  3. 遇到问题卡住之后应当理性的分析,理清思路,确定真正需要的是什么,之后再对症下药的搜索


jni实现微博登录(代码片段)

JNI接入参考我的另一篇博客https://blog.csdn.net/dongdong7_77/article/details/127236209?spm=1001.2014.3001.5502微博SDK导入参考官方地址https://open.weibo.com/?from=from_parent_mindnote导入的一些关键点资源文件通过UPL导入将文件放到工程目录,并... 查看详情

jni实现微博登录(代码片段)

JNI接入参考我的另一篇博客https://blog.csdn.net/dongdong7_77/article/details/127236209?spm=1001.2014.3001.5502微博SDK导入参考官方地址https://open.weibo.com/?from=from_parent_mindnote导入的一些关键点资源文件通过UPL导入将文件放到工程目录,并... 查看详情

python新浪微博的登录协助,可以处理验证码所需的情况。(新浪微博登录实现,包含验证码解析)(代码片段)

查看详情

微博三方登录(代码片段)

1.1图解微博三方登录1.2具体流程1.2.1前端获取认证code1)在Vue页面加载时动态发送请求获取微博授权url2)django收到请求的url后,通过微博应用ID(client_id)和回调地址(redirect_uri)动态生成授权url返回给Vue3)当用户点击上面的url进行扫... 查看详情

数据库设计:用户登录系统数据库表设计(代码片段)

...创建一个Users表,包含username和password两列,这样,就可以实现登录了:id|username|password|name等其他字段----+----------+----------+----------------A1|bob|a1b23f2c|...A2|adam|c0932f32|...如果要让用户通过第三方登录,比如微博登录或QQ登录,怎么集... 查看详情

jni编程实现(windows)(代码片段)

上一篇介绍了Linux平台的JNI编程方法,Windows平台的JNI本地调用基本类似,区别就是制作的动态库不同,Linux平台是*.so,Windows平台是*.dll。其中,Windows平台的函数库也分为静态库和动态库,下面介绍一下相关概念:静态库在链接... 查看详情

selenium实现微博自动化运营:关注点赞评论(代码片段)

...队运营的微博粉丝挺多,叫中公题库君,我们使用Selenium实现微博自动关注她,顺便点赞和评论一下。相关帮助链接官网地址查找元素等待指定状态所有动作action浏览器api一、核心代码talkingischeap,话不多说,上代码!fromseleniumim... 查看详情

jni的基本使用一(代码片段)

...a语言也是通过JNI接口来调用系统的功能,只不过JNI的实现部分在JDK中,这样可以增加Java的功能。同样用户程序也可以通过实现JNI接口来调用本地方法。如:如:windows和linux上Java程序需要调用外 查看详情

jni两种注册过程实战(代码片段)

...droidOS加载JNILib的方法有两种-JNI_OnLoad(动态注册)-如果JNILib实现中没有定义JNI_OnLoad,则dvm调用dvmResolveNativeMethod进行动态解析(静态注册)因此,当java通过System.loadLibrary加载完JNI动态库后,紧接着会调用JNI_OnLoa 查看详情

androidjni开发一:jni基础知识(代码片段)

...识Android系统底层的框架大多采用的是C或者C++语言实现的,但是Android上层的框架是采用Java实现的,所以我们平常进行Android也是采用Java语言开发。虽然Android底层采用C或者C++实现,但是我们在进行Android开... 查看详情

androidjni开发一:jni基础知识(代码片段)

...识Android系统底层的框架大多采用的是C或者C++语言实现的,但是Android上层的框架是采用Java实现的,所以我们平常进行Android也是采用Java语言开发。虽然Android底层采用C或者C++实现,但是我们在进行Android开... 查看详情

一步一步学习jni(代码片段)

...开发的接口。JNI是JVM规范中的一部份,因此JNI程序在任何实现了JNI规范的Java虚拟机中都可以运行。作为一个Android开发,这里不大书特书学习J 查看详情

一步一步学习jni(代码片段)

...开发的接口。JNI是JVM规范中的一部份,因此JNI程序在任何实现了JNI规范的Java虚拟机中都可以运行。作为一个Android开发,这里不大书特书学习J 查看详情

androidjni详解(代码片段)

...ce的缩写,表示"Java本地调用"。通过JNI技术可以实现            Java调用C程序            C程序调用Java代码我们的android源码中有很多代码都是Jni的实现的。例如MediaScanner的实现。就是通过jni的技术让我们在j... 查看详情

微博第三方登录的实现步骤

美多项目第三方登录实现步骤:第一步:微博开放平台 https://open.weibo.com 进行注册: 第二步:点击微博先请求我们自定义的接口,   注意我们的回调地址!!!生成这个url之后需要返回到前端进行微博登... 查看详情

[rk3568][android11]jni调用流程分析(代码片段)

...般应用场景三、什么是NDK?四、流程五、android源代码开发实现JNI具体操作一、JNI是什么?JNI是JavaNativeInterface的缩写,即Java本地接口。从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI... 查看详情

[rk3568][android11]jni调用流程分析(代码片段)

...般应用场景三、什么是NDK?四、流程五、android源代码开发实现JNI具体操作一、JNI是什么?JNI是JavaNativeInterface的缩写,即Java本地接口。从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI... 查看详情

在服务器端如何用jni实现navmesh寻路(代码片段)

...AVA调用JNInative接口来提升寻路的性能。如何使用JNI技术来实现,JAVA对C+ 查看详情