2017-11-12 15:27:30 zhang_y_b 阅读数 442
  • DelphiXE10安卓开发(实战篇)

    实战方式讲解DelphiXE10的安卓开发,从 安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、文件系统,处理数据,让学员快速掌握Delphi安卓App的开发

    423 人正在学习 去看看 陈城

Delphi开发Android使用wxsqlite3为数据库加密

  近段时间对Delphi开发Android程序进行了一些尝试,发现了一些问题,也试着去解决这些问题,特将这些解决方法记录下来,以便自己和他人翻阅。由于本人接触Android程序时间有限,许多问题都是边开写代码边在网上找一些资料,我这篇文章也是集成一些网上的办法,结合自己的研究(本文所用开发工具:Delphi 10.2)。下面详细讲解:

步骤一:将wxsqlite3编译成SO动态链接库

  wxsqlite3是开源的sqlite3加密模块,比较有名,对于我们来说,能不花钱的方法才是最好的,在Android下使用wxsqlite3必须将其编译成安卓支持的SO文件。网上有很多关于安卓下sqlite3加密的方法,但基本上是Java代码,而且需要Java开发工具,对于我这种delphier来说,Java虽接触过,仍是小白一个,只好另寻他法。最终找到用ndk-build编译so的方法,Delphi开发安卓必须要ndk,参照网上的方法反复折腾,始终是不得其法 。经过一番尝试,还是让我这种小白大致明白了问题所在,ndk-build编译so必须把所有C语言源码放在jni目录之下,然后直接调用命令即可。对于使用Java开发的人来说,是再简单不过了,让我们这种delphier情何以堪。

  其中还有两个关键点:一是Android.mk文件的编写。ndk-build是依赖这个文件进行编译的,一并放在jni目录下即可。结构如下:

LOCAL_PATH := $(call my-dir)

#清理变量定义
include $(CLEAR_VARS)

#模块名称
LOCAL_MODULE := wxsqlite3

#库文件名称
LOCAL_MODULE_FILENAME := libwxsqlite3

#源文件
LOCAL_SRC_FILES := sqlite3secure.c

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

#头文件目录u
LOCAL_C_INCLUDES := $(LOCAL_PATH)

#构建动态库
include $(BUILD_SHARED_LIBRARY)
以上已经进行了注释。这是最简单的应用,对于我们编译wxsqlite3足够了,网上还有许多复杂的方法,我认为简单就是好,so文件仅是用于Delphi来调用的。

  第二个关键点是使用ndk-build命令编译C源码。Android.mk写好了,且C源码全部放在jni目录下后,我们返加jni的上一级目录,在这个目录下编写一个cmd文件执行命令。为了看到编译的过程,用记事本写入“cmd.exe”,存为cmd扩展名的文件。执行后进入dos界面,输入:%NDKPATH%\ndk-build回车即可,其中“%NDKPATH%”是你的NDK-build所在目录,我的是在“D:\Program Files\Embarcadero\Studio\19.0\PlatformSDKs\android-ndk-r9c”这里,如果目录有空格要将“Program Files”改为“Progra~1”才行。经常用ndk-build的话,可以将路径添加到环境变量里。这样编译成功后,so文件就放在“..\libs\armeabi”下,注意,这样编译的是不带加密功能的。如何带加密功能,网上的办法是在C源码里添加“#define SQLITE_HAS_CODEC”,经我反复测试根本不行。最后打开C源码研究了一下,才知道这里有一个坑,我下载的是最新的源码,较以前的源码可能有较大改动,其实应该是在sqlite3secure.c文件顶端添加“#define SQLITE_HAS_CODEC 1”即可,默认的是AES128加密,应该也够用了。如果要用AES256,需要将codec.h文件里的第46行“#define CODEC_TYPE CODEC_TYPE_AES128”改成AES256就行了,或是在这个文件的顶端加入“#define CODEC_TYPE CODEC_TYPE_AES256”也行。顺便提一句,Android.mk文件也可以直接定义预编译指令,就不需要改C源码,有兴趣的同志可以在网上搜一下,我没有试过。

步骤二:Delphi调用有密码功能的so文件

  对于Delphi来说调用so文件与调用DLL没有什么区别。新建一个FMX应用,project ->deployment->然后点击增加按钮,选择中libwxsqlite.so动态链接库,remote path 填写 assets\internal\,就是将so文件打包到Android里。我们调用这个库是不能用FireDAC的,FirdDAC不支持Android下的加密,我们也没有办法将Android原装的libsqlite.so替换掉,所以必须写代码来支持加密版的sqlite3,与调用DLL没有什么区别,注意:Delphi 10.2安卓开发已经不支持静态调用DLL了,必须动态调用,究竟 是Delphi版本的问题还是SDK/NDK版本的问题没有研究过。在网上打到SimpleSQLite却是不支持Android的,只能在Win下使用。本着DIY精神,费了好大功夫修改了源码,将其修改的关键表述如下:
  一是所有PanisCha类型在Android下均不支持,替换为MarshaledAString。
  二是所有静态引用使用更换为动态调用。这里做个示例,以后遇到同样的问题可以这样修改(修改好的源码文末有链接下载):
原来是:
function(filename: PChar; var db: TSQLiteDB): integer; cdecl;external......
修改为:
type
TSQLite3_Open16=function(filename: PChar; var db: TSQLiteDB): integer; cdecl;
然后再声明:var  sqlite3_open16:TSQLite3_Open16;
sqlite3有一堆需要动态调用的函数,不可能每个都写个动态调用过程,我是这样处理的,先定义一个全局变量 var hlib:Cardinal=0;再写三个个函数:
procedure LoadLib;//用来加载so动态链接库
begin
  {$IFDEF ANDROID}
  SQLiteDLL:=GetFilesDir+'/libwxsqlite.so';//注意这里,声明的时候不要用const SQLiteDLL='....',定义一个全局变量
  {$ENDIF}
     hlib:=LoadLibrary(PChar(SQLiteDLL));
end;
function GetProc(const Name: string):Pointer;//动态调用
begin
  if hlib<>0 then
  begin
     Result:=GetProcAddress(hLib, PChar(Name));
  end;
end;
procedure InitFunctions;//每个动态调用的函数获得指针
begin
  sqlite3_open16 := GetProc('sqlite3_open16');
  //.........................................
end;
在第三个函数里,把所有需要调用的都写进去就可以了。这里就是修改的核心。
SQLiteTable.pas修改原则上也是如此,SQLite3.pas原来的代码是没有加密功能的,需要添加进去:
TSQLite3_key=function(pDb: TSQLiteDB;          // Database handle
    pKey: PChar;        // Database PassWord (UTF-8)
    nKey: Integer           // Database sizeofpassword
  ): integer;cdecl;
Tsqlite3_rekey =function (
    pDb: TSQLiteDB;          // Database handle
    pKey: PChar;        // Database PassWord (UTF-8)
    nKey: Integer           // Database sizeofpassword
  ): integer;  c
因为修改幅度较大,这里仅说一下更改的关键地方。
最后提醒一点的是:sqite3.dll与libwxsqlite.so尽量要使用同版本的源码,否则有可能手机与电脑上的数据库不能通用。我已经编译好了128位加密功能的so和DLL文件,共享给大家。如果需要256位的自行编译吧。

下载地址,需要资源分2,原来是可以定义为零的,本想免费给大家,请大家多多担待:
  

2017-06-15 22:12:00 weixin_34360651 阅读数 284
  • DelphiXE10安卓开发(实战篇)

    实战方式讲解DelphiXE10的安卓开发,从 安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、文件系统,处理数据,让学员快速掌握Delphi安卓App的开发

    423 人正在学习 去看看 陈城
2013-10-10 17:47:51 Testingba 阅读数 3535
  • DelphiXE10安卓开发(实战篇)

    实战方式讲解DelphiXE10的安卓开发,从 安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、文件系统,处理数据,让学员快速掌握Delphi安卓App的开发

    423 人正在学习 去看看 陈城

 

 

 

Delphi这又老树发新枝了,开始做终端程序开发了,这个东西的准确名字是:RAD Studio XE5,可以使用delphi和c++ builder进行终端开发。

 

 

我尽可能讲啰嗦一些,免得回头被人问。对了,还有一个绿色版本,据说五分钟能搞定,我贪多,所以就没用那个。可参考:http://bbs2.2ccc.com/topic.asp?topicid=437339

 

 

 

需要用到的安装介质有些多:

1.      Jdk,顺带配置好环境变量,这个我就不说了哈;

2.      Android sdk:这个更不用说了;

3.      Ndk:最新是r9,下载地址:http://developer.android.com/tools/sdk/ndk/index.html, 配置一下环境变量就行了;

5.      RAD Studio XE5,下载地址:http://pan.baidu.com/share/link?shareid=2500370140&uk=1177427271

 

有些大,将近5g,就是下面这几个东东:

001.png

 

 

 

大神用的7z,搞得我的winrar还解压不了,还得装个7z。

 

 

 

安装开始:

 

第一步:

解压delphicbuilder_xe5_win.iso,运行目录中的:install_RADStudio.exe

002.png

 

没得选,只能english了:

003.png

 

检查缺一个jsharp runtime2.0,哥们的机器上软件都够全了,什么vs2010,android sdk,ndk,delphi都有,没想到居然还缺j#,得,继续吧:

004.png

 

005.png

 

 

006.png

 

007.png

 

 

008.png

 

009.png

 

输入:HNFJ-DPADCW-BDWCFU-FPNN

 

010.png

 

两个就两个吧,delphi和c++builder以前倒是都搞过一段,现在水平相当,全忘干净了。

011.png

English,没得选

 

012.png


哇,需要9G多,管他呢,能装的统统安装上

 

013.png

 

这里要根据自己的实际情况来,我的机器上可是有android sdk和ndk的,所以去掉了勾选,这俩加起来也不小。

 

014.png

 

015.png

 

 

016.png

 

 

C:\Program Files\Embarcadero\RAD Studio\12.0

C:\Users\Public\Documents\RAD Studio\12.0\Samples\

C:\Program Files\Common Files\

 

017.png



建立扩展名关联打开应用程序,我的c估计都是vs2010缺省打开了

 

 

018.png

 

这下要正式开装了,提醒你可以点击back回头看看选的对不对

019.png

 

 

无穷无尽的等待。。。好像有一个多小时

 

 

020.png

 

 

破解开始:

 

覆盖:C:\Program Files\Embarcadero\RAD Studio\12.0\bin\bds.exe;

复制压缩包内的“RADStudioXE5.slip”替换...\Embarcadero\RAD Studio\12.0\License目录下的授权文件。

C:\Program Files\Embarcadero\RAD Studio\12.0\License

复制压缩包内的“xe5_patch.exe”到...\Embarcadero\RAD Studio\12.0\bin目录下,运行破解补丁程序。

C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin

 

021.png


删除C:\ProgramData\Embarcadero下的.licenses、.cgb_license、*.slip文件。

先查查:

C:\ProgramData\Embarcadero>dir /s/a|findstr /i "license"

2013/10/10  15:49    <DIR>          license

2011/12/28  13:28             1,819 start_license_add.c

 Directory of C:\ProgramData\Embarcadero\InterBase\gds_db\license

 

C:\ProgramData\Embarcadero>dir /s/a|findstr /i "slip"

2012/07/02  16:37             1,242 ibxe3.slip

 

结论:搞了半天就只需要删除一个文件:ibxe3.slip,试试先

 

 

 

打开RAD Studio XE5,配置sdk和ndk目录:

Tools—options…

022.png

 

 

023.png

 

024.png

 

 

等了一会,终于他忙活完找到了相应的程序,填上了路径,点击finish

 

 

025.png

 

居然报错:

026.png

 

打开目录来看看:

027.png

 

目录应有尽有,这个意思是还必须要指定某个目录,看了看ndk指定的platform,因为我是使用的ndk r8,支持到android-14,所以这里也就选择了android-14,有点低了,以后有空升级一下ndk版本。

 

 

好了,今天就到这里吧,改天有空先看看例子效果如何

 

 

 

 

2019-04-21 23:47:19 pcplayer 阅读数 229
  • DelphiXE10安卓开发(实战篇)

    实战方式讲解DelphiXE10的安卓开发,从 安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、文件系统,处理数据,让学员快速掌握Delphi安卓App的开发

    423 人正在学习 去看看 陈城

Delphi 10.3 社区版,提供的 Sample 里面有一个例子程序在:

C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\BLEScanner

这个例子程序提供了打开 BLE 的时候的动态权限验证的例子代码。

首先,在 IDE 的 Project - Options 菜单弹出来的窗口里面,找到左边树结构的: Application -- Uses Permissions 项目,则右边会出来一堆权限让你打勾。这里要勾选上 Bluetooth 和 Bluetooth admin 两项。

老的安卓版本,勾选这两项就可以了。

新的安卓版本,还需要运行期用代码动态申请权限。

代码里面:

首先要实现一个函数:

procedure RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);

这个函数是一个动态申请权限的结果的回调函数。

在启动 BLE 的时候,通过以下代码申请权限:

PermissionsService.RequestPermissions([FLocationPermission], RequestPermissionsResult, DisplayRationale);

上述的代码的 PermissionsService 是声明在 System.Permissions 里面的。

上述代码里面的 RequestPermissionsResult 就是前面的那个回调函数。它在这里被调用,而且还被填入参数。

上述代码里面的 FLocationPermission: string; 它来自:

procedure TForm6.FormCreate(Sender: TObject);
begin
{$IFDEF ANDROID}
  FLocationPermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);
{$ENDIF}
end;

上述代码里面用到的 JStringToString 要 Uses Androidapi.Helpers;

 

上述代码中还有一个 DisplayRationale 也是一个函数:

procedure TForm6.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
  TDialogService.ShowMessage('We need to be given permission to discover BLE devices',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

 

在 RequestPermissionsResult 这个函数里面,判断是否通过权限,如果通过,才去调用蓝牙的方法。

procedure TForm6.RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
  // 1 permissions involved: ACCESS_COARSE_LOCATION
  if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
    StartBLEDiscovery
  else
    TDialogService.ShowMessage('Cannot start BLE scan as the permission has not been granted');
end;

到这里,APP 使用手机的 BLE 的权限问题才搞定。

奇怪的是,因为这里是使用的“定位”权限,APP 运行时,会弹出窗口询问用户,APP要使用定位权限,是否允许。用户允许后,的确可以使用 BLE 了。同样的测试手机,如果我不去做动态权限申请,直接调用 BLE 的相关功能,没有任何提示,但 BLE 的相关功能的确出不来。

难道没有单独的【蓝牙】权限?给用户一个定位权限的提示,用于打开蓝牙,有点奇怪。

2013-10-11 16:14:11 Testingba 阅读数 3014
  • DelphiXE10安卓开发(实战篇)

    实战方式讲解DelphiXE10的安卓开发,从 安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、文件系统,处理数据,让学员快速掌握Delphi安卓App的开发

    423 人正在学习 去看看 陈城


 

 

很多人习惯疯狂百度/google,其实帮助已经很好很全面了,在翻过帮助以前,根本不用着急去满世界搜,那样效率更低。

 

好了,按照国际惯例,在安装目录下一个个目录的翻过去,让我找到了一个文件,打开一看,果然是说明的入口,下面这个就是samples的说明。

 

 

001.png

C:\Program Files\Embarcadero\RADStudio\12.0\Welcomepage\readme.htm

 

http://docwiki.embarcadero.com/CodeExamples/XE5/en/Main_Page

这个链接里面列出了所有的samples清单,有delphi和c++builder的,有各个xe版本新增的例子,还有一些svn的示例,够多够全的。

 

http://docwiki.embarcadero.com/CodeExamples/XE5/en/Category:Sample

罗列了RAD Studio XE 自带的示例(C:\Users\Public\Documents\RAD Studio\n.n\Samples.),描述了三种更新示例的方法,说明页中描述了需要包含的库、示例所在位置、怎么使用等

 

http://docwiki.embarcadero.com/CodeExamples/XE5/en/Category:Delphi

这一页全是delphi的示例,一共817个示例,够用了吧。

 

不过我需要的是看看android和ios的例子,继续找。

查看:C:\Users\Public\Documents\RAD Studio\12.0\Samples

有两个目录最可疑:FireMonkeyMobile 和MobileCodeSnippets,打开来看看。

 

进入:C:\Users\Public\Documents\RADStudio\12.0\Samples\FireMonkeyMobile\Controls

打开MobileControls.dproj

002.png

 

按F9运行,提示:

003.png

 

无所谓了,就启动吧,我倒,居然是个android2.1的

004.png

 

算了,我认栽,更新一个高版本的ndk吧。

http://developer.android.com/tools/sdk/ndk/index.html

下载了android-ndk-r9-windows-x86.zip,解压后配置环境变量:

NDKROOT=C:\LHPROGRAM\android-ndk-r9\

PATH加上C:\LHPROGRAM\android-ndk-r9\

 

按照上一篇文章在RAD中重新配置一下sdk和ndk吧,这下platform可以换一个版本高一些的,直接用api18。想想不对呀,上面理解错误了,可能是android的AVD中第一个模拟器建立的android2.1,跑到android-sdk目录下运行AVD Manager.exe,删除掉其他的模拟器,就只留下了一个api18的。

 

 

再次打开MobileControls.dproj,连接上手机,直接运行,原来是直接编译为了so库文件,然后apk中调用。

005.png

 

编译的时候,电脑都快没响应了,够能吃资源的,这个例子还不是很大。

006.png

 

007.png

 

没成功,黑屏的,得换一个模拟器试试。

 

 

 

008.png

 

 

Android2.1版本低不成可以理解,android2.3.3居然也是一闪就没了,而且编译部署的时间长的令人发指。

 

随便看了看,超过69个so文件load,不黑屏才怪了,疯掉了,始终没成功。网上搜了一圈,有说是不支持某些版本的。

 

算了,等待一周,如果还是找不到解决方案就直接卸载掉等待下一个版本了。

 

 

 哪位大侠知道原因的话,可否告知,waiting online。。。。。3x




 

没有更多推荐了,返回首页