如何破解uniapp写的应用

author author     2023-03-09     618

关键词:

最近uniapp 开发移动app项目遇到一个棘手问题,我想实现 TCPScoket 通信。我们知道 uniapp 开发基本用的是一些前端框架(如:vue, mpvue等)和一些 uni 自身 api。要想 uniapp 使用 Android 原生代码有以下三种常用方法:
一: 使用 plus.android.importClass() 调用安卓的类进行原生代码编写,但是经测试效果很不理想,速度很慢!
二:开发原生 Android 插件,运行速度快,但需要一定的安卓开发经验,难度较高。
三:购买其他开发者开发的原生插件,但是一般价格不低。

综上所述,我们必须学会自己开发原生插件!

二、前期准备
1、Android Studio 开发工具。 下载地址:https://developer.android.google.cn/studio/ 安装教程:https://blog.csdn.net/weixin_43883917/article/details/108942788
2、离线SDK下载(下载最新版)。 下载地址: https://nativesupport.dcloud.net.cn/AppDocs/download/android

3、保证 HbuilderX 也是最新版
4、签名证书。 生成方法:https://blog.csdn.net/weixin_58605808/article/details/117387435

三、创建一个 Uniapp 案例 (TCP-Plugin)
1、 开发者中心创建一个应用:https://dev.dcloud.net.cn/app/index?type=0

2、 点击应用名称进入应用,选择 离线打包Key管理 ,输入如下信息:

签名证书获取:

3、 点击保存会生成 appkey,后面要用到:4、 启动 HbuilderX,左下角登录自己的账户,新建一个和刚刚同名的项目的默认模板项目,查看 manifest.json AppID 是否云端 APPID 对应:

以上 uniapp demo 算是创建完成!

四、Android 原生插件开发
一、导入已下载好的离线SDK中的原生插件开发框架项目,UniPlugin-Hello-AS

二、切换成 project模式, 项目结构如下:

三、把我们刚才申请的appkey填写到 app/src/main/AndroidManifest.xml 中,因为开发的是安卓,所以appkey填安卓的:

四、把我们的签名证书放到app目录下,博主的签名证书名叫 uniapp.keystore

五、配置签名证书,在 app/build.gradle 的 signingConfigs 选项中:

六、右键 UniPlugin-Hello-AS,创建 Module
七、填写插件模块信息:

八、配置 TCP-Socket/build.gradle,复制官方案例 uniplugin_module/build.gradle

apply plugin: 'com.android.library'

android
compileSdkVersion 29
defaultConfig
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"

testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'



buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'





repositories
flatDir
dirs 'libs'



dependencies
compileOnly fileTree(dir: 'libs', include: ['*.jar'])

compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])

compileOnly 'androidx.recyclerview:recyclerview:1.0.0'
compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'
compileOnly 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.alibaba:fastjson:1.1.46.android'
implementation 'com.facebook.fresco:fresco:1.13.0'

/*implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'*/


九、删除不必要的官方案例,让项目更加简洁(可选):

十、在TCP-Socket 模块下的 com/example/tcp/socket 创建类TcpModule

十一、TCP Scocket 通信功能实现,代码如下:

package com.example.tcp.socket;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;

public class TcpModule extends UniModule
int port = 6666;
Socket socket = null;
OutputStreamWriter outputStream = null;
InputStreamReader inputStream = null;

@UniJSMethod
public void send(final JSONObject json, final UniJSCallback callback)
new Thread(new Runnable()
@Override
public void run()
String ip = json.getString("ip");
String userId = json.getString("code");
JSONObject res = new JSONObject();
// 建立与服务器的连接
try
socket = new Socket(ip, port);
socket.setSoTimeout(1500);
//建立连接后获取输入输出流
outputStream = new OutputStreamWriter(socket.getOutputStream());
inputStream = new InputStreamReader(socket.getInputStream());
catch (Exception e)
try
socket.close();
catch (IOException ioException)
ioException.printStackTrace();

e.printStackTrace();
res.put("code", 400);
res.put("data", "系统异常, 请重启APP!");
callback.invoke(res);

BufferedReader socketReader = new BufferedReader((inputStream));
BufferedWriter bufferedWriter = new BufferedWriter(outputStream);
PrintWriter socketWriter = new PrintWriter(bufferedWriter, true);
socketWriter.println(userId);
try
String s = socketReader.readLine();
res.put("code", 200);
res.put("data", s);
// 这里关闭连接, 不然回调以后,程序就不执行了,不能再 finally 里面关闭连接
socket.close();
callback.invoke(res);
catch (IOException e)
res.put("code", 400);
res.put("data", "系统异常, 请重启APP!");
callback.invoke(res);


).start();



注意:Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException。因此,必须另起一个线程进行网络连接方面的操作。

十二、注册插件,在 app/src/main/assets/dcloud_uniplugins.json 文件中写入,如下:


"nativePlugins": [

"plugins": [

"type": "module",
"name": "TCP-Socket",
"class": "com.example.tcp.socket.TcpModule"

]

]

五、HbuilderX 生成本地打包 TCP-Plugin
1、引入原生插件方式如下:

const TCP = uni.requireNativePlugin("TCP-Socket");
index.vue 代码编写如下:

<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">title</text>
</view>
<view>
<button @click="clickBtn">点击发送消息</button>
</view>
</view>
</template>

<script>
const TCP = uni.requireNativePlugin("TCP-Socket");
export default
data()
return
title: 'TCP-Socket 插件测试'

,
onLoad()
,
methods:
clickBtn()
TCP.send(
ip: '192.168.0.100', // 服务器ip
code: 'd92863370904331f8a19cc116719bcd1' // 需要发送的数据
, e =>
// 回调函数
uni.showToast(
title: '响应数据:' + JSON.stringify(e),
icon: 'none'
);
)



</script>
<style>
(...省略)
</style>

2、HbuilderX 生成本地打包资源:

六、离线打包apk并进行真机调试
1、把生成的本地打包资源复制到 UniPlugin-Hello-AS 项目的 app/src/main/assets/apps 目录下:

2、配置 appid,在 UniPlugin-Hello-AS 项目的 app/src/main/assets/data/dcloud_control.xml 中配置:

3、在 UniPlugin-Hello-AS 项目的 app/build.gradle 中对 TCP-Socket 插件引用:

4、测试,手机或者虚拟设备连接以后,点击运行进行测试:

七、打包生成原生插件 aar
八、HbuilderX 引入TCP-Socket 打包的 aar 插件:
1、目录结构以及 package.json 编写如下:
2、manifest.json 选择本地插件:

九、制作自定义调试基座

打包自定义基座成功如下:

十、HbuilderX 真机调试测试插件
1、选择自定义调试基座:

注意:如果出现已经制作自定义调试基座,但是没有运行基座选择这一选项的情况。请重新进行自定义基座打包,直到出现运行基座选择为止!

2、选择运行到 Android App 基座进行真机调试:

测试成功!

原生插件开发调试打包全部完成!
十一、开发期间遇到的问题:
1、 [JS Framework] 当前运行的基座不包含原生插件[xxxx],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座。
问题分析:

1、 package.json 配置编写错误 (仔细进行对照).
2、 是否在manifest中配置 (这种睿智操作一般不会犯)
3、 原生插件是否使用自定义基座 (大部分是这个原因)
4、 自己开发原生插件是否有错误,未成功打包到基座 (原因是这个的概率很小,因为在 Android Studio 离线打包的时候我们调试通过了,说明插件没有问题。)

2、Android Studio 问题:Gradle task list not built during sync.Building the task list can impact Gradlesync performance on large projects.

解决方法如下:

完结~~, 撒花~~
参考技术A 思路:
未登录:

生成一对RSA公钥私钥,公钥事先放在前端中,省去获取后端公钥的过程(防止被拦截,无法判断是否是后端传来的公钥)
用户未登陆时,通过公钥加密账号信息发送至后端,这样即便被窃取也无法得知内容
后端返回登陆生成的token,refresh token需要进行加密,理想办法是前端生成一对RSA公钥私钥,公钥发给后端加密,但是前端加密一般使用的node-rsa过大,微信小程序基本一引用就超出限制,uniapp压缩代码,分段都没用,所以放弃
前端将账号密码通过默认规则拼接成新字符串并MD5加密,作为对称加密密钥和账号传给后端,并加密token,refresh token返回。(token刷新问题可查看解决token刷新问题​​​​​​​)
登录后:

依旧生成一对RSA公钥私钥,公钥事先放在前端中,私钥存后端
前端通过对称加密AES加密数据,token,refresh token。将密钥通过准备好的RSA公钥加密,添加到请求头部
后端收到请求通过私钥解密头部,获得密钥解密数据
后端返回数据通过前端传的密钥AES加密返回。
实现加密解密:
对称加密AES使用crypto-js,非对称加密RSA使用jsencrypt

使用npm安装:

初始化

引入crypto-js

jsencrypt需要用到window变量,小程序不支持,解决办法有很多,这里直接下载jsencrypt.zip-小程序文档类资源-CSDN下载

然后引入使用就可以了

AES.js

uniapp如何创建一个安卓应用并打包发布apk

这里会总结一下如何使用uniapp,去创建一个应用到打包,到真机调试,到构建成一个APK的流程,以及这个过程中笔者遇到的一些问题及如何解决。直接上正题,首先uniapp的官方文档大家是需要先有一个了解的&#... 查看详情

uniapp系列-使用uniapp携带收件人信息调用手机邮件应用发邮件的2种方案(代码片段)

...内复制url,在app内打开外部浏览器,在h5端打开新网页。如何安装安装sassnpmisass-D安装sass-loadernpmisass-loader@10.1.1-D安装uni-uinpmi@dcloudio/uni-ui如何使用step1在项目pages同级路径下创建components目录step2在node_modules文件夹下找到下载的uni-ui... 查看详情

uni-k如何连接微信

参考技术Auni-k如何连接微信?想要通过uniapp连接微信小程序,其实,步骤并不复杂,我们只需到用到一个软件,便可以完美解决这个问题,,因此,我们需要在这里用到一款应用便捷的程序——“天天外链”,它可以帮助我们实... 查看详情

uniapp实现app中内嵌h5应用(代码片段)

...都可直接内嵌在APP中实现一站式体验。使用uniapp开发的APP如何实现这样的功能呢?答案就是内嵌web-view注意事项APP中有vue页面及nvue页面,两种页面均可内嵌web-view,但两种页面的表现不一:vue页面会自动铺满整个... 查看详情

uniapp实现app中内嵌h5应用(代码片段)

...都可直接内嵌在APP中实现一站式体验。使用uniapp开发的APP如何实现这样的功能呢?答案就是内嵌web-view注意事项APP中有vue页面及nvue页面,两种页面均可内嵌web-view,但两种页面的表现不一:vue页面会自动铺满整个... 查看详情

如何破解区块链应用落地难题

...s、四方精创和链得得联合发起了此次讨论,主题为“如何破解区块链落地应用难题”,北京红枣科技CEO何亦凡、Thoughtworks区块链团队技术负责人鄢倩、四方精创首席架构师与IT策略规划顾问陈毅熙参与了讨论,链得得... 查看详情

如何防止ipa文件/iphone应用被破解到源码?

】如何防止ipa文件/iphone应用被破解到源码?【英文标题】:Howtopreventipafile/iphoneapplicationfrombeingcrackedtosource?【发布时间】:2013-04-0522:23:52【问题描述】:从stackexchange的一个问题Here中,它证明我们可以将iphone应用程序反编译到它... 查看详情

如何检查我的 iPhone 应用程序是不是被黑客入侵/破解?

】如何检查我的iPhone应用程序是不是被黑客入侵/破解?【英文标题】:HowtocheckifmyiPhoneappishacked/cracked?如何检查我的iPhone应用程序是否被黑客入侵/破解?【发布时间】:2011-06-1309:16:51【问题描述】:我想知道是否有一些方法可以... 查看详情

uniapp如何更新微信小程序登录接口

参考技术A第一步:替换原有的标签为普通标签,例如:获取头像昵称_诙?:在getUserInfo代码中调用wx.getUserProfile接口:getUserProfile(e)//推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户信息_⒁馐孪?_峄懊茉?session_key是对... 查看详情

如何让“安卓解锁”应用更安全地抵御破解?

】如何让“安卓解锁”应用更安全地抵御破解?【英文标题】:Howtomakean\'androidunlocker\'appsaferagainstcrackers?【发布时间】:2012-05-1908:24:13【问题描述】:对于我的应用程序的付费版本,我选择解锁器应用程序路线,因为它易于实施... 查看详情

慎用uniapp开发商业级应用

...封邮件没人回复): 这个项目算是废了,很后悔使用uniapp来开发,希望付费能找到官方技术人员来解决依然没回复,散了,以后不会再 查看详情

uniapp>ios平台配置应用使用广告标识(idfa)

iOS平台配置应用使用广告标识(IDFA)https://ask.dcloud.net.cn/article/36107 查看详情

uniapp微信小程序蓝牙的连接与应用

1,开启蓝牙适配器初始化蓝牙模块openBluetoothAdapter()letthat=this;uni.openBluetoothAdapter(success:(res)=>this.startBluetoothDevicesDiscovery();,fa 查看详情

uniapp中canvas不能连续绘制

参考技术A能。在应用《uniapp》使用方法中了解到该应用上的canvas是能连续绘制的,需要使用工具进行,该应用是一个使用vue的语法+微信小程序的标签和API的跨平台前端框架。 查看详情

uniapp自定义组件如何全局控制

参考技术A1、首先打开uniapp自定义组件。2、其次在组件中找到设置并点击。3、最后在设置中点击全局控制即可。 查看详情

如何检测“IAP 破解者”?

】如何检测“IAP破解者”?【英文标题】:Howtodetect"IAPcrackers"?【发布时间】:2011-09-1901:42:10【问题描述】:我发现许多用户使用所谓的“IAP破解者”而不是在应用内购买(IAP)中购买商品。我还了解到ZyngaPoker和Pokerist已经... 查看详情

uniapp动态切换应用图标名称插件ba-changeicon(代码片段)

...名称Ba-ChangeIcon简介(下载地址)Ba-ChangeIcon是一款uniapp动态切换应用图标、名称的插件。可实现过年、过节动态切换应用图标的效果,给用户更好的体验。动态切换应用图标、名称默认支持5种样式配置(更多请联... 查看详情

uniapp如何将文字放在图标下面

参考技术A登录图标库,新建项目选项选择任意图标。下载字体图标并解压,然后将文字放在图标下面。 查看详情