382 lines
8.0 KiB
Bash
Executable File
382 lines
8.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
if [ "$#" -ne 2 ]; then
|
|
echo "USAGE: $0 APP_NAME DESCRIPTION"
|
|
exit 1
|
|
fi
|
|
|
|
PROJECT_HOME=~/AndroidStudioProjects
|
|
ORG_PATH="$PROJECT_HOME/defaultOrg"
|
|
KEY_PROPERTIES_PATH="$PROJECT_HOME/defaultKeyProperties"
|
|
|
|
appName="$1"
|
|
packageName=`echo "$appName" | tr '[:upper:]' '[:lower:]'`
|
|
description="$2"
|
|
|
|
echo "App Name: $appName"
|
|
echo "Package Name: $packageName"
|
|
echo "Description: $description"
|
|
|
|
|
|
if [[ -f "$ORG_PATH" ]]; then
|
|
org=`cat "$PROJECT_HOME/defaultOrg"`
|
|
else
|
|
echo "Could not find file with default org in $ORG_PATH"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f "$KEY_PROPERTIES_PATH" ]]; then
|
|
keyProperties=`cat "$PROJECT_HOME/defaultKeyProperties"`
|
|
else
|
|
echo "Could not find file with default key properties in $KEY_PROPERTIES_PATH"
|
|
exit 1
|
|
fi
|
|
|
|
flutter create --android-language java --org "$org" "$packageName" || exit 1
|
|
|
|
cd "$packageName"
|
|
|
|
#########################
|
|
#### create .gitignore ##
|
|
#########################
|
|
|
|
cat > .gitignore <<EOF
|
|
# Miscellaneous
|
|
*.class
|
|
*.log
|
|
*.pyc
|
|
*.swp
|
|
.DS_Store
|
|
.atom/
|
|
.buildlog/
|
|
.history
|
|
.svn/
|
|
|
|
# IntelliJ related
|
|
*.iml
|
|
*.ipr
|
|
*.iws
|
|
.idea/
|
|
|
|
# The .vscode folder contains launch configuration and tasks you configure in
|
|
# VS Code which you may wish to be included in version control, so this line
|
|
# is commented out by default.
|
|
#.vscode/
|
|
|
|
# Flutter/Dart/Pub related
|
|
**/doc/api/
|
|
.dart_tool/
|
|
.flutter-plugins
|
|
.packages
|
|
.pub-cache/
|
|
.pub/
|
|
/build/
|
|
|
|
# Android related
|
|
**/android/**/gradle-wrapper.jar
|
|
**/android/.gradle
|
|
**/android/captures/
|
|
**/android/gradlew
|
|
**/android/gradlew.bat
|
|
**/android/local.properties
|
|
**/android/**/GeneratedPluginRegistrant.java
|
|
**/android/key.properties
|
|
|
|
# iOS/XCode related
|
|
**/ios/**/*.mode1v3
|
|
**/ios/**/*.mode2v3
|
|
**/ios/**/*.moved-aside
|
|
**/ios/**/*.pbxuser
|
|
**/ios/**/*.perspectivev3
|
|
**/ios/**/*sync/
|
|
**/ios/**/.sconsign.dblite
|
|
**/ios/**/.tags*
|
|
**/ios/**/.vagrant/
|
|
**/ios/**/DerivedData/
|
|
**/ios/**/Icon?
|
|
**/ios/**/Pods/
|
|
**/ios/**/.symlinks/
|
|
**/ios/**/profile
|
|
**/ios/**/xcuserdata
|
|
**/ios/.generated/
|
|
**/ios/Flutter/App.framework
|
|
**/ios/Flutter/Flutter.framework
|
|
**/ios/Flutter/Generated.xcconfig
|
|
**/ios/Flutter/app.flx
|
|
**/ios/Flutter/app.zip
|
|
**/ios/Flutter/flutter_assets/
|
|
**/ios/Flutter/flutter_export_environment.sh
|
|
**/ios/ServiceDefinitions.json
|
|
**/ios/Runner/GeneratedPluginRegistrant.*
|
|
|
|
# Exceptions to above rules.
|
|
!**/ios/**/default.mode1v3
|
|
!**/ios/**/default.mode2v3
|
|
!**/ios/**/default.pbxuser
|
|
!**/ios/**/default.perspectivev3
|
|
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
|
EOF
|
|
|
|
|
|
|
|
git init
|
|
|
|
##################################
|
|
## generate empty launcher icon ##
|
|
##################################
|
|
|
|
convert -size 2048x2048 xc:white LauncherIcon.png
|
|
|
|
|
|
|
|
############################
|
|
## overwrite pubspec.yaml ##
|
|
############################
|
|
|
|
cat > pubspec.yaml <<EOF
|
|
name: $packageName
|
|
description: $description
|
|
|
|
version: 1.0.0+1
|
|
|
|
environment:
|
|
sdk: ">=2.2.2 <3.0.0"
|
|
|
|
dependencies:
|
|
flutter:
|
|
sdk: flutter
|
|
intl: ^0.15.7
|
|
shared_preferences: ^0.5.4+8
|
|
cupertino_icons: ^0.1.2
|
|
|
|
dev_dependencies:
|
|
flutter_test:
|
|
sdk: flutter
|
|
flutter_launcher_icons: "^0.7.3"
|
|
|
|
flutter_icons:
|
|
image_path: "LauncherIcon.png"
|
|
android: true
|
|
ios: true
|
|
|
|
flutter:
|
|
uses-material-design: true
|
|
|
|
EOF
|
|
|
|
|
|
|
|
#########################################
|
|
## generate key.properties for signing ##
|
|
#########################################
|
|
|
|
cat > android/key.properties <<EOF
|
|
$keyProperties
|
|
EOF
|
|
|
|
|
|
############################
|
|
## overwrite build.gradle ##
|
|
############################
|
|
|
|
cat > android/app/build.gradle <<EOF
|
|
def localProperties = new Properties()
|
|
def localPropertiesFile = rootProject.file('local.properties')
|
|
if (localPropertiesFile.exists()) {
|
|
localPropertiesFile.withReader('UTF-8') { reader ->
|
|
localProperties.load(reader)
|
|
}
|
|
}
|
|
|
|
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
|
if (flutterRoot == null) {
|
|
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
|
}
|
|
|
|
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
|
if (flutterVersionCode == null) {
|
|
flutterVersionCode = '1'
|
|
}
|
|
|
|
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
|
if (flutterVersionName == null) {
|
|
flutterVersionName = '1.0'
|
|
}
|
|
|
|
apply plugin: 'com.android.application'
|
|
apply from: "\$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
|
|
|
def keystoreProperties = new Properties()
|
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
|
if (keystorePropertiesFile.exists()) {
|
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
|
}
|
|
|
|
|
|
android {
|
|
compileSdkVersion 28
|
|
|
|
lintOptions {
|
|
disable 'InvalidPackage'
|
|
}
|
|
|
|
defaultConfig {
|
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
applicationId "$org.$packageName"
|
|
minSdkVersion 16
|
|
targetSdkVersion 28
|
|
versionCode flutterVersionCode.toInteger()
|
|
versionName flutterVersionName
|
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
|
}
|
|
|
|
signingConfigs {
|
|
release {
|
|
keyAlias keystoreProperties['keyAlias']
|
|
keyPassword keystoreProperties['keyPassword']
|
|
storeFile file(keystoreProperties['storeFile'])
|
|
storePassword keystoreProperties['storePassword']
|
|
}
|
|
}
|
|
buildTypes {
|
|
release {
|
|
signingConfig signingConfigs.release
|
|
}
|
|
}
|
|
}
|
|
|
|
flutter {
|
|
source '../..'
|
|
}
|
|
|
|
dependencies {
|
|
testImplementation 'junit:junit:4.12'
|
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
|
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
|
}
|
|
|
|
EOF
|
|
|
|
#######################
|
|
## set android label ##
|
|
#######################
|
|
|
|
sed -i "s/android:label=\"$packageName\"/android:label=\"$appName\"/" android/app/src/main/AndroidManifest.xml
|
|
|
|
#####################
|
|
## empty README.md ##
|
|
#####################
|
|
cat > README.md <<EOF
|
|
# $appName
|
|
|
|
$description
|
|
|
|
EOF
|
|
|
|
|
|
#########################
|
|
## overwrite main.dart ##
|
|
#########################
|
|
cat > lib/main.dart <<EOF
|
|
import 'package:flutter/material.dart';
|
|
|
|
void main() => runApp(MyApp());
|
|
|
|
class MyApp extends StatelessWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
title: '$appName',
|
|
theme: ThemeData(
|
|
primarySwatch: Colors.blue,
|
|
),
|
|
home: MyHomePage(title: '$appName'),
|
|
);
|
|
}
|
|
}
|
|
|
|
class MyHomePage extends StatefulWidget {
|
|
MyHomePage({Key key, this.title}) : super(key: key);
|
|
final String title;
|
|
|
|
@override
|
|
_MyHomePageState createState() => _MyHomePageState();
|
|
}
|
|
|
|
class _MyHomePageState extends State<MyHomePage> {
|
|
int state = 1;
|
|
|
|
void _changeState(int s) {
|
|
setState(() {
|
|
state = s;
|
|
});
|
|
}
|
|
|
|
List<String> popupMenuItems = ["About"];
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(widget.title),
|
|
actions: <Widget>[
|
|
PopupMenuButton<String>(
|
|
onSelected: (String value) => handleClick(context, value),
|
|
itemBuilder: (BuildContext context) {
|
|
return popupMenuItems.map((String choice) {
|
|
return PopupMenuItem<String>(
|
|
value: choice,
|
|
child: Text(choice),
|
|
);
|
|
}).toList();
|
|
},
|
|
),
|
|
],
|
|
),
|
|
body: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: ListView(children: [
|
|
Text("Lorem ipsum dolor sit amet"),
|
|
]),
|
|
),
|
|
);
|
|
}
|
|
|
|
void handleClick(BuildContext context, String value) {
|
|
switch (value) {
|
|
case 'About':
|
|
showLicensePage(context: context, applicationName: widget.title);
|
|
}
|
|
}
|
|
}
|
|
EOF
|
|
|
|
|
|
#####################
|
|
## create Makefile ##
|
|
#####################
|
|
|
|
cat > Makefile <<EOF
|
|
.PHONY: clean all launcherIcon
|
|
|
|
all: launcherIcon
|
|
flutter pub get
|
|
flutter build appbundle
|
|
|
|
clean:
|
|
flutter clean
|
|
|
|
launcherIcon:
|
|
flutter pub get
|
|
flutter pub run "flutter_launcher_icons:main"
|
|
|
|
EOF
|
|
|
|
|
|
################
|
|
## test build ##
|
|
################
|
|
|
|
make clean launcherIcon all
|
|
make clean
|