├── .gitattributes ├── .gitignore ├── AndroidLoggerApp.deployproj ├── AndroidLoggerApp.dpr ├── AndroidLoggerApp.dproj ├── AndroidLoggerApp.res ├── AndroidLoggers.groupproj ├── AndroidManifest.template.xml ├── AndroudLoggerApp.Main.fmx ├── AndroudLoggerApp.Main.pas ├── FMX.Platform.Logger.Android.Fix.pas ├── FixAndroidLogger.deployproj ├── FixAndroidLogger.dpr ├── FixAndroidLogger.dproj ├── FixAndroidLogger.res ├── FixAndroudLoggerDemoImpl.LgXhdpiPh.fmx ├── FixAndroudLoggerDemoImpl.fmx ├── FixAndroudLoggerDemoImpl.pas ├── README.md └── images ├── AndroidLogViewer.gif ├── ChangeTag2.png ├── console2.png └── log-1.png /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | Android/ 68 | Android32/ 69 | Android64/ 70 | Win32/ 71 | *.sdk 72 | -------------------------------------------------------------------------------- /AndroidLoggerApp.deployproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 12 5 | 6 | 7 | 29271FDH300BL0 8 | 29271FDH300BL0 9 | 10 | 11 | 12 | 13 | 14 | 15 | AndroidLoggerApp\library\lib\arm64-v8a\ 16 | libAndroidLoggerApp.so 17 | ProjectOutput 18 | 1 19 | 20 | 21 | True 22 | True 23 | 24 | 25 | AndroidLoggerApp\res\drawable-hdpi\ 26 | ic_launcher.png 27 | Android_LauncherIcon72 28 | 1 29 | 30 | 31 | True 32 | 33 | 34 | AndroidLoggerApp\ 35 | AndroidManifest.xml 36 | ProjectAndroidManifest 37 | 1 38 | 39 | 40 | True 41 | 42 | 43 | AndroidLoggerApp\res\drawable-xxhdpi\ 44 | ic_launcher.png 45 | Android_LauncherIcon144 46 | 1 47 | 48 | 49 | True 50 | 51 | 52 | AndroidLoggerApp\res\drawable-xxxhdpi\ 53 | ic_launcher.png 54 | Android_LauncherIcon192 55 | 1 56 | 57 | 58 | True 59 | 60 | 61 | AndroidLoggerApp\res\drawable-mdpi\ 62 | ic_launcher.png 63 | Android_LauncherIcon48 64 | 1 65 | 66 | 67 | True 68 | 69 | 70 | AndroidLoggerApp\res\drawable-xhdpi\ 71 | ic_notification.png 72 | Android_NotificationIcon48 73 | 1 74 | 75 | 76 | True 77 | 78 | 79 | AndroidLoggerApp\res\drawable-large\ 80 | splash_image.png 81 | Android_SplashImage640 82 | 1 83 | 84 | 85 | True 86 | 87 | 88 | AndroidLoggerApp\library\lib\armeabi\ 89 | libFixAndroidLogger.so 90 | AndroidLibnativeArmeabiFile 91 | 1 92 | 93 | 94 | True 95 | 96 | 97 | AndroidLoggerApp\res\values\ 98 | colors.xml 99 | Android_Colors 100 | 1 101 | 102 | 103 | True 104 | 105 | 106 | AndroidLoggerApp\res\drawable-hdpi\ 107 | ic_notification.png 108 | Android_NotificationIcon36 109 | 1 110 | 111 | 112 | True 113 | 114 | 115 | AndroidLoggerApp\res\drawable-xxxhdpi\ 116 | ic_notification.png 117 | Android_NotificationIcon96 118 | 1 119 | 120 | 121 | True 122 | 123 | 124 | AndroidLoggerApp\res\drawable\ 125 | splash_image_def.xml 126 | AndroidSplashImageDef 127 | 1 128 | 129 | 130 | True 131 | 132 | 133 | AndroidLoggerApp\library\lib\mips\ 134 | libFixAndroidLogger.so 135 | AndroidLibnativeMipsFile 136 | 1 137 | 138 | 139 | True 140 | 141 | 142 | AndroidLoggerApp\res\drawable-xhdpi\ 143 | ic_launcher.png 144 | Android_LauncherIcon96 145 | 1 146 | 147 | 148 | True 149 | 150 | 151 | AndroidLoggerApp\library\lib\armeabi-v7a\ 152 | libFixAndroidLogger.so 153 | AndroidLibnativeArmeabiv7aFile 154 | 1 155 | 156 | 157 | True 158 | 159 | 160 | AndroidLoggerApp\res\drawable-mdpi\ 161 | ic_notification.png 162 | Android_NotificationIcon24 163 | 1 164 | 165 | 166 | True 167 | 168 | 169 | AndroidLoggerApp\res\drawable-ldpi\ 170 | ic_launcher.png 171 | Android_LauncherIcon36 172 | 1 173 | 174 | 175 | True 176 | 177 | 178 | AndroidLoggerApp\res\drawable-xlarge\ 179 | splash_image.png 180 | Android_SplashImage960 181 | 1 182 | 183 | 184 | True 185 | 186 | 187 | AndroidLoggerApp\res\drawable-small\ 188 | splash_image.png 189 | Android_SplashImage426 190 | 1 191 | 192 | 193 | True 194 | 195 | 196 | AndroidLoggerApp\res\values\ 197 | styles.xml 198 | AndroidSplashStyles 199 | 1 200 | 201 | 202 | True 203 | 204 | 205 | AndroidLoggerApp\res\values\ 206 | strings.xml 207 | Android_Strings 208 | 1 209 | 210 | 211 | True 212 | 213 | 214 | AndroidLoggerApp\classes\ 215 | AndroidLoggerApp.classes 216 | AndroidClasses 217 | 64 218 | 219 | 220 | True 221 | 222 | 223 | AndroidLoggerApp\res\values-v21\ 224 | styles.xml 225 | AndroidSplashStylesV21 226 | 1 227 | 228 | 229 | True 230 | 231 | 232 | AndroidLoggerApp\res\drawable-xxhdpi\ 233 | ic_notification.png 234 | Android_NotificationIcon72 235 | 1 236 | 237 | 238 | True 239 | 240 | 241 | AndroidLoggerApp\res\drawable-normal\ 242 | splash_image.png 243 | Android_SplashImage470 244 | 1 245 | 246 | 247 | True 248 | 249 | 250 | 251 | 252 | AndroidLoggerApp\res\drawable-large\ 253 | splash_image.png 254 | Android_SplashImage640 255 | 1 256 | 257 | 258 | True 259 | 260 | 261 | AndroidLoggerApp\res\values\ 262 | strings.xml 263 | Android_Strings 264 | 1 265 | 266 | 267 | True 268 | 269 | 270 | AndroidLoggerApp\res\values\ 271 | colors.xml 272 | Android_Colors 273 | 1 274 | 275 | 276 | True 277 | 278 | 279 | AndroidLoggerApp\res\drawable\ 280 | splash_image_def.xml 281 | AndroidSplashImageDef 282 | 1 283 | 284 | 285 | True 286 | 287 | 288 | AndroidLoggerApp\res\drawable-hdpi\ 289 | ic_launcher.png 290 | Android_LauncherIcon72 291 | 1 292 | 293 | 294 | True 295 | 296 | 297 | AndroidLoggerApp\res\drawable-normal\ 298 | splash_image.png 299 | Android_SplashImage470 300 | 1 301 | 302 | 303 | True 304 | 305 | 306 | AndroidLoggerApp\res\drawable-xxhdpi\ 307 | ic_notification.png 308 | Android_NotificationIcon72 309 | 1 310 | 311 | 312 | True 313 | 314 | 315 | AndroidLoggerApp\res\drawable-xxhdpi\ 316 | ic_launcher.png 317 | Android_LauncherIcon144 318 | 1 319 | 320 | 321 | True 322 | 323 | 324 | AndroidLoggerApp\res\drawable-xxxhdpi\ 325 | ic_launcher.png 326 | Android_LauncherIcon192 327 | 1 328 | 329 | 330 | True 331 | 332 | 333 | AndroidLoggerApp\res\drawable-mdpi\ 334 | ic_launcher.png 335 | Android_LauncherIcon48 336 | 1 337 | 338 | 339 | True 340 | 341 | 342 | AndroidLoggerApp\library\lib\armeabi-v7a\ 343 | libAndroidLoggerApp.so 344 | ProjectOutput 345 | 1 346 | 347 | 348 | True 349 | True 350 | 351 | 352 | AndroidLoggerApp\res\drawable-xhdpi\ 353 | ic_launcher.png 354 | Android_LauncherIcon96 355 | 1 356 | 357 | 358 | True 359 | 360 | 361 | AndroidLoggerApp\res\drawable-xlarge\ 362 | splash_image.png 363 | Android_SplashImage960 364 | 1 365 | 366 | 367 | True 368 | 369 | 370 | AndroidLoggerApp\ 371 | AndroidManifest.xml 372 | ProjectAndroidManifest 373 | 1 374 | 375 | 376 | True 377 | 378 | 379 | AndroidLoggerApp\classes\ 380 | FixAndroidLogger.classes 381 | AndroidClasses 382 | 64 383 | 384 | 385 | True 386 | 387 | 388 | AndroidLoggerApp\res\values\ 389 | styles.xml 390 | AndroidSplashStyles 391 | 1 392 | 393 | 394 | True 395 | 396 | 397 | AndroidLoggerApp\res\drawable-xhdpi\ 398 | ic_notification.png 399 | Android_NotificationIcon48 400 | 1 401 | 402 | 403 | True 404 | 405 | 406 | AndroidLoggerApp\res\values-v21\ 407 | styles.xml 408 | AndroidSplashStylesV21 409 | 1 410 | 411 | 412 | True 413 | 414 | 415 | AndroidLoggerApp\library\lib\armeabi\ 416 | libFixAndroidLogger.so 417 | AndroidLibnativeArmeabiFile 418 | 1 419 | 420 | 421 | True 422 | 423 | 424 | AndroidLoggerApp\res\drawable-mdpi\ 425 | ic_notification.png 426 | Android_NotificationIcon24 427 | 1 428 | 429 | 430 | True 431 | 432 | 433 | AndroidLoggerApp\res\drawable-small\ 434 | splash_image.png 435 | Android_SplashImage426 436 | 1 437 | 438 | 439 | True 440 | 441 | 442 | AndroidLoggerApp\res\drawable-ldpi\ 443 | ic_launcher.png 444 | Android_LauncherIcon36 445 | 1 446 | 447 | 448 | True 449 | 450 | 451 | AndroidLoggerApp\library\lib\mips\ 452 | libFixAndroidLogger.so 453 | AndroidLibnativeMipsFile 454 | 1 455 | 456 | 457 | True 458 | 459 | 460 | AndroidLoggerApp\res\drawable-hdpi\ 461 | ic_notification.png 462 | Android_NotificationIcon36 463 | 1 464 | 465 | 466 | True 467 | 468 | 469 | AndroidLoggerApp\res\drawable-xxxhdpi\ 470 | ic_notification.png 471 | Android_NotificationIcon96 472 | 1 473 | 474 | 475 | True 476 | 477 | 478 | 479 | -------------------------------------------------------------------------------- /AndroidLoggerApp.dpr: -------------------------------------------------------------------------------- 1 | program AndroidLoggerApp; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | AndroudLoggerApp.Main in 'AndroudLoggerApp.Main.pas' {frmLogDemo}; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TfrmLogDemo, frmLogDemo); 13 | Application.Run; 14 | end. 15 | -------------------------------------------------------------------------------- /AndroidLoggerApp.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/AndroidLoggerApp.res -------------------------------------------------------------------------------- /AndroidLoggers.groupproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {7D2B1AF8-D79B-4306-BE30-BE1CF3A251F5} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Default.Personality.12 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /AndroidManifest.template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | <%uses-permission%> 11 | 12 | 21 | 22 | <%application-meta-data%> 23 | <%services%> 24 | 26 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | <%activity%> 39 | <%receivers%> 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /AndroudLoggerApp.Main.fmx: -------------------------------------------------------------------------------- 1 | object frmLogDemo: TfrmLogDemo 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form4' 5 | ClientHeight = 480 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | OnDestroy = FormDestroy 12 | DesignerMasterStyle = 3 13 | object Panel1: TPanel 14 | Align = Top 15 | Size.Width = 640.000000000000000000 16 | Size.Height = 153.000000000000000000 17 | Size.PlatformDefault = False 18 | TabOrder = 2 19 | object btnSendToLog: TButton 20 | Position.Y = 85.000000000000000000 21 | Size.Width = 113.000000000000000000 22 | Size.Height = 44.000000000000000000 23 | Size.PlatformDefault = False 24 | TabOrder = 0 25 | Text = 'Send To Log' 26 | OnClick = btnSendToLogClick 27 | end 28 | object Panel4: TPanel 29 | Align = Top 30 | Size.Width = 640.000000000000000000 31 | Size.Height = 77.000000000000000000 32 | Size.PlatformDefault = False 33 | TabOrder = 2 34 | object edLog: TEdit 35 | Touch.InteractiveGestures = [LongTap, DoubleTap] 36 | Align = Client 37 | TabOrder = 1 38 | Text = 'This is a log message' 39 | Size.Width = 640.000000000000000000 40 | Size.Height = 32.000000000000000000 41 | Size.PlatformDefault = False 42 | end 43 | object Label1: TLabel 44 | Align = Top 45 | Size.Width = 640.000000000000000000 46 | Size.Height = 23.000000000000000000 47 | Size.PlatformDefault = False 48 | Text = 'Log message' 49 | TabOrder = 2 50 | end 51 | end 52 | end 53 | object Panel2: TPanel 54 | Align = Top 55 | Position.Y = 153.000000000000000000 56 | Size.Width = 640.000000000000000000 57 | Size.Height = 120.000000000000000000 58 | Size.PlatformDefault = False 59 | TabOrder = 0 60 | object btnChangeTag: TButton 61 | Position.Y = 55.000000000000000000 62 | Size.Width = 113.000000000000000000 63 | Size.Height = 44.000000000000000000 64 | Size.PlatformDefault = False 65 | TabOrder = 1 66 | Text = 'Change Tag' 67 | end 68 | object edTagName: TEdit 69 | Touch.InteractiveGestures = [LongTap, DoubleTap] 70 | Align = Top 71 | TabOrder = 2 72 | Text = 'chuacw' 73 | Position.Y = 23.000000000000000000 74 | Size.Width = 640.000000000000000000 75 | Size.Height = 32.000000000000000000 76 | Size.PlatformDefault = False 77 | end 78 | object Label2: TLabel 79 | Align = Top 80 | Size.Width = 640.000000000000000000 81 | Size.Height = 23.000000000000000000 82 | Size.PlatformDefault = False 83 | Text = 'Tag Name' 84 | TabOrder = 4 85 | end 86 | end 87 | object Panel3: TPanel 88 | Align = Top 89 | Position.Y = 273.000000000000000000 90 | Size.Width = 640.000000000000000000 91 | Size.Height = 144.000000000000000000 92 | Size.PlatformDefault = False 93 | TabOrder = 1 94 | object Panel5: TPanel 95 | Align = Top 96 | Size.Width = 640.000000000000000000 97 | Size.Height = 49.000000000000000000 98 | Size.PlatformDefault = False 99 | TabOrder = 3 100 | object Label3: TLabel 101 | Align = Top 102 | Size.Width = 640.000000000000000000 103 | Size.Height = 23.000000000000000000 104 | Size.PlatformDefault = False 105 | Text = 'Log message' 106 | TabOrder = 2 107 | end 108 | object edPriorityTag: TEdit 109 | Touch.InteractiveGestures = [LongTap, DoubleTap] 110 | Align = Top 111 | TabOrder = 4 112 | Text = 'This is a log message with priority' 113 | Position.Y = 23.000000000000000000 114 | Size.Width = 640.000000000000000000 115 | Size.Height = 32.000000000000000000 116 | Size.PlatformDefault = False 117 | end 118 | object Panel6: TPanel 119 | Align = Top 120 | Position.Y = 55.000000000000000000 121 | Size.Width = 640.000000000000000000 122 | Size.Height = 120.000000000000000000 123 | Size.PlatformDefault = False 124 | TabOrder = 5 125 | object btnSendToPriorityLog: TButton 126 | Position.Y = 25.000000000000000000 127 | Size.Width = 113.000000000000000000 128 | Size.Height = 44.000000000000000000 129 | Size.PlatformDefault = False 130 | TabOrder = 0 131 | Text = 'Send To Log' 132 | end 133 | object rbDebug: TRadioButton 134 | GroupName = 'Priority' 135 | Position.X = 274.000000000000000000 136 | Position.Y = 25.000000000000000000 137 | TabOrder = 2 138 | Text = 'Debug' 139 | end 140 | object rbError: TRadioButton 141 | GroupName = 'Priority' 142 | IsChecked = True 143 | Position.X = 274.000000000000000000 144 | Position.Y = 73.000000000000000000 145 | TabOrder = 1 146 | Text = 'Error' 147 | end 148 | object rbVerbose: TRadioButton 149 | GroupName = 'Priority' 150 | Position.X = 146.000000000000000000 151 | Position.Y = 73.000000000000000000 152 | TabOrder = 4 153 | Text = 'Verbose' 154 | end 155 | object rbInfo: TRadioButton 156 | GroupName = 'Priority' 157 | Position.X = 146.000000000000000000 158 | Position.Y = 25.000000000000000000 159 | TabOrder = 5 160 | Text = 'Info' 161 | end 162 | end 163 | end 164 | end 165 | end 166 | -------------------------------------------------------------------------------- /AndroudLoggerApp.Main.pas: -------------------------------------------------------------------------------- 1 | unit AndroudLoggerApp.Main; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 8 | FMX.Controls.Presentation, FMX.Edit; 9 | 10 | type 11 | TfrmLogDemo = class(TForm) 12 | edLog: TEdit; 13 | btnSendToLog: TButton; 14 | Panel1: TPanel; 15 | Panel2: TPanel; 16 | btnChangeTag: TButton; 17 | edTagName: TEdit; 18 | Panel3: TPanel; 19 | edPriorityTag: TEdit; 20 | Panel4: TPanel; 21 | Label1: TLabel; 22 | Label2: TLabel; 23 | Label3: TLabel; 24 | Panel5: TPanel; 25 | Panel6: TPanel; 26 | btnSendToPriorityLog: TButton; 27 | rbDebug: TRadioButton; 28 | rbError: TRadioButton; 29 | rbVerbose: TRadioButton; 30 | rbInfo: TRadioButton; 31 | procedure btnSendToLogClick(Sender: TObject); 32 | procedure FormCreate(Sender: TObject); 33 | procedure FormDestroy(Sender: TObject); 34 | private 35 | { Private declarations } 36 | procedure Log(const AMsg: string); 37 | public 38 | { Public declarations } 39 | end; 40 | 41 | var 42 | frmLogDemo: TfrmLogDemo; 43 | 44 | implementation 45 | uses 46 | FMX.Platform; 47 | 48 | {$R *.fmx} 49 | 50 | procedure TfrmLogDemo.btnSendToLogClick(Sender: TObject); 51 | var 52 | LLogService: IFMXLoggingService; 53 | begin 54 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, 55 | LLogService) then 56 | begin 57 | LLogService.Log(edLog.Text, []); 58 | end; 59 | end; 60 | 61 | procedure TfrmLogDemo.FormCreate(Sender: TObject); 62 | begin 63 | Log('Application started.'); 64 | end; 65 | 66 | procedure TfrmLogDemo.FormDestroy(Sender: TObject); 67 | begin 68 | Log('Shutting down application.'); 69 | end; 70 | 71 | procedure TfrmLogDemo.Log(const AMsg: string); 72 | var 73 | LLogService: IFMXLoggingService; 74 | begin 75 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, 76 | LLogService) then 77 | begin 78 | LLogService.Log(AMsg, []); 79 | end; 80 | end; 81 | 82 | end. 83 | -------------------------------------------------------------------------------- /FMX.Platform.Logger.Android.Fix.pas: -------------------------------------------------------------------------------- 1 | unit FMX.Platform.Logger.Android.Fix; 2 | 3 | interface 4 | uses 5 | {$IF DEFINED(ANDROID)} 6 | Androidapi.Log, 7 | {$ENDIF} 8 | FMX.Platform; 9 | 10 | type 11 | /// Provides the ability to change the default tag used when logging. 12 | IFMXChangeTag = interface 13 | ['{2D2FE594-3F82-4A6D-8C51-60918C76C1B8}'] 14 | procedure ChangeTag(const ANewTag: string); 15 | function GetTag: string; 16 | property Tag: string read GetTag write ChangeTag; 17 | end; 18 | 19 | /// Provides the ability to log messages with specific tags 20 | IFMXTagPriority = interface 21 | ['{6CC65368-A359-4DE4-B987-5D433D093110}'] 22 | 23 | /// Log a debug message. 24 | procedure d(const Msg: string); overload; 25 | /// Log a debug message with a tag. 26 | procedure d(const Tag, Msg: string); overload; 27 | 28 | /// Log an error message. 29 | procedure e(const Msg: string); overload; 30 | /// Log an error message with a tag. 31 | procedure e(const Tag, Msg: string); overload; 32 | 33 | /// Log an info message. 34 | procedure i(const Msg: string); overload; 35 | /// Log an info message with a tag. 36 | procedure i(const Tag, Msg: string); overload; 37 | 38 | /// Log a verbose message. 39 | procedure v(const Msg: string); overload; 40 | /// Log a verbose message with a tag. 41 | procedure v(const Tag, Msg: string); overload; 42 | end; 43 | 44 | {$IF DEFINED(ANDROID)} 45 | type 46 | 47 | TFixedAndroidLoggerService = class(TInterfacedObject, IFMXLoggingService, 48 | IFMXChangeTag, IFMXTagPriority) 49 | protected 50 | FLogger: IFMXLoggingService; 51 | FTag: string; 52 | procedure Clear; 53 | public 54 | procedure ChangeTag(const ANewTag: string); 55 | function GetTag: string; 56 | constructor Create(const ATag: string='DELPHIFMX'); 57 | destructor Destroy; override; 58 | procedure Log(const AFormat: string; const AParams: array of const); 59 | 60 | procedure LogPriority(APriority: android_LogPriority; const ATag, AMsg: string); 61 | 62 | // IFMXTagPriority 63 | procedure d(const Msg: string); overload; 64 | procedure d(const Tag, Msg: string); overload; virtual; 65 | procedure e(const Msg: string); overload; 66 | procedure e(const Tag, Msg: string); overload; virtual; 67 | procedure i(const Msg: string); overload; 68 | procedure i(const Tag, Msg: string); overload; virtual; 69 | procedure v(const Msg: string); overload; 70 | procedure v(const Tag, Msg: string); overload; virtual; 71 | 72 | property Tag: string read GetTag write ChangeTag; 73 | end; 74 | 75 | Log = class abstract 76 | strict private 77 | class var FLogger: IInterface; 78 | class var FLogPriority: IFMXTagPriority; 79 | class function GetLogger: IInterface; static; 80 | class function GetLogPriority: IFMXTagPriority; static; 81 | protected 82 | /// Referece to the logger service. 83 | class property Logger: IInterface read GetLogger; 84 | class property LogPriority: IFMXTagPriority read GetLogPriority; 85 | public 86 | /// Log a simple debug message. 87 | class procedure d(const Msg: string); overload; 88 | /// Log a debug message with a tag. 89 | class procedure d(const Tag, Msg: string); overload; 90 | 91 | /// Log a simple error message. 92 | class procedure e(const Msg: string); overload; 93 | /// Log an error message with a tag. 94 | class procedure e(const Tag, Msg: string); overload; 95 | 96 | /// Log a simple info message. 97 | class procedure i(const Msg: string); overload; 98 | /// Log an info message with a tag. 99 | class procedure i(const Tag, Msg: string); overload; 100 | 101 | /// Log a verbose message. 102 | class procedure v(const Msg: string); overload; 103 | /// Log an verbose message with a tag. 104 | class procedure v(const Tag, Msg: string); overload; 105 | end; 106 | 107 | {$ELSE} 108 | type 109 | 110 | Log = class abstract 111 | strict private 112 | class var FLogger: IInterface; 113 | class var FLogPriority: IFMXTagPriority; 114 | class function GetLogger: IInterface; static; 115 | class function GetLogPriority: IFMXTagPriority; static; 116 | protected 117 | /// Referece to the logger service. 118 | class property Logger: IInterface read GetLogger; 119 | class property LogPriority: IFMXTagPriority read GetLogPriority; 120 | public 121 | /// Log a simple debug message. 122 | class procedure d(const Msg: string); overload; static; 123 | /// Log a debug message with a tag. 124 | class procedure d(const Tag, Msg: string); overload; static; 125 | 126 | /// Log a simple error message. 127 | class procedure e(const Msg: string); overload; static; 128 | /// Log an error message with a tag. 129 | class procedure e(const Tag, Msg: string); overload; static; 130 | 131 | /// Log a simple info message. 132 | class procedure i(const Msg: string); overload; static; 133 | /// Log an info message with a tag. 134 | class procedure i(const Tag, Msg: string); overload; static; 135 | 136 | /// Log a verbose message. 137 | class procedure v(const Msg: string); overload; static; 138 | /// Log an verbose message with a tag. 139 | class procedure v(const Tag, Msg: string); overload; static; 140 | end; 141 | 142 | android_LogPriority = ( 143 | ANDROID_LOG_UNKNOWN, 144 | ANDROID_LOG_DEFAULT, 145 | ANDROID_LOG_VERBOSE, 146 | ANDROID_LOG_DEBUG, 147 | ANDROID_LOG_INFO, 148 | ANDROID_LOG_WARN, 149 | ANDROID_LOG_ERROR, 150 | ANDROID_LOG_FATAL, 151 | ANDROID_LOG_SILENT 152 | ); 153 | 154 | TFixedAndroidLoggerService = class(TInterfacedObject, IFMXLoggingService, 155 | IFMXChangeTag, IFMXTagPriority) 156 | protected 157 | FLogger: IFMXLoggingService; 158 | FTag: string; 159 | procedure Clear; 160 | public 161 | 162 | class procedure LogPriority(APriority: android_LogPriority; const ATag, AMsg: string); static; 163 | 164 | // IFMXTagPriority 165 | procedure d(const Msg: string); overload; 166 | procedure d(const Tag, Msg: string); overload; virtual; 167 | procedure e(const Msg: string); overload; 168 | procedure e(const Tag, Msg: string); overload; virtual; 169 | procedure i(const Msg: string); overload; 170 | procedure i(const Tag, Msg: string); overload; virtual; 171 | procedure v(const Msg: string); overload; 172 | procedure v(const Tag, Msg: string); overload; virtual; 173 | 174 | procedure ChangeTag(const ANewTag: string); 175 | function GetTag: string; 176 | constructor Create(const ATag: string='DELPHIFMX'); 177 | destructor Destroy; override; 178 | procedure Log(const AFormat: string; const AParams: array of const); 179 | property Tag: string read GetTag write ChangeTag; 180 | end; 181 | 182 | {$ENDIF} 183 | 184 | procedure ChangeTag(const ATag: string); 185 | function DefaultLoggerInstalled: Boolean; 186 | procedure InstalLReplacementLogger(const ATag: string='DELPHIFMX'); 187 | function ReplacementLoggerInstalled: Boolean; 188 | var 189 | GReplacementLogger: TFixedAndroidLoggerService; 190 | 191 | implementation 192 | {$IF DEFINED(ANDROID)} 193 | uses 194 | System.SysUtils, Androidapi.Helpers; 195 | 196 | const 197 | AndroidLogLib = '/usr/lib/liblog.so'; 198 | 199 | function __android_log_write(Priority: android_LogPriority; const Tag, Text: MarshaledAString): Integer; cdecl; 200 | external AndroidLogLib name '__android_log_write'; 201 | 202 | var 203 | IReplacementLogger: IFMXLoggingService; 204 | 205 | //class procedure Log.d(const Msg: string); 206 | //begin 207 | // if LogPriority <> nil then 208 | // LogPriority.d(Msg); 209 | //end; 210 | // 211 | //class procedure Log.d(const Tag, Msg: string); 212 | //begin 213 | // if LogPriority <> nil then 214 | // LogPriority.d(Tag, Msg); 215 | //end; 216 | // 217 | //class procedure Log.e(const Msg: string); 218 | //begin 219 | // if LogPriority <> nil then 220 | // LogPriority.e('', Msg); 221 | //end; 222 | // 223 | //class procedure Log.e(const Tag, Msg: string); 224 | //begin 225 | // if LogPriority <> nil then 226 | // LogPriority.e(Tag, Msg); 227 | //end; 228 | // 229 | //class procedure Log.i(const Msg: string); 230 | //begin 231 | // if LogPriority <> nil then 232 | // LogPriority.i(Msg); 233 | //end; 234 | // 235 | //class procedure Log.i(const Tag, Msg: string); 236 | //begin 237 | // if LogPriority <> nil then 238 | // LogPriority.i(Tag, Msg); 239 | //end; 240 | // 241 | //class procedure Log.v(const Msg: string); 242 | //begin 243 | // if LogPriority <> nil then 244 | // LogPriority.v(Msg); 245 | //end; 246 | // 247 | //class procedure Log.v(const Tag, Msg: string); 248 | //begin 249 | // if LogPriority <> nil then 250 | // LogPriority.v(Tag, Msg); 251 | //end; 252 | 253 | {$ELSE} 254 | uses 255 | {$IF DEFINED(MSWINDOWS)} 256 | Winapi.Windows, 257 | {$ENDIF} 258 | System.SysUtils; 259 | 260 | var 261 | IReplacementLogger: IFMXLoggingService; 262 | {$ENDIF} 263 | 264 | procedure ChangeTag(const ATag: string); 265 | var 266 | LLogger: IFMXLoggingService; 267 | LFMXChangeTag: IFMXChangeTag; 268 | begin 269 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogger) and 270 | Supports(LLogger, IFMXChangeTag, LFMXChangeTag) then 271 | LFMXChangeTag.ChangeTag(ATag); 272 | end; 273 | 274 | procedure InstallReplacementLogger(const ATag: string='DELPHIFMX'); 275 | begin 276 | if (GReplacementLogger <> nil) and (GReplacementLogger.Tag <> ATag) then 277 | begin 278 | if ATag <> '' then 279 | GReplacementLogger.ChangeTag(ATag); 280 | Exit; 281 | end; 282 | if (GReplacementLogger = nil) then 283 | GReplacementLogger := TFixedAndroidLoggerService.Create(ATag); 284 | end; 285 | 286 | function ReplacementLoggerInstalled: Boolean; 287 | begin 288 | Result := IReplacementLogger <> nil; 289 | end; 290 | 291 | function DefaultLoggerInstalled: Boolean; 292 | var 293 | LLogger: IInterface; 294 | begin 295 | Result := False; 296 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogger) then 297 | Result := LLogger <> nil; 298 | end; 299 | 300 | class function Log.GetLogger: IInterface; 301 | begin 302 | if FLogger = nil then 303 | TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, FLogger); 304 | Result := FLogger; 305 | end; 306 | 307 | class function Log.GetLogPriority: IFMXTagPriority; 308 | var 309 | LLogger: IInterface; 310 | begin 311 | LLogger := Logger; 312 | if (LLogger <> nil) and (FLogPriority = nil) then 313 | Supports(LLogger, IFMXTagPriority, FLogPriority); 314 | Result := FLogPriority; 315 | end; 316 | 317 | class procedure Log.d(const Msg: string); 318 | begin 319 | d('', Msg); 320 | end; 321 | 322 | class procedure Log.d(const Tag, Msg: string); 323 | begin 324 | if LogPriority <> nil then 325 | LogPriority.d(Tag, Msg); 326 | end; 327 | 328 | class procedure Log.e(const Msg: string); 329 | begin 330 | e('', Msg); 331 | end; 332 | 333 | class procedure Log.e(const Tag, Msg: string); 334 | begin 335 | if LogPriority <> nil then 336 | LogPriority.e(Tag, Msg); 337 | end; 338 | 339 | class procedure Log.i(const Msg: string); 340 | begin 341 | i('', Msg); 342 | end; 343 | 344 | class procedure Log.i(const Tag, Msg: string); 345 | begin 346 | if LogPriority <> nil then 347 | LogPriority.i(Tag, Msg); 348 | end; 349 | 350 | class procedure Log.v(const Msg: string); 351 | begin 352 | v('', Msg); 353 | end; 354 | 355 | class procedure Log.v(const Tag, Msg: string); 356 | begin 357 | if LogPriority <> nil then 358 | LogPriority.v(Tag, Msg); 359 | end; 360 | 361 | { TFixedAndroidLoggerService } 362 | procedure TFixedAndroidLoggerService.ChangeTag(const ANewTag: string); 363 | begin 364 | FTag := ANewTag; 365 | end; 366 | 367 | function TFixedAndroidLoggerService.GetTag: string; 368 | begin 369 | Result := FTag; 370 | end; 371 | 372 | procedure TFixedAndroidLoggerService.Clear; 373 | begin 374 | TPlatformServices.Current.RemovePlatformService(IFMXChangeTag); 375 | TPlatformServices.Current.RemovePlatformService(IFMXLoggingService); 376 | FLogger := nil; 377 | IReplacementLogger := nil; 378 | end; 379 | 380 | constructor TFixedAndroidLoggerService.Create(const ATag: string); 381 | begin 382 | inherited Create; 383 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, FLogger) then 384 | begin 385 | TPlatformServices.Current.RemovePlatformService(IFMXLoggingService); 386 | end; 387 | FTag := ATag; 388 | IReplacementLogger := Self; 389 | TPlatformServices.Current.AddPlatformService(IFMXLoggingService, IReplacementLogger); 390 | TPlatformServices.Current.AddPlatformService(IFMXChangeTag, IReplacementLogger); 391 | end; 392 | 393 | destructor TFixedAndroidLoggerService.Destroy; 394 | begin 395 | Clear; 396 | inherited; 397 | end; 398 | 399 | {$IF DEFINED(ANDROID)} 400 | procedure TFixedAndroidLoggerService.LogPriority(APriority: android_LogPriority; 401 | const ATag, AMsg: string); 402 | var 403 | LTag, LMsg: MarshaledAString; 404 | M: TMarshaller; 405 | begin 406 | if ATag <> '' then 407 | LTag := M.AsUtf8(ATag).ToPointer else 408 | LTag := M.AsUtf8(FTag).ToPointer; 409 | LMsg := M.AsUtf8(AMsg).ToPointer; 410 | __android_log_write(APriority, LTag, LMsg); 411 | end; 412 | 413 | procedure TFixedAndroidLoggerService.d(const Msg: string); 414 | begin 415 | d('', Msg); 416 | end; 417 | 418 | procedure TFixedAndroidLoggerService.d(const Tag, Msg: string); 419 | begin 420 | LogPriority(android_LogPriority.ANDROID_LOG_DEBUG, Tag, Msg); 421 | end; 422 | 423 | procedure TFixedAndroidLoggerService.e(const Msg: string); 424 | begin 425 | e('', Msg); 426 | end; 427 | 428 | procedure TFixedAndroidLoggerService.e(const Tag, Msg: string); 429 | begin 430 | LogPriority(android_LogPriority.ANDROID_LOG_ERROR, Tag, Msg); 431 | end; 432 | 433 | procedure TFixedAndroidLoggerService.i(const Msg: string); 434 | begin 435 | i('', Msg); 436 | end; 437 | 438 | procedure TFixedAndroidLoggerService.i(const Tag, Msg: string); 439 | begin 440 | LogPriority(android_LogPriority.ANDROID_LOG_INFO, Tag, Msg); 441 | end; 442 | 443 | procedure TFixedAndroidLoggerService.v(const Msg: string); 444 | begin 445 | v('', Msg); 446 | end; 447 | 448 | procedure TFixedAndroidLoggerService.v(const Tag, Msg: string); 449 | begin 450 | LogPriority(android_LogPriority.ANDROID_LOG_VERBOSE, Tag, Msg); 451 | end; 452 | {$ELSE} 453 | class procedure TFixedAndroidLoggerService.LogPriority(APriority: android_LogPriority; 454 | const ATag, AMsg: string); 455 | {$IF DEFINED(MSWINDOWS)} 456 | var 457 | LMsg: PChar; 458 | {$ENDIF} 459 | begin 460 | {$IF DEFINED(MSWINDOWS)} 461 | LMsg := PChar(Format('Tag: %s Msg: %s', [ATag, AMsg])); 462 | OutputDebugString(LMsg); 463 | {$ENDIF} 464 | // do nothing on other systems 465 | end; 466 | 467 | procedure TFixedAndroidLoggerService.d(const Msg: string); 468 | begin 469 | d('', Msg); 470 | end; 471 | 472 | procedure TFixedAndroidLoggerService.d(const Tag, Msg: string); 473 | begin 474 | LogPriority(android_LogPriority.ANDROID_LOG_DEBUG, Tag, Msg); 475 | end; 476 | 477 | procedure TFixedAndroidLoggerService.e(const Msg: string); 478 | begin 479 | e('', Msg); 480 | end; 481 | 482 | procedure TFixedAndroidLoggerService.e(const Tag, Msg: string); 483 | begin 484 | LogPriority(android_LogPriority.ANDROID_LOG_ERROR, Tag, Msg); 485 | end; 486 | 487 | procedure TFixedAndroidLoggerService.i(const Msg: string); 488 | begin 489 | i('', Msg); 490 | end; 491 | 492 | procedure TFixedAndroidLoggerService.i(const Tag, Msg: string); 493 | begin 494 | LogPriority(android_LogPriority.ANDROID_LOG_INFO, Tag, Msg); 495 | end; 496 | 497 | procedure TFixedAndroidLoggerService.v(const Msg: string); 498 | begin 499 | v('', Msg); 500 | end; 501 | 502 | procedure TFixedAndroidLoggerService.v(const Tag, Msg: string); 503 | begin 504 | LogPriority(android_LogPriority.ANDROID_LOG_VERBOSE, Tag, Msg); 505 | end; 506 | {$ENDIF} 507 | 508 | procedure TFixedAndroidLoggerService.Log(const AFormat: string; 509 | const AParams: array of const); 510 | {$IF DEFINED(ANDROID)} 511 | var 512 | Msg: string; 513 | M: TMarshaller; 514 | LTag, LMsg: MarshaledAString; 515 | {$ENDIF} 516 | begin 517 | {$IF DEFINED(ANDROID)} 518 | if Length(AParams) = 0 then 519 | Msg := AFormat 520 | else 521 | Msg := Format(AFormat, AParams); 522 | 523 | LTag := M.AsUtf8(FTag).ToPointer; 524 | LMsg := M.AsUtf8(Msg).ToPointer; 525 | __android_log_write(android_LogPriority.ANDROID_LOG_INFO, LTag, LMsg); 526 | {$ELSE} 527 | if Assigned(FLogger) then 528 | begin 529 | FLogger.Log(AFormat, AParams); 530 | end; 531 | {$ENDIF} 532 | end; 533 | 534 | initialization 535 | InstallReplacementLogger; 536 | finalization 537 | if GReplacementLogger <> nil then 538 | begin 539 | GReplacementLogger.Clear; 540 | GReplacementLogger.DisposeOf; 541 | end; 542 | end. 543 | -------------------------------------------------------------------------------- /FixAndroidLogger.deployproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 12 5 | 6 | 7 | 29271FDH300BL0 8 | 29271FDH300BL0 9 | 10 | 11 | 12 | 13 | 14 | 15 | FixAndroidLogger\res\drawable-hdpi\ 16 | ic_launcher.png 17 | Android_LauncherIcon72 18 | 1 19 | 20 | 21 | True 22 | 23 | 24 | FixAndroidLogger\library\lib\arm64-v8a\ 25 | libFixAndroidLogger.so 26 | ProjectOutput 27 | 1 28 | 29 | 30 | True 31 | True 32 | 33 | 34 | FixAndroidLogger\classes\ 35 | FixAndroidLogger.classes 36 | AndroidClasses 37 | 64 38 | 39 | 40 | True 41 | 42 | 43 | FixAndroidLogger\ 44 | AndroidManifest.xml 45 | ProjectAndroidManifest 46 | 1 47 | 48 | 49 | True 50 | 51 | 52 | FixAndroidLogger\res\drawable-xxhdpi\ 53 | ic_launcher.png 54 | Android_LauncherIcon144 55 | 1 56 | 57 | 58 | True 59 | 60 | 61 | FixAndroidLogger\res\drawable-xxxhdpi\ 62 | ic_launcher.png 63 | Android_LauncherIcon192 64 | 1 65 | 66 | 67 | True 68 | 69 | 70 | FixAndroidLogger\res\drawable-mdpi\ 71 | ic_launcher.png 72 | Android_LauncherIcon48 73 | 1 74 | 75 | 76 | True 77 | 78 | 79 | FixAndroidLogger\res\drawable-xhdpi\ 80 | ic_notification.png 81 | Android_NotificationIcon48 82 | 1 83 | 84 | 85 | True 86 | 87 | 88 | FixAndroidLogger\res\drawable-large\ 89 | splash_image.png 90 | Android_SplashImage640 91 | 1 92 | 93 | 94 | True 95 | 96 | 97 | FixAndroidLogger\library\lib\armeabi\ 98 | libFixAndroidLogger.so 99 | AndroidLibnativeArmeabiFile 100 | 1 101 | 102 | 103 | True 104 | 105 | 106 | FixAndroidLogger\res\values\ 107 | colors.xml 108 | Android_Colors 109 | 1 110 | 111 | 112 | True 113 | 114 | 115 | FixAndroidLogger\res\drawable-hdpi\ 116 | ic_notification.png 117 | Android_NotificationIcon36 118 | 1 119 | 120 | 121 | True 122 | 123 | 124 | FixAndroidLogger\res\drawable-xxxhdpi\ 125 | ic_notification.png 126 | Android_NotificationIcon96 127 | 1 128 | 129 | 130 | True 131 | 132 | 133 | FixAndroidLogger\res\drawable\ 134 | splash_image_def.xml 135 | AndroidSplashImageDef 136 | 1 137 | 138 | 139 | True 140 | 141 | 142 | FixAndroidLogger\library\lib\mips\ 143 | libFixAndroidLogger.so 144 | AndroidLibnativeMipsFile 145 | 1 146 | 147 | 148 | True 149 | 150 | 151 | FixAndroidLogger\res\drawable-xhdpi\ 152 | ic_launcher.png 153 | Android_LauncherIcon96 154 | 1 155 | 156 | 157 | True 158 | 159 | 160 | FixAndroidLogger\library\lib\armeabi-v7a\ 161 | libFixAndroidLogger.so 162 | AndroidLibnativeArmeabiv7aFile 163 | 1 164 | 165 | 166 | True 167 | 168 | 169 | FixAndroidLogger\res\drawable-mdpi\ 170 | ic_notification.png 171 | Android_NotificationIcon24 172 | 1 173 | 174 | 175 | True 176 | 177 | 178 | FixAndroidLogger\res\drawable-ldpi\ 179 | ic_launcher.png 180 | Android_LauncherIcon36 181 | 1 182 | 183 | 184 | True 185 | 186 | 187 | FixAndroidLogger\res\drawable-xlarge\ 188 | splash_image.png 189 | Android_SplashImage960 190 | 1 191 | 192 | 193 | True 194 | 195 | 196 | FixAndroidLogger\res\drawable-small\ 197 | splash_image.png 198 | Android_SplashImage426 199 | 1 200 | 201 | 202 | True 203 | 204 | 205 | FixAndroidLogger\res\values\ 206 | styles.xml 207 | AndroidSplashStyles 208 | 1 209 | 210 | 211 | True 212 | 213 | 214 | FixAndroidLogger\res\values\ 215 | strings.xml 216 | Android_Strings 217 | 1 218 | 219 | 220 | True 221 | 222 | 223 | FixAndroidLogger\res\values-v21\ 224 | styles.xml 225 | AndroidSplashStylesV21 226 | 1 227 | 228 | 229 | True 230 | 231 | 232 | FixAndroidLogger\res\drawable-xxhdpi\ 233 | ic_notification.png 234 | Android_NotificationIcon72 235 | 1 236 | 237 | 238 | True 239 | 240 | 241 | FixAndroidLogger\res\drawable-normal\ 242 | splash_image.png 243 | Android_SplashImage470 244 | 1 245 | 246 | 247 | True 248 | 249 | 250 | 251 | 252 | FixAndroidLogger\res\drawable-large\ 253 | splash_image.png 254 | Android_SplashImage640 255 | 1 256 | 257 | 258 | True 259 | 260 | 261 | FixAndroidLogger\res\values\ 262 | strings.xml 263 | Android_Strings 264 | 1 265 | 266 | 267 | True 268 | 269 | 270 | FixAndroidLogger\res\values\ 271 | colors.xml 272 | Android_Colors 273 | 1 274 | 275 | 276 | True 277 | 278 | 279 | FixAndroidLogger\res\drawable\ 280 | splash_image_def.xml 281 | AndroidSplashImageDef 282 | 1 283 | 284 | 285 | True 286 | 287 | 288 | FixAndroidLogger\res\drawable-hdpi\ 289 | ic_launcher.png 290 | Android_LauncherIcon72 291 | 1 292 | 293 | 294 | True 295 | 296 | 297 | FixAndroidLogger\res\drawable-normal\ 298 | splash_image.png 299 | Android_SplashImage470 300 | 1 301 | 302 | 303 | True 304 | 305 | 306 | FixAndroidLogger\res\drawable-xxhdpi\ 307 | ic_notification.png 308 | Android_NotificationIcon72 309 | 1 310 | 311 | 312 | True 313 | 314 | 315 | FixAndroidLogger\res\drawable-xxhdpi\ 316 | ic_launcher.png 317 | Android_LauncherIcon144 318 | 1 319 | 320 | 321 | True 322 | 323 | 324 | FixAndroidLogger\res\drawable-xxxhdpi\ 325 | ic_launcher.png 326 | Android_LauncherIcon192 327 | 1 328 | 329 | 330 | True 331 | 332 | 333 | FixAndroidLogger\res\drawable-mdpi\ 334 | ic_launcher.png 335 | Android_LauncherIcon48 336 | 1 337 | 338 | 339 | True 340 | 341 | 342 | FixAndroidLogger\library\lib\armeabi-v7a\ 343 | libFixAndroidLogger.so 344 | ProjectOutput 345 | 1 346 | 347 | 348 | True 349 | True 350 | 351 | 352 | FixAndroidLogger\res\drawable-xhdpi\ 353 | ic_launcher.png 354 | Android_LauncherIcon96 355 | 1 356 | 357 | 358 | True 359 | 360 | 361 | FixAndroidLogger\res\drawable-xlarge\ 362 | splash_image.png 363 | Android_SplashImage960 364 | 1 365 | 366 | 367 | True 368 | 369 | 370 | FixAndroidLogger\ 371 | AndroidManifest.xml 372 | ProjectAndroidManifest 373 | 1 374 | 375 | 376 | True 377 | 378 | 379 | FixAndroidLogger\classes\ 380 | FixAndroidLogger.classes 381 | AndroidClasses 382 | 64 383 | 384 | 385 | True 386 | 387 | 388 | FixAndroidLogger\res\values\ 389 | styles.xml 390 | AndroidSplashStyles 391 | 1 392 | 393 | 394 | True 395 | 396 | 397 | FixAndroidLogger\res\drawable-xhdpi\ 398 | ic_notification.png 399 | Android_NotificationIcon48 400 | 1 401 | 402 | 403 | True 404 | 405 | 406 | FixAndroidLogger\res\values-v21\ 407 | styles.xml 408 | AndroidSplashStylesV21 409 | 1 410 | 411 | 412 | True 413 | 414 | 415 | FixAndroidLogger\library\lib\armeabi\ 416 | libFixAndroidLogger.so 417 | AndroidLibnativeArmeabiFile 418 | 1 419 | 420 | 421 | True 422 | 423 | 424 | FixAndroidLogger\res\drawable-mdpi\ 425 | ic_notification.png 426 | Android_NotificationIcon24 427 | 1 428 | 429 | 430 | True 431 | 432 | 433 | FixAndroidLogger\res\drawable-small\ 434 | splash_image.png 435 | Android_SplashImage426 436 | 1 437 | 438 | 439 | True 440 | 441 | 442 | FixAndroidLogger\res\drawable-ldpi\ 443 | ic_launcher.png 444 | Android_LauncherIcon36 445 | 1 446 | 447 | 448 | True 449 | 450 | 451 | FixAndroidLogger\library\lib\mips\ 452 | libFixAndroidLogger.so 453 | AndroidLibnativeMipsFile 454 | 1 455 | 456 | 457 | True 458 | 459 | 460 | FixAndroidLogger\res\drawable-hdpi\ 461 | ic_notification.png 462 | Android_NotificationIcon36 463 | 1 464 | 465 | 466 | True 467 | 468 | 469 | FixAndroidLogger\res\drawable-xxxhdpi\ 470 | ic_notification.png 471 | Android_NotificationIcon96 472 | 1 473 | 474 | 475 | True 476 | 477 | 478 | 479 | -------------------------------------------------------------------------------- /FixAndroidLogger.dpr: -------------------------------------------------------------------------------- 1 | program FixAndroidLogger; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | FixAndroudLoggerDemoImpl in 'FixAndroudLoggerDemoImpl.pas' {frmLogDemo}, 7 | FMX.Platform.Logger.Android.Fix in 'FMX.Platform.Logger.Android.Fix.pas'; 8 | 9 | {$R *.res} 10 | 11 | begin 12 | Application.Initialize; 13 | Application.CreateForm(TfrmLogDemo, frmLogDemo); 14 | Application.Run; 15 | end. 16 | -------------------------------------------------------------------------------- /FixAndroidLogger.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {8B389755-ED13-4E31-A4C7-F78683399EA2} 4 | 19.5 5 | FMX 6 | FixAndroidLogger.dpr 7 | True 8 | Debug 9 | Android64 10 | 32784 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | .\$(Platform)\$(Config) 44 | .\$(Platform)\$(Config) 45 | false 46 | false 47 | false 48 | false 49 | false 50 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 51 | true 52 | true 53 | true 54 | true 55 | true 56 | true 57 | true 58 | true 59 | $(BDS)\bin\delphi_PROJECTICON.ico 60 | $(BDS)\bin\delphi_PROJECTICNS.icns 61 | FixAndroidLogger 62 | false 63 | 64 | 65 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) 66 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 67 | Debug 68 | true 69 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 70 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 71 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 72 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 73 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 74 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 75 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 76 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 77 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 78 | activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 79 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 80 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 81 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 82 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 83 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 84 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 85 | 86 | 87 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 88 | Debug 89 | true 90 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) 91 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 92 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 93 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 95 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 96 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 97 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 98 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 99 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 100 | activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 101 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 102 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 103 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 106 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 107 | 108 | 109 | DEBUG;$(DCC_Define) 110 | true 111 | false 112 | true 113 | true 114 | true 115 | 116 | 117 | -cleaninstall 118 | 119 | 120 | false 121 | RELEASE;$(DCC_Define) 122 | 0 123 | 0 124 | 125 | 126 | 127 | MainSource 128 | 129 | 130 |
frmLogDemo
131 | fmx 132 |
133 | 134 | 135 | Base 136 | 137 | 138 | Cfg_1 139 | Base 140 | 141 | 142 | Cfg_2 143 | Base 144 | 145 |
146 | 147 | Delphi.Personality.12 148 | Application 149 | 150 | 151 | 152 | FixAndroidLogger.dpr 153 | 154 | 155 | 156 | 157 | 158 | ic_launcher.png 159 | true 160 | 161 | 162 | 163 | 164 | ic_launcher.png 165 | true 166 | 167 | 168 | 169 | 170 | ic_launcher.png 171 | true 172 | 173 | 174 | 175 | 176 | ic_launcher.png 177 | true 178 | 179 | 180 | 181 | 182 | ic_launcher.png 183 | true 184 | 185 | 186 | 187 | 188 | ic_launcher.png 189 | true 190 | 191 | 192 | 193 | 194 | ic_launcher.png 195 | true 196 | 197 | 198 | 199 | 200 | ic_launcher.png 201 | true 202 | 203 | 204 | 205 | 206 | ic_launcher.png 207 | true 208 | 209 | 210 | 211 | 212 | ic_launcher.png 213 | true 214 | 215 | 216 | 217 | 218 | ic_launcher.png 219 | true 220 | 221 | 222 | 223 | 224 | ic_launcher.png 225 | true 226 | 227 | 228 | 229 | 230 | ic_notification.png 231 | true 232 | 233 | 234 | 235 | 236 | ic_notification.png 237 | true 238 | 239 | 240 | 241 | 242 | ic_notification.png 243 | true 244 | 245 | 246 | 247 | 248 | ic_notification.png 249 | true 250 | 251 | 252 | 253 | 254 | ic_notification.png 255 | true 256 | 257 | 258 | 259 | 260 | ic_notification.png 261 | true 262 | 263 | 264 | 265 | 266 | ic_notification.png 267 | true 268 | 269 | 270 | 271 | 272 | ic_notification.png 273 | true 274 | 275 | 276 | 277 | 278 | ic_notification.png 279 | true 280 | 281 | 282 | 283 | 284 | ic_notification.png 285 | true 286 | 287 | 288 | 289 | 290 | splash_image.png 291 | true 292 | 293 | 294 | 295 | 296 | splash_image.png 297 | true 298 | 299 | 300 | 301 | 302 | splash_image.png 303 | true 304 | 305 | 306 | 307 | 308 | splash_image.png 309 | true 310 | 311 | 312 | 313 | 314 | splash_image.png 315 | true 316 | 317 | 318 | 319 | 320 | splash_image.png 321 | true 322 | 323 | 324 | 325 | 326 | splash_image.png 327 | true 328 | 329 | 330 | 331 | 332 | splash_image.png 333 | true 334 | 335 | 336 | 337 | 338 | libFixAndroidLogger.so 339 | true 340 | 341 | 342 | 343 | 344 | libFixAndroidLogger.so 345 | true 346 | 347 | 348 | 349 | 350 | libFixAndroidLogger.so 351 | true 352 | 353 | 354 | 355 | 356 | libFixAndroidLogger.so 357 | true 358 | 359 | 360 | 361 | 362 | libFixAndroidLogger.so 363 | true 364 | 365 | 366 | 367 | 368 | true 369 | 370 | 371 | 372 | 373 | 64 374 | true 375 | 376 | 377 | 378 | 379 | true 380 | 381 | 382 | 383 | 384 | libFixAndroidLogger.so 385 | true 386 | 387 | 388 | 389 | 390 | true 391 | 392 | 393 | 394 | 395 | true 396 | 397 | 398 | 399 | 400 | styles.xml 401 | true 402 | 403 | 404 | 405 | 406 | true 407 | 408 | 409 | 410 | 411 | true 412 | 413 | 414 | 415 | 416 | 64 417 | true 418 | 419 | 420 | 421 | 422 | true 423 | 424 | 425 | 426 | 427 | libFixAndroidLogger.so 428 | true 429 | 430 | 431 | 432 | 433 | true 434 | 435 | 436 | 437 | 438 | true 439 | 440 | 441 | 442 | 443 | styles.xml 444 | true 445 | 446 | 447 | 448 | 449 | true 450 | 451 | 452 | 453 | 454 | classes 455 | 64 456 | 457 | 458 | classes 459 | 64 460 | 461 | 462 | 463 | 464 | res\xml 465 | 1 466 | 467 | 468 | res\xml 469 | 1 470 | 471 | 472 | 473 | 474 | library\lib\armeabi-v7a 475 | 1 476 | 477 | 478 | 479 | 480 | library\lib\armeabi 481 | 1 482 | 483 | 484 | library\lib\armeabi 485 | 1 486 | 487 | 488 | 489 | 490 | library\lib\armeabi-v7a 491 | 1 492 | 493 | 494 | 495 | 496 | library\lib\mips 497 | 1 498 | 499 | 500 | library\lib\mips 501 | 1 502 | 503 | 504 | 505 | 506 | library\lib\armeabi-v7a 507 | 1 508 | 509 | 510 | library\lib\arm64-v8a 511 | 1 512 | 513 | 514 | 515 | 516 | library\lib\armeabi-v7a 517 | 1 518 | 519 | 520 | 521 | 522 | res\drawable 523 | 1 524 | 525 | 526 | res\drawable 527 | 1 528 | 529 | 530 | 531 | 532 | res\values 533 | 1 534 | 535 | 536 | res\values 537 | 1 538 | 539 | 540 | 541 | 542 | res\values-v21 543 | 1 544 | 545 | 546 | res\values-v21 547 | 1 548 | 549 | 550 | 551 | 552 | res\values 553 | 1 554 | 555 | 556 | res\values 557 | 1 558 | 559 | 560 | 561 | 562 | res\drawable 563 | 1 564 | 565 | 566 | res\drawable 567 | 1 568 | 569 | 570 | 571 | 572 | res\drawable-xxhdpi 573 | 1 574 | 575 | 576 | res\drawable-xxhdpi 577 | 1 578 | 579 | 580 | 581 | 582 | res\drawable-xxxhdpi 583 | 1 584 | 585 | 586 | res\drawable-xxxhdpi 587 | 1 588 | 589 | 590 | 591 | 592 | res\drawable-ldpi 593 | 1 594 | 595 | 596 | res\drawable-ldpi 597 | 1 598 | 599 | 600 | 601 | 602 | res\drawable-mdpi 603 | 1 604 | 605 | 606 | res\drawable-mdpi 607 | 1 608 | 609 | 610 | 611 | 612 | res\drawable-hdpi 613 | 1 614 | 615 | 616 | res\drawable-hdpi 617 | 1 618 | 619 | 620 | 621 | 622 | res\drawable-xhdpi 623 | 1 624 | 625 | 626 | res\drawable-xhdpi 627 | 1 628 | 629 | 630 | 631 | 632 | res\drawable-mdpi 633 | 1 634 | 635 | 636 | res\drawable-mdpi 637 | 1 638 | 639 | 640 | 641 | 642 | res\drawable-hdpi 643 | 1 644 | 645 | 646 | res\drawable-hdpi 647 | 1 648 | 649 | 650 | 651 | 652 | res\drawable-xhdpi 653 | 1 654 | 655 | 656 | res\drawable-xhdpi 657 | 1 658 | 659 | 660 | 661 | 662 | res\drawable-xxhdpi 663 | 1 664 | 665 | 666 | res\drawable-xxhdpi 667 | 1 668 | 669 | 670 | 671 | 672 | res\drawable-xxxhdpi 673 | 1 674 | 675 | 676 | res\drawable-xxxhdpi 677 | 1 678 | 679 | 680 | 681 | 682 | res\drawable-small 683 | 1 684 | 685 | 686 | res\drawable-small 687 | 1 688 | 689 | 690 | 691 | 692 | res\drawable-normal 693 | 1 694 | 695 | 696 | res\drawable-normal 697 | 1 698 | 699 | 700 | 701 | 702 | res\drawable-large 703 | 1 704 | 705 | 706 | res\drawable-large 707 | 1 708 | 709 | 710 | 711 | 712 | res\drawable-xlarge 713 | 1 714 | 715 | 716 | res\drawable-xlarge 717 | 1 718 | 719 | 720 | 721 | 722 | res\values 723 | 1 724 | 725 | 726 | res\values 727 | 1 728 | 729 | 730 | 731 | 732 | 0 733 | 734 | 735 | 0 736 | 737 | 738 | 739 | 740 | 1 741 | 742 | 743 | 1 744 | 745 | 746 | 747 | 748 | library\lib\armeabi-v7a 749 | 1 750 | 751 | 752 | library\lib\arm64-v8a 753 | 1 754 | 755 | 756 | 757 | 758 | library\lib\armeabi-v7a 759 | 1 760 | 761 | 762 | 763 | 764 | 765 | 766 | True 767 | True 768 | False 769 | False 770 | False 771 | 772 | 773 | 12 774 | 775 | 776 | 777 | 778 |
779 | -------------------------------------------------------------------------------- /FixAndroidLogger.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/FixAndroidLogger.res -------------------------------------------------------------------------------- /FixAndroudLoggerDemoImpl.LgXhdpiPh.fmx: -------------------------------------------------------------------------------- 1 | inherited frmLogDemo_LgXhdpiPh: TfrmLogDemo_LgXhdpiPh 2 | ClientHeight = 695 3 | ClientWidth = 450 4 | DesignerMasterStyle = 0 5 | inherited Panel1: TPanel 6 | Size.Width = 450.000000000000000000 7 | inherited btnSendToLog: TButton 8 | Size.Width = 145.000000000000000000 9 | end 10 | inherited Panel4: TPanel 11 | Size.Width = 450.000000000000000000 12 | inherited edLog: TEdit 13 | Size.Width = 450.000000000000000000 14 | Size.Height = 54.000000000000000000 15 | end 16 | inherited Label1: TLabel 17 | Size.Width = 450.000000000000000000 18 | end 19 | end 20 | end 21 | inherited Panel2: TPanel 22 | Size.Width = 450.000000000000000000 23 | inherited edTagName: TEdit 24 | Size.Width = 450.000000000000000000 25 | end 26 | inherited Label2: TLabel 27 | Size.Width = 450.000000000000000000 28 | end 29 | end 30 | inherited Panel3: TPanel 31 | Size.Width = 450.000000000000000000 32 | inherited Panel5: TPanel 33 | Size.Width = 450.000000000000000000 34 | inherited Label3: TLabel 35 | Size.Width = 450.000000000000000000 36 | end 37 | inherited edPriorityTag: TEdit 38 | Size.Width = 450.000000000000000000 39 | end 40 | inherited Panel6: TPanel 41 | Size.Width = 450.000000000000000000 42 | inherited rbDebug: TRadioButton 43 | Position.X = 232.000000000000000000 44 | Position.Y = 34.000000000000000000 45 | end 46 | inherited rbError: TRadioButton 47 | Position.X = 232.000000000000000000 48 | Position.Y = 58.000000000000000000 49 | end 50 | inherited rbVerbose: TRadioButton 51 | Position.X = 128.000000000000000000 52 | Position.Y = 58.000000000000000000 53 | end 54 | inherited rbInfo: TRadioButton 55 | Position.X = 128.000000000000000000 56 | Position.Y = 34.000000000000000000 57 | end 58 | end 59 | end 60 | end 61 | end 62 | -------------------------------------------------------------------------------- /FixAndroudLoggerDemoImpl.fmx: -------------------------------------------------------------------------------- 1 | object frmLogDemo: TfrmLogDemo 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form4' 5 | ClientHeight = 480 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | OnDestroy = FormDestroy 12 | DesignerMasterStyle = 3 13 | object Panel1: TPanel 14 | Align = Top 15 | Size.Width = 640.000000000000000000 16 | Size.Height = 153.000000000000000000 17 | Size.PlatformDefault = False 18 | TabOrder = 2 19 | object btnSendToLog: TButton 20 | Position.Y = 85.000000000000000000 21 | Size.Width = 113.000000000000000000 22 | Size.Height = 44.000000000000000000 23 | Size.PlatformDefault = False 24 | TabOrder = 0 25 | Text = 'Send To Log' 26 | OnClick = btnSendToLogClick 27 | end 28 | object Panel4: TPanel 29 | Align = Top 30 | Size.Width = 640.000000000000000000 31 | Size.Height = 77.000000000000000000 32 | Size.PlatformDefault = False 33 | TabOrder = 2 34 | object edLog: TEdit 35 | Touch.InteractiveGestures = [LongTap, DoubleTap] 36 | Align = Client 37 | TabOrder = 1 38 | Text = 'This is a log message' 39 | Size.Width = 640.000000000000000000 40 | Size.Height = 32.000000000000000000 41 | Size.PlatformDefault = False 42 | end 43 | object Label1: TLabel 44 | Align = Top 45 | Size.Width = 640.000000000000000000 46 | Size.Height = 23.000000000000000000 47 | Size.PlatformDefault = False 48 | Text = 'Log message' 49 | TabOrder = 2 50 | end 51 | end 52 | end 53 | object Panel2: TPanel 54 | Align = Top 55 | Position.Y = 153.000000000000000000 56 | Size.Width = 640.000000000000000000 57 | Size.Height = 120.000000000000000000 58 | Size.PlatformDefault = False 59 | TabOrder = 0 60 | object btnChangeTag: TButton 61 | Position.Y = 55.000000000000000000 62 | Size.Width = 113.000000000000000000 63 | Size.Height = 44.000000000000000000 64 | Size.PlatformDefault = False 65 | TabOrder = 1 66 | Text = 'Change Tag' 67 | OnClick = btnChangeTagClick 68 | end 69 | object edTagName: TEdit 70 | Touch.InteractiveGestures = [LongTap, DoubleTap] 71 | Align = Top 72 | TabOrder = 2 73 | Text = 'MyDelphiApp' 74 | Position.Y = 23.000000000000000000 75 | Size.Width = 640.000000000000000000 76 | Size.Height = 32.000000000000000000 77 | Size.PlatformDefault = False 78 | end 79 | object Label2: TLabel 80 | Align = Top 81 | Size.Width = 640.000000000000000000 82 | Size.Height = 23.000000000000000000 83 | Size.PlatformDefault = False 84 | Text = 'Tag Name' 85 | TabOrder = 4 86 | end 87 | end 88 | object Panel3: TPanel 89 | Align = Top 90 | Position.Y = 273.000000000000000000 91 | Size.Width = 640.000000000000000000 92 | Size.Height = 144.000000000000000000 93 | Size.PlatformDefault = False 94 | TabOrder = 1 95 | object Panel5: TPanel 96 | Align = Top 97 | Size.Width = 640.000000000000000000 98 | Size.Height = 49.000000000000000000 99 | Size.PlatformDefault = False 100 | TabOrder = 3 101 | object Label3: TLabel 102 | Align = Top 103 | Size.Width = 640.000000000000000000 104 | Size.Height = 23.000000000000000000 105 | Size.PlatformDefault = False 106 | Text = 'Log message' 107 | TabOrder = 2 108 | end 109 | object edPriorityTag: TEdit 110 | Touch.InteractiveGestures = [LongTap, DoubleTap] 111 | Align = Top 112 | TabOrder = 4 113 | Text = 'This is a log message with priority' 114 | Position.Y = 23.000000000000000000 115 | Size.Width = 640.000000000000000000 116 | Size.Height = 32.000000000000000000 117 | Size.PlatformDefault = False 118 | end 119 | object Panel6: TPanel 120 | Align = Top 121 | Position.Y = 55.000000000000000000 122 | Size.Width = 640.000000000000000000 123 | Size.Height = 120.000000000000000000 124 | Size.PlatformDefault = False 125 | TabOrder = 5 126 | object btnSendToPriorityLog: TButton 127 | Position.Y = 25.000000000000000000 128 | Size.Width = 113.000000000000000000 129 | Size.Height = 44.000000000000000000 130 | Size.PlatformDefault = False 131 | TabOrder = 0 132 | Text = 'Send To Log' 133 | OnClick = btnSendToPriorityLogClick 134 | end 135 | object rbDebug: TRadioButton 136 | GroupName = 'Priority' 137 | Position.X = 274.000000000000000000 138 | Position.Y = 25.000000000000000000 139 | TabOrder = 2 140 | Text = 'Debug' 141 | end 142 | object rbError: TRadioButton 143 | GroupName = 'Priority' 144 | IsChecked = True 145 | Position.X = 274.000000000000000000 146 | Position.Y = 73.000000000000000000 147 | TabOrder = 1 148 | Text = 'Error' 149 | end 150 | object rbVerbose: TRadioButton 151 | GroupName = 'Priority' 152 | Position.X = 146.000000000000000000 153 | Position.Y = 73.000000000000000000 154 | TabOrder = 4 155 | Text = 'Verbose' 156 | end 157 | object rbInfo: TRadioButton 158 | GroupName = 'Priority' 159 | Position.X = 146.000000000000000000 160 | Position.Y = 25.000000000000000000 161 | TabOrder = 5 162 | Text = 'Info' 163 | end 164 | end 165 | end 166 | end 167 | end 168 | -------------------------------------------------------------------------------- /FixAndroudLoggerDemoImpl.pas: -------------------------------------------------------------------------------- 1 | unit FixAndroudLoggerDemoImpl; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 8 | FMX.Controls.Presentation, FMX.Edit; 9 | 10 | type 11 | TfrmLogDemo = class(TForm) 12 | edLog: TEdit; 13 | btnSendToLog: TButton; 14 | Panel1: TPanel; 15 | Panel2: TPanel; 16 | btnChangeTag: TButton; 17 | edTagName: TEdit; 18 | Panel3: TPanel; 19 | edPriorityTag: TEdit; 20 | Panel4: TPanel; 21 | Label1: TLabel; 22 | Label2: TLabel; 23 | Label3: TLabel; 24 | Panel5: TPanel; 25 | Panel6: TPanel; 26 | btnSendToPriorityLog: TButton; 27 | rbDebug: TRadioButton; 28 | rbError: TRadioButton; 29 | rbVerbose: TRadioButton; 30 | rbInfo: TRadioButton; 31 | procedure btnSendToLogClick(Sender: TObject); 32 | procedure btnChangeTagClick(Sender: TObject); 33 | procedure btnSendToPriorityLogClick(Sender: TObject); 34 | procedure FormCreate(Sender: TObject); 35 | procedure FormDestroy(Sender: TObject); 36 | private 37 | { Private declarations } 38 | procedure Log(const AMsg: string); 39 | public 40 | { Public declarations } 41 | end; 42 | 43 | var 44 | frmLogDemo: TfrmLogDemo; 45 | 46 | implementation 47 | uses 48 | FMX.Platform, FMX.Platform.Logger.Android.Fix; 49 | 50 | {$R *.fmx} 51 | 52 | procedure TfrmLogDemo.btnChangeTagClick(Sender: TObject); 53 | var 54 | LChangeTagService: IFMXChangeTag; 55 | begin 56 | if TPlatformServices.Current.SupportsPlatformService(IFMXChangeTag, 57 | LChangeTagService) then 58 | begin 59 | LChangeTagService.Tag := edTagName.Text; 60 | end; 61 | end; 62 | 63 | procedure TfrmLogDemo.btnSendToLogClick(Sender: TObject); 64 | var 65 | LLogService: IFMXLoggingService; 66 | begin 67 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, 68 | LLogService) then 69 | begin 70 | LLogService.Log(edLog.Text, []); 71 | end; 72 | end; 73 | 74 | procedure TfrmLogDemo.btnSendToPriorityLogClick(Sender: TObject); 75 | var 76 | LLogService: IFMXLoggingService; 77 | LLogPriority: IFMXTagPriority; 78 | begin 79 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, 80 | LLogService) then 81 | begin 82 | LLogPriority := LLogService as IFMXTagPriority; 83 | 84 | // use the default tags established 85 | 86 | if rbDebug.IsChecked then 87 | LLogPriority.d(edPriorityTag.Text) else 88 | if rbError.IsChecked then 89 | LLogPriority.e(edPriorityTag.Text) else 90 | if rbInfo.IsChecked then 91 | LLogPriority.i(edPriorityTag.Text) else 92 | if rbVerbose.IsChecked then 93 | LLogPriority.v(edPriorityTag.Text); 94 | end; 95 | end; 96 | 97 | procedure TfrmLogDemo.FormCreate(Sender: TObject); 98 | begin 99 | Log('Application started.'); 100 | end; 101 | 102 | procedure TfrmLogDemo.FormDestroy(Sender: TObject); 103 | begin 104 | Log('Shutting down application.'); 105 | end; 106 | 107 | procedure TfrmLogDemo.Log(const AMsg: string); 108 | var 109 | LLogService: IFMXLoggingService; 110 | begin 111 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, 112 | LLogService) then 113 | begin 114 | LLogService.Log(AMsg, []); 115 | end; 116 | end; 117 | 118 | end. 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FixAndroidLogger 2 | 3 | This app shows how using the FMX.Platform.Logger.Android.Fix unit, you can change the tag used by FireMonkey so that you can use adb logcat to properly filter your logs for debugging. 4 | 5 | In order to use it, all you have to do is include the FMX.Platform.Logger.Android.Fix unit in your project file. 6 | 7 | # Quick steps to use it 8 | - Include or add FMX.Platform.Logger.Android.Fix in your project file. 9 | - Include FMX.Platform.Logger.Android.Fix in the uses clause. 10 | - Include the following code in when logging: 11 | 12 | ```Delphi 13 | var LLogService: IFMXLoggingService; 14 | var LLogPriority: IFMXTagPriority; 15 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogService) and 16 | Supports(LLogService, IFMXTagPriority, LLogPriority) then 17 | begin 18 | LLogPriority.i('TagName', 'LogMessage'); 19 | end; 20 | ``` 21 | 22 | adb logcat -s TagName:* 23 | 24 | # Demo 25 | 26 | See the code in ![FixAndroudLoggerDemoImpl.pas](../master/FixAndroudLoggerDemoImpl.pas) for how to use it. 27 | 28 | ![FMX app](../master/images/ChangeTag2.png) 29 | ![Console](../master/images/console2.png) 30 | 31 | Once you have clicked on the Change Tag button, all your logs will be tagged with that name. 32 | 33 | ![Demo](../master/images/AndroidLogViewer.gif) 34 | 35 | You can also have priority tags as well, so your tags can have debug, error, info or verbose priority. 36 | 37 | To filter the tags using adb logcat, simply use the command 38 | ``` 39 | adb logcat -s MyAppName 40 | ``` 41 | 42 | where MyAppName is the tag name you have chosen to use. 43 | 44 | Hope this helps with your debugging. 45 | 46 | Enjoy, 47 | Chee-Wee Chua, 48 | Singapore. 49 | -------------------------------------------------------------------------------- /images/AndroidLogViewer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/AndroidLogViewer.gif -------------------------------------------------------------------------------- /images/ChangeTag2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/ChangeTag2.png -------------------------------------------------------------------------------- /images/console2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/console2.png -------------------------------------------------------------------------------- /images/log-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/log-1.png --------------------------------------------------------------------------------