0%

Steam 回调宏

在接入 Steam SDK 时在 demo 中看到了一个宏,用来接受 Steam 的相关回调,没有明白时如何实现的。宏定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CStatsAndAchievements
{
public:
// ...省略
// 类中的定义,使用了宏定义 STEAM_CALLBACK
STEAM_CALLBACK( CStatsAndAchievements, OnUserStatsReceived, UserStatsReceived_t, m_CallbackUserStatsReceived );
// ...省略
}
// 构造函数
CStatsAndAchievements::CStatsAndAchievements( IGameEngine *pGameEngine )
:
// ...省略
m_CallbackUserStatsReceived( this, &CStatsAndAchievements::OnUserStatsReceived )
// ...省略
{}
// 接收回调方法
void CStatsAndAchievements::OnUserStatsReceived( UserStatsReceived_t *pCallback ) {}
阅读全文 »

在 Android Studio 项目中有时会遇到依赖冲突的情况,可以用 Gradle 来查看项目中的依赖情况,用来解决这类问题。

列出项目中的依赖项

使用 ./gradlew dependencies 命令,可以列出工程所有 configuration 下的依赖表。也可以用 --configuration 来指定某个配置下的依赖。

1
2
3
4
5
6
# 列出 root project所有依赖项
./gradlew dependencies
# 列出 sub_project 的所有依赖项
./gradlew sub_project:dependencies
# 列出 debug 编译时的依赖项
./gradlew dependencies --configuration debugCompileClasspath
阅读全文 »

因为 Android 的 apk 很容易被下载,再被人反编译修改并重新打包,不过由于证书的签名是唯一的,并且只有自己才能知晓,所以我们可以在游戏启动时检查签名,以此来确认 apk 是否被修改过。

如何获取签名证书的指纹,通常有几种方法。

阅读全文 »

平时在开发过程中,像 client id、API keys 之类的字符串经常会直接写在客户端的 Java 代码中,这样别人在逆向 apk 过程中,这些字符串就会很容易地暴露在逆向者的眼中。本文介绍了使用 Android NDK 将字符串存放在 so 文件里,这样虽然不能完全防止被逆向,但是也能用混淆来制造些障碍。

阅读全文 »

公司有的项目是用的 Unity 2020,之前一直用的是 2018 版导出 Android Studio,切换到 2020 后发现与之前的版本改动较大,于是踩到了不少的坑。

环境版本

  • NDK 版本:Unity 2018 用的是 r18b 版本,Unity 2020 用的是 r19 版本。
  • Gradle 版本:Unity 2018 最低版本是 5.1.1,Unity 2020 最低版本是 5.6.4。

导出工程报错,提示 build cannot be appended 或者 the build target does not support build appending

原因是 Unity 从 2019.4.14f1 版本开始修改了 Android Studio 导出的选项,如果使用 Gradle 来编译,首先需要设置 EditorUserBuildSettings.exportAsGoogleAndroidProject = true ,才能导出 Android Studio。其次将 BuildPlayerOptions 中移除 BuildOptions.AcceptExternalModificationsToPlayer 这个选项。

例如:

1
2
3
4
5
6
EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; // 使用 Gradle
EditorUserBuildSettings.exportAsGoogleAndroidProject = true; // 导出Android Studio工程

BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.options = BuildOptions.None | BuildOptions.Development; // BuildOptions.AcceptExternalModificationsToPlayer; // 导出选项
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
阅读全文 »