Open bogomolov-a-a opened 3 years ago
Hello, bogomolov-a-a!
Welcome!!!
1) If these additions don't break previous projects....... 2) and new projects continue to be done transparently from the perspective of other developers....
Then, please, make a ""pull-request" (or send me by e-mail your modified units: jmpessoa@hotmail.com) I will commit your code!!!!
Thank you!!!
PS. happy to know that you are a java developer, we still have a lot to do!
Hello, I think about it. I fork your repository and start to develop.
I want add java comment preprocessor in code, because by default code Controls.java contains a lot of unused methods and lint says about it. Any components( as Vibrator, Telephone... and e.t.c. ) need for them permissions, in androidManifest.xml. I know that Pascal don't include code of methods if it(method) don't really invoked from another code. In java code unused methods in result object file included( may be use jlink, but in android development.
My improvents aim to increase code quality(for example, lint on), and decrease unused method in result java code). I don't change the component code. Only build infrastructure code.
Thank you, for your answer.
@jmpessoa pull request marked as DRAFT, https://github.com/jmpessoa/lazandroidmodulewizard/pull/392, Please revert it. I remove draft, when i finished. I am beginner in github and open source, in my work DRAFT pullrequests don't merged( we use gitlab as scm). I don't knew about it( that pull request be merged at once).
Do we need revert it?
If any part of the code is not good you can make a new one "pull-request" ... or not?
Yes, but I think, 'master' branch used by developers for it projects. But I don't fully tested and... I don't sure that this part dont
If these additions don't break previous projects.......
I was sure that DRAFT pull request don't allow to merge. I start to implement my first post in this issue. If you don't use master as last version for user distributed, then all good, and I add new pull request, when I finished this feature pack.
About " I don't sure that this part dont...... break previous projects......."
I am doing some tests.... soon we will know...
Fatal: FAILURE: Build failed with an exception.
This project uses AndroidX dependencies, but the 'android.useAndroidX' property is not enabled. Set this property to true in the gradle.properties file and retry.
After editing project "gradle.properties" android.useAndroidX=true
I got:
ERROR: This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 4.1 or newer.
I am testing using demo app "AppCompatBottomNavigationDemo1" ....
And Using LAMW:
Building APK (Gradle)... : FAILURE: Build failed with an exception., Errors: 1
Fatal: FAILURE: Build failed with an exception.
Lint found errors in the project; aborting build. Fix the issues identified by lint, or add the following to your build script to proceed with errors: ... android { lintOptions { abortOnError false } } ... The first 3 errors (out of 52) were: C:\android\workspace\AppCompatBottomNavigationDemo1\src\org\lamw\appcompatbottomnavigationdemo1\Controls.java:1321: Error: Missing permissions required by TelephonyManager.getDeviceId: android.permission.READ_PRIVILEGED_PHONE_STATE [MissingPermission] devid = telephony.getDeviceId();
C:\android\workspace\AppCompatBottomNavigationDemo1\src\org\lamw\appcompatbottomnavigationdemo1\Controls.java:1967: Error: Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault(). [DefaultLocale] r = strIp.toUpperCase();
C:\android\workspace\AppCompatBottomNavigationDemo1\src\org\lamw\appcompatbottomnavigationdemo1\Controls.java:1969: Error: Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault(). [DefaultLocale] r = strIp.substring(0, delim).toUpperCase();
Ok.
My tests: we have many task to make changes compatible with "old" projects !
So, I do a revert "by hand".....
Ok, I say about it.
About permissions: It is excepted behavior, I want add java comment preprocessor for logical exclude unused methods in Controls.java.
I continue develop, code refactoring and testing in my branch migration on new version android gradle plugin with backward compatibility with old projects.
About "I want add java comment preprocessor for logical exclude unused methods in Controls"
Well, what we can see is that the simple use of "AppCompat/Material" framework [androidX] makes a simple "Hello World" application jump from 1.22 MB to 16.67 MB after installed !!!
So, why we need optimize [preprocessor] "Controls.java" ?
I always wanted a clean up in "Controls.java" leaving it just like a simple wrapper to "jForm" class ....
But, Let's go ahead!
Thank you!
R8 must be resolve apk size problem(in release build).
About Controls.java...
It is .... complicated.) If don't refactor this file, need include preprocessor, because in debug build all methods( unused, for example) will be included.
About build process: now in android world is popular gradle wrapper, end user must be download with special java file download his copy of gradle( ant don't actually now). I want add it in wizard.
I have question:
GDX, GUI - does use only these application type android manifest xml file? console, general lib and no gui - what this application type included?
For app build in test env(instead of manually testing):
https://github.com/bogomolov-a-a/free-pascal-trunk-docker - may be build application in github action in docker? Result - so lib, and then ./gradlew clean
Please, disregard GDX.... that is just "concept proof" .... So, it's still far from being anything useful!
Yes! my favorite solution is refactor "Controls.java"! but before that we still have a lot of "missing" features in LAMW. For example: the "missing" firebase push notification it's too bad in LAMW and the component "jBluetoothLowEnergy", is incomplete....
PS. 1) before I forget: we cannot overshadow/obfuscate java code in LAMW (the JNI requires full access to methods signature)
2)The Lazarus users have few skills with things like "gradle" :)
option -keep JNI methods in java classes save full name class,method and it signature(public api) Pascal developers will be have this wrapper as "black box" in command file gradle-local-build.bat and etc. Command change only for them.
I start refactor many AndroidManifest.txt and buildgradle.txt files, resources, java sources and others.) I build special class for it. And for ant task(deprecated), and gradle(modern) file builder by module type. GDX, GUI, NOGUI,CONSOLE, LIB. Enum for these values. Sorry for my English. I'm from Russia.
Trying to help: I do a clean up in "build.gradle" code construction and update.....
New Project: "GetWorkSpaceFromForm" in "AndroidWizard_intf.pas"
(Re)Open Project: "KeepBuildUpdated" in "SmartDesigner.pas"
English: mine is not good either (Brasil) !!! :) Russia: maybe you can find a great LAMW contributor/author out there in Moscow! :) (see "readme.md")!
I'm from Saint Petersburg. Ok.
New Project: "GetWorkSpaceFromForm" in "AndroidWizard_intf.pas"
(Re)Open Project: "KeepBuildUpdated" in "SmartDesigner.pas"
Yes, I found it, but I didn't understand first, how it works. Many types of projects and longest method code do it complicated for read. Thank you for explanations!
"Many types of projects and longest method code do it complicated for read"
Sorry..... [ little free time and a lot of desire to get results!! ;) ]
Now, I will try refactor "Controls.java" !!!!
Task 1: split out "jForm" in a new file/class "jForm.java"!
Task 2: refactor "jForm.java" (maybe split out somethings like "jSysUtils.pas" ??)
Hi, yes, utils code may be better extracted to jSysUtils.java or AndroidBridgesCommon and write separated module with this native methods.
In Java better one class - one file. In Kotlin that seem to be Pascal( top level function, type aliases and others) can be one more classe in one file, as in Pascal code. Kotlin is popular in android development but... ) We have our Pascal with type aliases and top level functions.
I have an quetion:
if not FileExists(IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath) +
'LAMW.ini') then
begin
if FileExists(IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath) +
'JNIAndroidProject.ini') then
begin
FIniFileName := 'LAMW.ini';
FIniFileSection := 'NewProject';
CopyFile(IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath) +
'JNIAndroidProject.ini',
IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath) +
'LAMW.ini');
//DeleteFile(IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath) + 'JNIAndroidProject.ini');
FPathToJavaTemplates := DoNewPathToJavaTemplate();
FPathToSmartDesigner := GetPathToSmartDesigner();
flag := True;
end;
end;
I see one LAMW.ini in lazarus setting directory and don't see in project directory. Why all projects have one setting file?
May be need add setting file into project directory? Separated NDK, separated SDK? One code in java and pascal but conditional for ndk\sdk version?
FBuildSystem - Ant\Gradle, - this is build system(may be replace Ant to Maven, as "modern" then Ant build system? FProjectModel - Ant\Eclipse - may be ide presets? Ant - build system, Eclipse - Java( C++) IDE.
I thnk that ide preset is mindless, because if developer wants add code into project -> notepad ++ or he don't use LAMW and write code on Kotlin instead of.
HI, @jmpessoa. And what does module lamwDesigner.pas? TAndroidWidgetMediator class. Component in pallete register, alright?
Hi!
1) The LAMW.ini store the general config stuff [JDK, SDK,NDK, Gradle, Ant,,,, ] by LAMW form "Paths/Settings" 2) Specifics configs is stored in "*.lpi" file by project.... 3) The "lamwDesigner.pas" unit is the interface to the GUI LAMW form designer.... 4) Today FProjectModel inform only if we are making a new project or replacing a existing [old] project (in the old days: "eclipse" == a project created by eclipse....) 5) about: "I think that ide preset is mindless...." Well, today you can open/change/run/sign LAMW GUI project using Android Studio...
Thank you.
5 I don't work in Android Studio, if I pascal developer.))
4 I.e. this is marker field?
2 AProject.CustomData.Values['LAMW'] := 'GDX'; - for example, alright?
5) Can we edit/change/improve LAMW java code others Editors with some help and facilities? 4) I will update it meaning and remove the word "eclipse"! 6) Yes! and all CustomData values!
reopened!
5 - yes, I create super project with all exists java sources and start refactor it. But very complicated it and I don't process it. When I will know about this code greater then now, and my action doesn't fail all builds, I cleaned up java code, reformat with code style and others. You can use Intellj Idea for this. 6(4) OK 7(2) Thank you!
For eliminate "paths" options i want locate all development kits into user home path.
Work in progress:
project information wiil be saved as text parameter in project descriptor. main project form wiil be redesigned in tabs(specified for project types).
{About semantic versioning at https://semver.org/ }
{ TSemanticVersion }
TSemanticVersion = class(TPersistent)
strict private
FMajor: word;
FMinor: word;
FPath: word;
FRevision: string;
strict private
const
PRINTABLE_FORMAT: string = '%d.%d.%d';
public
function ToString: ansistring; override;
published
property Major: word read FMajor write FMajor;
property Minor: word read FMinor write FMinor;
property Path: word read FPath write FPath;
property Revision: string read FRevision write FRevision;
end;
{ Build system plugin maven coordinate}
TPluginCoordinates = class(TPersistent)
strict private
{groupId}
FGroupId: string;
{artifactId}
FArtifactId: string;
strict private
const
PRINTABLE_FORMAT: string = '%s:%s';
public
function ToString: ansistring; override;
published
property GroupId: string read FGroupId write FGroupId;
property ArtifactId: string read FArtifactId write FArtifactId;
end;
{Full plugin coordinate with version}
{ TPluginInformation }
TPluginInformation = class(TPersistent)
strict private
FCoordinates: TPluginCoordinates;
FVersion: TSemanticVersion;
strict private
const
PRINTABLE_FORMAT: string = '%s:%s';
public
constructor Create;
destructor Destroy; override;
function ToString: ansistring; override;
published
property Coordinates: TPluginCoordinates read FCoordinates write FCoordinates;
property Version: TSemanticVersion read FVersion write FVersion;
end;
{Build system information using for project}
{ TBuildSystemInformation }
TBuildSystemInformation = class(TPersistent)
strict private
{build system version}
FVersion: TSemanticVersion;
{build system type}
FBSType: TBuildSystemType;
{If use plugin required, fill this property instead of @link(PathToTool)}
FPluginInformation: TPluginInformation;
{Path to build tool (f.e. ant, predefined version of gradle, maven). Don't use it in new projects! @deprecated }
FPathToTool: string;
procedure SetPluginInformation(AValue: TPluginInformation);
public
constructor Create;
destructor Destroy; override;
published
property Version: TSemanticVersion read FVersion write FVersion;
property BSType: TBuildSystemType read FBSType write FBSType;
property PluginInformation: TPluginInformation
read FPluginInformation write SetPluginInformation;
property PathToTool: string read FPathToTool write FPathToTool;
end;
{Android manifest API version information}
TApiInformation = class(TPersistent)
strict private
FMinApiVersion: word;
FTargetApiVersion: word;
FCompileApiVersion: word;
published
property MinApiVersion: word read FMinApiVersion write FMinApiVersion;
property TargetApiVersion: word read FTargetApiVersion write FTargetApiVersion;
property CompileApiVersion: word read FCompileApiVersion write FCompileApiVersion;
end;
{Information about main package,basic theme}
{ TGeneratedSourceInformation }
TGeneratedSourceInformation = class(TPersistent)
strict private
{Main package name, with app class,used as applicationId in build files }
FPackageName: string;
{Main app theme, f.e. NoActionBar}
FThemeName: string;
{If ThemeName contains 'AppCompat'}
FIsAppCompat: boolean;
function GetIsAppCompat: boolean;
published
property PackageName: string read FPackageName write FPackageName;
property ThemeName: string read FThemeName write FThemeName;
property IsAppCompat: boolean read GetIsAppCompat write FIsAppCompat;
end;
{Architecture cross-compiler, for example arm, instruction set optional}
TCompilerArchitecture = class(TPersistent)
strict private
{by default 'ArmV6'}FInstructionSet: string;
{by default 'Soft'}FFPUSet: string;
published
property InstructionSet: string read FInstructionSet write FInstructionSet;
property FPUSet: string read FFPUSet write FFPUSet;
end;
TDevelepmentKitInformation = class(TPersistent)
strict private
{path on user device with development kit}
FPathToDevelopmentKit: string;
{download url for specified version from internet}
FDownloadUrl: string;
published
property PathToPathToDevelopmentKit: string
read FPathToDevelopmentKit write FPathToDevelopmentKit;
property DownloadLink: string read FDownloadUrl write FDownloadUrl;
end;
{Using NDK for JNI project build}
{ TNdkInformation }
TNdkInformation = class(TDevelepmentKitInformation)
strict private
{version, for example 11+}
FVersion: TSemanticVersion;
{version name, for example r10e}
FNdkVersionName: string;
public
constructor Create;
destructor Destroy; override;
published
property Version: TSemanticVersion read FVersion write FVersion;
property NdkVersionName: string read FNdkVersionName write FNdkVersionName;
end;
{Used Android SDK project information}
TSdkInformation = class(TDevelepmentKitInformation)
strict private
{Number of platform version of Android SDK, for example '29'}
FBuildToolsVersionPlatform: word;
{Full version of Android SDK, for example '29.0.3'}
FBuildToolsVersionName: string;
{path on user device with sdk}
published
property BuildToolsVersionPlatform: word
read FBuildToolsVersionPlatform write FBuildToolsVersionPlatform;
property BuildToolsVersionName: string read FBuildToolsVersionName
write FBuildToolsVersionName;
end;
{Information about used JDK}
{ TJdkInformation }
TJdkInformation = class(TPersistent)
strict private
{jdk version for source and target compatibility}
FVersion: TSemanticVersion;
public
constructor Create;
destructor Destroy; override;
published
property Version: TSemanticVersion read FVersion write FVersion;
end;
{Dimension application.
You can use it for separate application code by device architecture, screen resolution,
free and payed version and others...}
TDimension = class(TPersistent)
strict private
{dimension name, f.e. 'version' for demo,free,payed version}
FName: string;
published
property Name: string read FName write FName;
end;
TDimensionList = specialize TList<TDimension>;
{Product flavor can used for separate application code by device architecture, screen resolution,
free and payed version and others. For each flavor must be specified his dimension.}
TProductFlavor = class(TPersistent)
strict private
{Flavor name}
FName: string;
{Relative dimension name}
FDimensionName: string;
{applicationId suffix}
FApplicationIdSuffix: string;
{version name suffix}
FVersionNameSuffix: string;
published
property Name: string read FName write FName;
property DimensionName: string read FDimensionName write FDimensionName;
property ApplicationIdSuffix: string read FApplicationIdSuffix
write FApplicationIdSuffix;
property VersionNameSuffix: string read FVersionNameSuffix write FVersionNameSuffix;
end;
TProductFlavorList = specialize TList<TProductFlavor>;
{Application build type (f.e. debug,release... )}
TBuildType = class(TPersistent)
strict private
FName: string;
published
property Name: string read FName write FName;
end;
TBuildTypeList = specialize TList<TBuildType>;
TBuildMode = class(TPersistent)
strict private
FProductFlavorName: string;
FBuildTypeName: string;
published
property ProductFlavorName: string read FProductFlavorName write FProductFlavorName;
property BuildTypeName: string read FBuildTypeName write FBuildTypeName;
end;
TBuildModeList = specialize TList<TBuildMode>;
{ TProjectInformation }
TProjectInformation = class(TPersistent)
strict private
// project info
FName: string;
FProjectPath: string;
FVersion: TSemanticVersion;
FVersionName: string;
FSyntaxMode: TSyntaxMode;
FModuleType: TModuleType;
//compiler info
FCompilerArchitecture: TCompilerArchitecture;
//build system info
FBuildSystemInformation: TBuildSystemInformation;
//java code information
FGeneratedSourceInformation: TGeneratedSourceInformation;
// api versions
FApiInformation: TApiInformation;
// build types and flavors
FProductFlavors: TProductFlavorList;
FBuildTypes: TBuildTypeList;
FBuildModes: TBuildModeList;
// development kit informations
FJdkInformation: TJdkInformation;
FNdkInformation: TNdkInformation;
FSdkInformation: TSdkInformation;
public
constructor Create;
destructor Destroy; override;
function ToJsonString(): string;
class function FromJsonString(Data: string): TProjectInformation;
published
property Name: string read FName write FName;
property ProjectPath: string read FProjectPath write FProjectPath;
property Version: TSemanticVersion read FVersion write FVersion;
property VersionName: string read FVersionName write FVersionName;
property SyntaxMode: TSyntaxMode read FSyntaxMode write FSyntaxMode;
property ModuleType: TModuleType read FModuleType write FModuleType;
//compiler info
property CompilerArchitecture: TCompilerArchitecture
read FCompilerArchitecture write FCompilerArchitecture;
//build system info
property BuildSystemInformation: TBuildSystemInformation
read FBuildSystemInformation write FBuildSystemInformation;
//java code information
property GeneratedSourceInformation: TGeneratedSourceInformation
read FGeneratedSourceInformation write FGeneratedSourceInformation;
// api versions
property ApiInformation: TApiInformation read FApiInformation write FApiInformation;
// build types and flavors
property ProductFlavors: TProductFlavorList read FProductFlavors;
property BuildTypes: TBuildTypeList read FBuildTypes;
property BuildModes: TBuildModeList read FBuildModes;
// development kit informations
property JdkInformation: TJdkInformation read FJdkInformation write FJdkInformation;
property NdkInformation: TNdkInformation read FNdkInformation write FNdkInformation;
property SdkInformation: TSdkInformation read FSdkInformation write FSdkInformation;
end;
BuildMode - this is lazarus build mode, for gradle clean build
{$ifdef buildMode='payed'}
procedure payedProcedure();
{$endif}
and in java code will be added specified source set.
1) Great work!
2) About "BuildMode"
You are talking about Project folder ".....\jni\build-modes" config files??
If yes, we need to keep them "up to date" ... ----> UpdateBuildModes() in "SmartDesigner.pas"
So, user can select others builds (chipset, gradle/ant) ::: menu "Project" --> "Projec Options" --> "[LAMW] ...." ---> "Build"
About " I want add custom build modes in project (for jni project)"
Where? In "*.lpi" ?
[ we need to keep them "up to date" ... according to the user's system configuration .....]
Yes, in 'lpi', or in project configuration They stored in 'lpi'?
Or in lps? How to create them automatically?
".lps" is very "dirty/messy"... in general it should be deleted when we send a project to another user..... [maybe can "clean up" it ..... before send a project to another user..... ]
Today the build-modes are created in "DoInitDescriptor" for each project type .... in "AndroidWizard_intf.pas" and uptaded in UpdateBuildModes() in "SmartDesigner.pas" when the project is re-opened ....
Maybe you can re-use "........\jni\build-modes\" files and handle gradle config separately in another place.....
Thank you!
<BuildModes Count="3">
<Item1 Name="Default" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="..\libs\armeabi-v7a\libcontrols"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<Libraries Value="C:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\platforms\android-22\arch-arm\usr\lib\;C:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9\"/>
<UnitOutputDirectory Value="..\obj\controls"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<SyntaxMode Value="Delphi"/>
<IncludeAssertionCode Value="True"/>
<CStyleMacros Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<VerifyObjMethodCallValidity Value="True"/>
<TargetCPU Value="arm"/>
<TargetOS Value="android"/>
<SmallerCode Value="True"/>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
<UseHeaptrc Value="True"/>
<TrashVariables Value="True"/>
<StripSymbols Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
<Other>
<CustomOptions Value="-Xd -CfSoft -CpARMV7A -XParm-linux-androideabi- -FDC:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin"/>
</Other>
</CompilerOptions>
</Item2>
<Item3 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="..\libs\armeabi-v7a\libcontrols"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<Libraries Value="C:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\platforms\android-22\arch-arm\usr\lib\;C:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9\"/>
<UnitOutputDirectory Value="..\obj\controls"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<SyntaxMode Value="Delphi"/>
<CStyleMacros Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<TargetCPU Value="arm"/>
<TargetOS Value="android"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
<SmallerCode Value="True"/>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<StripSymbols Value="True"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<ExecutableType Value="Library"/>
</Options>
</Linking>
<Other>
<CustomOptions Value="-Xd -CfSoft -CpARMV7A -XParm-linux-androideabi- -FDC:\Users\artem.bogomolov.a\develop\instruments\AndroidSDK\ndk\android-ndk-r21e\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin"/>
</Other>
</CompilerOptions>
</Item3>
</BuildModes>
I about it.
They stored in 'lpi' file, and can be migrate from user to user. Directories set from my device.
Yes, the default "buid-mode" is stored in ".lpi" and the optional are stored in ".....\jni\buide-modes" folder
User can select others builds (chipset, gradle/ant)
by Lazarus menu "Project" --> "Projec Options" --> "[LAMW] ...." ---> "Build"
Feature request: add improvents for build.gradle
Body: For increase code quality I want add in lintOptions follow code( in AndroidWizard_intf.pas and smartdesigner.pas module):
For use modern java version(for android build): //use java 8 for compilation
for build with code and resource shrinking:
For add product flavour(may be different resource uses in code):
I want add in gradle properties:
This code added in method 'function TAndroidProjectDescriptor.GetWorkSpaceFromForm(projectType: integer; out outTag: integer): boolean;' in module 'AndroidWizard_intf.pas'
I am java developer and I want help to enhance this project because I compelled my pet project on slow machines (I can't use Intellij idea or Android Studio).
Can I push my changes in separate branch in this repository or I must create fork?