Browse Source

no message

#Suyghur 3 years ago
parent
commit
d1524ef419
100 changed files with 1210 additions and 5968 deletions
  1. 1 1
      ReplaceJar&Res.py
  2. BIN
      android_sdk/jmsdk/library_jmsdk/src/main/assets/A3AEECD8.dex
  3. 60 53
      common_utils.py
  4. 0 85
      config_utils_record.py
  5. 0 77
      config_utils_shanshen.py
  6. 0 0
      currentSdk/res/drawable-hdpi/jm_float_gift_red.png
  7. 0 0
      currentSdk/res/drawable-hdpi/jm_float_move_red.png
  8. 0 0
      currentSdk/res/drawable-hdpi/jm_float_on_red.png
  9. 0 0
      currentSdk/res/drawable-hdpi/jm_float_red.png
  10. 0 0
      currentSdk/res/drawable-hdpi/jm_float_service_red.png
  11. 0 0
      currentSdk/res/drawable-hdpi/jm_float_user_red.png
  12. 0 0
      currentSdk/res/drawable-hdpi/jm_interval_red.png
  13. 0 0
      currentSdk/res/drawable-hdpi/jmloading_red.gif
  14. 216 219
      file_utils.py
  15. 21 21
      game_script/ahlz/game_script.py
  16. 13 10
      game_utils.py
  17. 1 1
      internal/launcher_code/smali/com/jmhy/sdk/template/LauncherActivity.smali
  18. 0 80
      internal_shanshen/launcher_code/smali/com/shanshen/sdk/template/LauncherActivity$LaunchHandler.smali
  19. 0 115
      internal_shanshen/launcher_code/smali/com/shanshen/sdk/template/LauncherActivity.smali
  20. 0 12
      internal_shanshen/launcher_res/layout/shanshen_sdk_launcher_template.xml
  21. BIN
      log_sdk/gdt/gdt.jar
  22. BIN
      log_sdk/gdt/jniLibs/armeabi-v7a/libturingad.so
  23. 1 1
      log_sdk/gdt/libs/config.json
  24. 3 1
      log_sdk/gdt/manifest.xml
  25. BIN
      log_sdk/jrtt/jrtt.jar
  26. BIN
      log_sdk/jrtt/libs/jrtt_logsdk.jar
  27. 0 0
      oaid_sdk/1.0.10/assets/A3AEECD8.dex
  28. 0 0
      oaid_sdk/1.0.10/assets/supplierconfig.json
  29. 0 0
      oaid_sdk/1.0.10/libs/miit_mdid_1.0.10.jar
  30. 1 1
      package.py
  31. 0 178
      package_channel.py
  32. 0 93
      package_channel_douyou.py
  33. 0 3
      package_record.py
  34. 0 3
      package_shanshen.py
  35. 28 23
      package_test.py
  36. 431 211
      package_utils.py
  37. 0 1246
      package_utils_record.py
  38. 0 1075
      package_utils_shanshen.py
  39. 0 1323
      package_utils_yfsdk.py
  40. 134 118
      package_web.py
  41. 0 314
      package_web_record.py
  42. 0 213
      package_web_shanshen.py
  43. 0 205
      package_web_yfsdk.py
  44. 0 3
      package_yfsdk.py
  45. 10 8
      sdk/jm/libs/config.json
  46. 49 52
      sdk/jm/manifest.xml
  47. BIN
      sdk/jm/res/drawable-hdpi/jm_auto_logo.png
  48. BIN
      sdk/jm/res/drawable-hdpi/jm_float.png
  49. BIN
      sdk/jm/res/drawable-hdpi/jm_float_3.png
  50. BIN
      sdk/jm/res/drawable-hdpi/jm_float_4.png
  51. 0 0
      sdk/jm/res/drawable-hdpi/jm_float_gift_red.png
  52. BIN
      sdk/jm/res/drawable-hdpi/jm_float_move.png
  53. BIN
      sdk/jm/res/drawable-hdpi/jm_float_move_3.png
  54. BIN
      sdk/jm/res/drawable-hdpi/jm_float_move_new.png
  55. BIN
      sdk/jm/res/drawable-hdpi/jm_float_move_red.png
  56. BIN
      sdk/jm/res/drawable-hdpi/jm_float_new.png
  57. BIN
      sdk/jm/res/drawable-hdpi/jm_float_on.png
  58. BIN
      sdk/jm/res/drawable-hdpi/jm_float_on_3.png
  59. BIN
      sdk/jm/res/drawable-hdpi/jm_float_on_4.png
  60. BIN
      sdk/jm/res/drawable-hdpi/jm_float_on_new.png
  61. BIN
      sdk/jm/res/drawable-hdpi/jm_float_on_red.png
  62. 0 0
      sdk/jm/res/drawable-hdpi/jm_float_red.png
  63. 0 0
      sdk/jm/res/drawable-hdpi/jm_float_service_red.png
  64. 0 0
      sdk/jm/res/drawable-hdpi/jm_float_user_red.png
  65. 0 0
      sdk/jm/res/drawable-hdpi/jm_interval_red.png
  66. BIN
      sdk/jm/res/drawable-hdpi/jm_logo.png
  67. BIN
      sdk/jm/res/drawable-hdpi/jm_logo_3.png
  68. BIN
      sdk/jm/res/drawable-hdpi/jm_logo_4.png
  69. BIN
      sdk/jm/res/drawable-hdpi/jm_logo_new.png
  70. BIN
      sdk/jm/res/drawable-hdpi/jmloading_red.gif
  71. 4 8
      sdk/jm/res/drawable/jm_agree_button_4.xml
  72. 4 8
      sdk/jm/res/drawable/jm_agree_button_6.xml
  73. 5 4
      sdk/jm/res/drawable/jm_auto_login_bg_4.xml
  74. 27 33
      sdk/jm/res/drawable/jm_backlogin_btn.xml
  75. 21 21
      sdk/jm/res/drawable/jm_blues_codebtn_style.xml
  76. 21 21
      sdk/jm/res/drawable/jm_blues_codebtn_style_new.xml
  77. 5 4
      sdk/jm/res/drawable/jm_button_cancel_4.xml
  78. 5 4
      sdk/jm/res/drawable/jm_button_getcode_4.xml
  79. 5 4
      sdk/jm/res/drawable/jm_button_getcode_6.xml
  80. 5 4
      sdk/jm/res/drawable/jm_button_login_4.xml
  81. 5 4
      sdk/jm/res/drawable/jm_button_nextstep_6.xml
  82. 5 4
      sdk/jm/res/drawable/jm_button_register_4.xml
  83. 5 4
      sdk/jm/res/drawable/jm_button_setpass_4.xml
  84. 27 33
      sdk/jm/res/drawable/jm_cut_btn.xml
  85. 5 4
      sdk/jm/res/drawable/jm_dialog_ios_bg.xml
  86. 5 4
      sdk/jm/res/drawable/jm_exit_dialog_bg.xml
  87. 5 4
      sdk/jm/res/drawable/jm_green_codebtn_style.xml
  88. 5 4
      sdk/jm/res/drawable/jm_green_light_codebtn_style.xml
  89. 7 4
      sdk/jm/res/drawable/jm_input_bg.xml
  90. 5 4
      sdk/jm/res/drawable/jm_input_layout_bg_4.xml
  91. 5 4
      sdk/jm/res/drawable/jm_login_bg_4.xml
  92. 5 4
      sdk/jm/res/drawable/jm_login_bg_6.xml
  93. 7 4
      sdk/jm/res/drawable/jm_message_tip.xml
  94. 5 4
      sdk/jm/res/drawable/jm_orange_codebtn_style.xml
  95. 8 5
      sdk/jm/res/drawable/jm_phone_input_6.xml
  96. 6 5
      sdk/jm/res/drawable/jm_red_codebtn_style.xml
  97. 6 5
      sdk/jm/res/drawable/jm_red_light_codebtn_style.xml
  98. 7 4
      sdk/jm/res/drawable/jm_select_left_checked.xml
  99. 9 4
      sdk/jm/res/drawable/jm_select_left_normal.xml
  100. 7 4
      sdk/jm/res/drawable/jm_select_right_checked.xml

+ 1 - 1
ReplaceJar&Res.py

@@ -178,7 +178,7 @@ def replaceRes():
         if l.find("jm") > -1:
         if l.find("jm") > -1:
             des_res_path = os.path.join(sdkpath,l,"res")
             des_res_path = os.path.join(sdkpath,l,"res")
             print (des_res_path)
             print (des_res_path)
-            file_utils.copyDir(resPath,des_res_path)
+            file_utils.copy_dir(resPath, des_res_path)
 
 
     #修改config字段 及替换Jar包
     #修改config字段 及替换Jar包
     # for l in list:
     # for l in list:

BIN
android_sdk/jmsdk/library_jmsdk/src/main/assets/A3AEECD8.dex


+ 60 - 53
common_utils.py

@@ -1,97 +1,102 @@
-import file_utils
-import xml_utils
 import os.path
 import os.path
 import random
 import random
-def changeApplication(game, sdk, subChannel, config, targetApplication):
-    '''
-    修改最顶级的application
-    '''
 
 
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    application = xml_utils.getApplicationAttr(manifest, 'name')
+import file_utils
+import xml_utils
+
+
+def change_application(game, sdk, sub_channel, config, target_application):
+    """
+    修改最顶级的application
+    """
+    decompile_path = file_utils.get_decompile_path(game, sdk, sub_channel, config['cache'])
+    manifest = os.path.join(decompile_path, 'AndroidManifest.xml')
+    application = xml_utils.get_application_attr(manifest, 'name')
 
 
     if application is None:
     if application is None:
-        xml_utils.changeApplicationAttr(manifest, 'name', targetApplication)
+        xml_utils.change_application_attr(manifest, 'name', target_application)
 
 
-        print('change add application %s' % targetApplication)
+        print('change add application %s' % target_application)
     else:
     else:
-        smaliPath = os.path.join(decompliePath, 'smali')
-        superApplication = findSuperApplication(smaliPath, application)
-        print('super application is %s' % superApplication)
+        smaliPath = os.path.join(decompile_path, 'smali')
+        super_application = find_super_application(smaliPath, application)
+        print('super application is %s' % super_application)
 
 
-        if superApplication == targetApplication:
+        if super_application == target_application:
             return
             return
-        changeSuperApplication(smaliPath, superApplication, targetApplication.replace('.', '/'))
+        change_super_application(smaliPath, super_application, target_application.replace('.', '/'))
 
 
-        print('change super application %s to %s' % (superApplication, targetApplication))
+        print('change super application %s to %s' % (super_application, target_application))
 
 
 
 
-def changeTopApplication(game, sdk, subChannel, config, targetApplication):
-    '''
-    修改mainfest清单下的application入口。
-    PS:例八门渠道,因游戏app'继承到渠道app'过程中有停住,未进入到渠道app'初始化,故改用渠道app'为入口,继承原游戏app'确保他们的功能正常运行
-    '''
+def change_top_application(game, sdk, sub_channel, config, target_application):
+    """
+    修改manifest清单下的application入口。
+    PS:例八门渠道,因游戏app继承到渠道app过程中有停住,未进入到渠道app初始化,故改用渠道app为入口,继承原游戏app确保他们的功能正常运行
+    """
 
 
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
+    decompliePath = file_utils.get_decompile_path(game, sdk, sub_channel, config['cache'])
     manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
     manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    gameApplication = xml_utils.getApplicationAttr(manifest, 'name')
-    print ("游戏application"+gameApplication)
-    xml_utils.changeApplicationAttr(manifest, 'name', targetApplication)
+    gameApplication = xml_utils.get_application_attr(manifest, 'name')
+    print("游戏application" + gameApplication)
+    xml_utils.change_application_attr(manifest, 'name', target_application)
     # if application is None:
     # if application is None:
     #     xml_utils.changeApplicationAttr(manifest, 'name', targetApplication)
     #     xml_utils.changeApplicationAttr(manifest, 'name', targetApplication)
     #
     #
     #     print('change add application %s' % targetApplication)
     #     print('change add application %s' % targetApplication)
     # else:
     # else:
     smaliPath = os.path.join(decompliePath, 'smali')
     smaliPath = os.path.join(decompliePath, 'smali')
-    superApplication = findSuperApplication(smaliPath, targetApplication)
+    superApplication = find_super_application(smaliPath, target_application)
     print('寻找入口application。super application is %s' % superApplication)
     print('寻找入口application。super application is %s' % superApplication)
-    changeSuperApplication(smaliPath, superApplication, gameApplication.replace('.', '/'))
+    change_super_application(smaliPath, superApplication, gameApplication.replace('.', '/'))
+
+    print('change super application %s to %s' % (target_application, gameApplication))
 
 
-    print('change super application %s to %s' % (targetApplication,gameApplication))
 
 
-def findSuperApplication(basePath, className):
-    '''
+def find_super_application(base_path, class_name):
+    """
     获取最顶级的application
     获取最顶级的application
-    '''
+    """
     tagSuper = '.super Landroid/app/Application;'
     tagSuper = '.super Landroid/app/Application;'
     tag = '.super L'
     tag = '.super L'
-    applicationFile = file_utils.getPackagePath(basePath, className) + '.smali'
+    applicationFile = file_utils.get_package_path(base_path, class_name) + '.smali'
 
 
     topClassName = None
     topClassName = None
     superClass = None
     superClass = None
-    with openFile(applicationFile, 'r') as f:
+    with open_file(applicationFile, 'r') as f:
         line = f.readline()
         line = f.readline()
 
 
         while line:
         while line:
             if tagSuper in line:
             if tagSuper in line:
-                topClassName = className
+                topClassName = class_name
                 break
                 break
             elif tag in line:
             elif tag in line:
                 superClass = line[8:-2]
                 superClass = line[8:-2]
                 superClass = superClass.replace('/', '.')
                 superClass = superClass.replace('/', '.')
                 break
                 break
-                
+
             line = f.readline()
             line = f.readline()
 
 
     if topClassName is not None:
     if topClassName is not None:
         return topClassName
         return topClassName
     elif superClass is not None:
     elif superClass is not None:
-        return findSuperApplication(basePath, superClass)
+        return find_super_application(base_path, superClass)
+
 
 
-def changeSuperApplication(basePath, className, targetApplication):
-    '''
+def change_super_application(base_path, class_name, target_application):
+    """
     更改application
     更改application
-    '''
-    applicationFile = file_utils.getPackagePath(basePath, className) + '.smali'
+    """
+    applicationFile = file_utils.get_package_path(base_path, class_name) + '.smali'
 
 
     # 修改application
     # 修改application
-    changeSuperApplicationSmali(applicationFile, targetApplication)
+    change_supper_application_smali(applicationFile, target_application)
 
 
-def changeSuperApplicationSmali(file, application):
-    '''
+
+def change_supper_application_smali(file, application):
+    """
     修改application.smali
     修改application.smali
-    '''
+    """
     contentSpuer = '.super Landroid/app/Application;'
     contentSpuer = '.super Landroid/app/Application;'
     constructor = '.method public constructor <init>()V'
     constructor = '.method public constructor <init>()V'
     direct = 'invoke-direct'
     direct = 'invoke-direct'
@@ -99,7 +104,7 @@ def changeSuperApplicationSmali(file, application):
     applicationTag = 'Landroid/app/Application;->'
     applicationTag = 'Landroid/app/Application;->'
     newContent = ''
     newContent = ''
 
 
-    with openFile(file, 'r+') as f:
+    with open_file(file, 'r+') as f:
         line = f.readline()
         line = f.readline()
         isConstructor = False
         isConstructor = False
 
 
@@ -119,17 +124,19 @@ def changeSuperApplicationSmali(file, application):
             line = f.readline()
             line = f.readline()
 
 
         f.seek(0, 0)
         f.seek(0, 0)
-        #清空内容
+        # 清空内容
         f.truncate()
         f.truncate()
         f.write(newContent)
         f.write(newContent)
     return 0
     return 0
-def getRandomNumber(size):
-    str = ""
+
+
+def get_random_number(size):
+    content = ""
     for i in range(6):
     for i in range(6):
         ch = chr(random.randrange(ord('0'), ord('9') + 1))
         ch = chr(random.randrange(ord('0'), ord('9') + 1))
-        str += ch
-    return str
+        content += ch
+    return content
 
 
 
 
-def openFile(file, mode):
-    return file_utils.openFile(file, mode)
+def open_file(file, mode):
+    return file_utils.open_file(file, mode)

+ 0 - 85
config_utils_record.py

@@ -1,85 +0,0 @@
-import time
-
-def checkConfig(config):
-    '''
-    检查配置
-    '''
-    print('check config ...')
-    if type(config) == dict:
-        print('check config dict ...')
-        return checkChannelConfig(config)
-    elif type(config) == list:
-        print('check config list ...')
-        for itemConfig in config:
-            if not checkChannelConfig(itemConfig):
-                return False
-    return True
-
-def checkChannelConfig(config):
-    if 'name' not in config or 'packageName' not in config:
-        print('name or packageName not exists in config')
-        return False
-
-    if 'subChannel' not in config:
-        print('subChannel not exists in config')
-        return False
-
-    # 默认值
-    if 'changeIcon' not in config:
-        config['changeIcon'] = False
-    if 'switchIcon' not in config:
-        config['switchIcon'] = False
-    if 'addLauncher' not in config:
-        config['addLauncher'] = False
-    if 'splitDex' not in config:
-        config['splitDex'] = True
-    if 'clearCache' not in config:
-        config['clearCache'] = True
-    if 'aapt2disable' not in config:
-        config['aapt2disable'] = False
-    if 'v2disable' not in config:
-        config['v2disable'] = False
-    if 'screenOrientation' not in config:
-        config['screenOrientation'] = 'landscape'
-    if 'outName' not in config:
-        config['outName'] = config['name']
-        
-    return True
-
-def replaceArgs(config):
-    '''
-    替换占位符
-    '''
-    if type(config) == dict:
-        replaceItemArgs(config)
-    elif type(config) == list:
-        # 遍历数组
-        for arg in config:
-            replaceItemArgs(arg)
-
-def replaceItemArgs(config):
-    '''
-    替换占位符
-    '''
-    # 遍历字典
-    for arg in config:
-        if type(config[arg]) == dict:
-            replaceArgs(config[arg])
-        elif type(config[arg]) == str:
-            replaceString(config, arg)
-
-def replaceString(config, arg):
-    '''
-    替换占位符
-    '''
-    content = config[arg]
-    if '${DATE}' in content:
-        content = content.replace('${DATE}', getDate())
-
-    config[arg] = content
-
-def getDate():
-    '''
-    获取日期
-    '''
-    return time.strftime("%Y%m%d", time.localtime()) 

+ 0 - 77
config_utils_shanshen.py

@@ -1,77 +0,0 @@
-import time
-
-def checkConfig(config):
-    '''
-    检查配置
-    '''
-    print('check config ...')
-    if type(config) == dict:
-        return checkChannelConfig(config)
-    elif type(config) == list:
-        for itemConfig in config:
-            if not checkChannelConfig(itemConfig):
-                return False
-    return True
-
-def checkChannelConfig(config):
-    if 'subChannel' not in config:
-        print('subChannel not exists in config')
-        return False
-
-    # 默认值
-    if 'changeIcon' not in config:
-        config['changeIcon'] = False
-    if 'switchIcon' not in config:
-        config['switchIcon'] = False
-    if 'addLauncher' not in config:
-        config['addLauncher'] = False
-    if 'splitDex' not in config:
-        config['splitDex'] = True
-    if 'clearCache' not in config:
-        config['clearCache'] = True
-    if 'aapt2disable' not in config:
-        config['aapt2disable'] = False
-    if 'v2disable' not in config:
-        config['v2disable'] = False
-    if 'outName' not in config:
-        config['outName'] = config['name']
-        
-    return True
-
-def replaceArgs(config):
-    '''
-    替换占位符
-    '''
-    if type(config) == dict:
-        replaceItemArgs(config)
-    elif type(config) == list:
-        # 遍历数组
-        for arg in config:
-            replaceItemArgs(arg)
-
-def replaceItemArgs(config):
-    '''
-    替换占位符
-    '''
-    # 遍历字典
-    for arg in config:
-        if type(config[arg]) == dict:
-            replaceArgs(config[arg])
-        elif type(config[arg]) == str:
-            replaceString(config, arg)
-
-def replaceString(config, arg):
-    '''
-    替换占位符
-    '''
-    content = config[arg]
-    if '${DATE}' in content:
-        content = content.replace('${DATE}', getDate())
-
-    config[arg] = content
-
-def getDate():
-    '''
-    获取日期
-    '''
-    return time.strftime("%Y%m%d", time.localtime()) 

+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_gift_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_move_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_on_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_service_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_float_user_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jm_interval_red.png


+ 0 - 0
currentSdk/res/drawable-hdpi/jmloading_red.gif


+ 216 - 219
file_utils.py

@@ -1,160 +1,169 @@
+import hashlib
 import os
 import os
 import os.path
 import os.path
+import platform
 import shutil
 import shutil
 import subprocess
 import subprocess
-import platform
 import sys
 import sys
-import hashlib
 
 
 
 
 def getFullToolPath(name):
 def getFullToolPath(name):
     '''
     '''
     获取工具的目录
     获取工具的目录
     '''
     '''
-    return getFullPath('tools', name)
+    return get_full_path('tools', name)
 
 
 
 
 def getFullGameApk(name):
 def getFullGameApk(name):
     '''
     '''
     获取游戏的原始包
     获取游戏的原始包
     '''
     '''
-    return getFullPath('game', name, name + '.apk')
+    return get_full_path('game', name, name + '.apk')
 
 
 
 
-def getCacheGameApk(game, random, sdk):
-    '''
+def get_cache_game_apk(game, random, sdk):
+    """
     获取游戏的原始包
     获取游戏的原始包
-    '''
-    return getFullPath('game', game, sdk, random, game + '.apk')
+    """
+    return get_full_path('game', game, sdk, random, game + '.apk')
 
 
 
 
-def getFullSDKPath(sdk):
-    '''
+def get_full_sdk_path(sdk):
+    """
     获取sdk的目录
     获取sdk的目录
-    '''
-    return getFullPath('sdk', sdk)
+    """
+    return get_full_path('sdk', sdk)
 
 
 
 
-def getFullLogSDKPath(sdk, is_beta=False):
-    '''
-    获取logsdk的目录
-    '''
+def get_full_log_sdk_path(sdk, is_beta=False):
+    """
+    获取logSdk的目录
+    """
     if is_beta:
     if is_beta:
-        return getFullPath('log_sdk_beta', sdk)
+        return get_full_path('log_sdk_beta', sdk)
     else:
     else:
-        return getFullPath('log_sdk', sdk)
+        return get_full_path('log_sdk', sdk)
+
+
+def get_full_log_sdk_v2_path(sdk, is_beta=False):
+    """
+    获取logSdk的目录
+    """
+    if is_beta:
+        return get_full_path('log_sdk_v2_beta', sdk)
+    else:
+        return get_full_path('log_sdk_v2', sdk)
 
 
 
 
 def getFullOaidSDKPath(version):
 def getFullOaidSDKPath(version):
-    '''
-    获取logsdk的目录
-    '''
-    return getFullPath('oaid_sdk', version)
+    """
+    获取oaid_sdk的目录
+    """
+    return get_full_path('oaid_sdk', version)
 
 
 
 
-def getDecompliePath(game, sdk, subChannel, cache):
-    '''
+def get_decompile_path(game, sdk, sub_channel, cache):
+    """
     获取解包的目录
     获取解包的目录
-    '''
-    return getFullPath('gen', game, sdk, subChannel, cache)
+    """
+    return get_full_path('gen', game, sdk, sub_channel, cache)
 
 
 
 
-def getSubChannelPath(game, sdk, subChannel):
+def getSubChannelPath(game, sdk, sub_channel):
     '''
     '''
     获取子渠道的目录
     获取子渠道的目录
     '''
     '''
-    return getFullPath('game', game, sdk, subChannel)
+    return get_full_path('game', game, sdk, sub_channel)
 
 
 
 
 def getSubChannelPath(game, sdk, tag, subChannel):
 def getSubChannelPath(game, sdk, tag, subChannel):
-    '''
+    """
     获取子渠道的目录
     获取子渠道的目录
-    '''
-    return getFullPath('game', game, sdk, tag, subChannel)
+    """
+    return get_full_path('game', game, sdk, tag, subChannel)
 
 
 
 
 def getChannelPath(game, sdk):
 def getChannelPath(game, sdk):
     '''
     '''
     获取渠道的目录
     获取渠道的目录
     '''
     '''
-    return getFullPath('game', game, sdk)
+    return get_full_path('game', game, sdk)
 
 
 
 
 def getChannelPath(game, tag, sdk):
 def getChannelPath(game, tag, sdk):
-    '''
+    """
     获取渠道的目录
     获取渠道的目录
-    '''
-    return getFullPath('game', game, sdk, tag)
+    """
+    return get_full_path('game', game, sdk, tag)
 
 
 
 
-def getFullGamePath(game):
-    '''
+def get_full_game_path(game):
+    """
     获取游戏的目录
     获取游戏的目录
-    '''
-    return getFullPath('game', game)
+    """
+    return get_full_path('game', game)
 
 
 
 
 def getFullInternalPath():
 def getFullInternalPath():
-    '''
+    """
     获取内部目录
     获取内部目录
-    '''
-    return os.path.join(getCurrentPath(), 'internal')
+    """
+    return os.path.join(get_current_path(), 'internal')
 
 
 
 
-def getFullPath(type, *name):
-    path = os.path.join(getCurrentPath(), type)
+def get_full_path(gen, *name):
+    path = os.path.join(get_current_path(), gen)
     for n in name:
     for n in name:
         path = os.path.join(path, str(n))
         path = os.path.join(path, str(n))
     return path
     return path
 
 
 
 
-def getCurrentPath():
-    '''
+def get_current_path():
+    """
     当前目录
     当前目录
-    '''
+    """
     return sys.path[0]
     return sys.path[0]
 
 
 
 
-def execFormatCmd(cmd, cd=None):
-    '''
+def exec_format_cmd(cmd, cd=None):
+    """
     执行cmd命令
     执行cmd命令
 
 
     返回值:None —— 子进程尚未结束;
     返回值:None —— 子进程尚未结束;
         ==0 —— 子进程正常退出;
         ==0 —— 子进程正常退出;
-        > 0—— 子进程异常退出,returncode对应于出错码;
+        > 0—— 子进程异常退出,return code对应于出错码;
         < 0—— 子进程被信号杀掉了。
         < 0—— 子进程被信号杀掉了。
-    '''
+    """
     '''print(cmd)
     '''print(cmd)
     p = os.popen(cmd)
     p = os.popen(cmd)
     print(p.read())'''
     print(p.read())'''
     ret = 0
     ret = 0
     try:
     try:
-        s = subprocess.Popen(cmd, stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE, shell=True, cwd=cd)
-        stdoutput, erroutput = s.communicate()
+        s = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=cd)
+        std_output, err_output = s.communicate()
 
 
         if platform.system() == 'Windows':
         if platform.system() == 'Windows':
-            stdoutput = stdoutput.decode('gbk')
-            erroutput = erroutput.decode('gbk')
+            std_output = std_output.decode('gbk')
+            err_output = err_output.decode('gbk')
 
 
         '''
         '''
         None —— 子进程尚未结束;
         None —— 子进程尚未结束;
         ==0 —— 子进程正常退出;
         ==0 —— 子进程正常退出;
-        > 0—— 子进程异常退出,returncode对应于出错码;
+        > 0—— 子进程异常退出,return code对应于出错码;
         < 0—— 子进程被信号杀掉了。
         < 0—— 子进程被信号杀掉了。
         '''
         '''
         ret = s.returncode
         ret = s.returncode
 
 
         if ret:
         if ret:
             print('*******ERROR*******')
             print('*******ERROR*******')
-            print(stdoutput)
-            print(erroutput)
+            print(std_output)
+            print(err_output)
             print('*******************')
             print('*******************')
 
 
             cmd = 'error::' + cmd + '  !!!exec Fail!!!  '
             cmd = 'error::' + cmd + '  !!!exec Fail!!!  '
         else:
         else:
-            print(stdoutput)
-            print(erroutput)
+            print(std_output)
+            print(err_output)
 
 
             cmd = cmd + ' !!!exec success!!! '
             cmd = cmd + ' !!!exec success!!! '
 
 
@@ -167,97 +176,88 @@ def execFormatCmd(cmd, cd=None):
     return ret
     return ret
 
 
 
 
-def execJarCmd(jar, params):
-    '''
+def exec_jar_cmd(jar, params):
+    """
     执行jar
     执行jar
-    '''
-    return execFormatCmd('java -jar "%s" %s' % (jar, params))
+    """
+    return exec_format_cmd('java -jar "%s" %s' % (jar, params))
 
 
 
 
-def copyFileAllDir(fromDir, toDir, delete=False, support=None):
-    '''
+def copy_file_all_dir(from_dir, to_dir, delete=False, support=None):
+    """
     拷贝目录下所有文件文件
     拷贝目录下所有文件文件
-    '''
-    # print('copy all file %s --> %s' % (fromDir, toDir))
-    ret = copyDir(fromDir, toDir, delete, support)
+    """
+    ret = copy_dir(from_dir, to_dir, delete, support)
     if ret:
     if ret:
         return ret
         return ret
-
     if delete:
     if delete:
-        deleteFolder(fromDir)
+        delete_folder(from_dir)
 
 
     return 0
     return 0
 
 
 
 
-def copyDir(fromDir, toDir, delete=False, support=None):
-    '''
+def copy_dir(from_dir, to_dir, delete=False, support=None):
+    """
     拷贝目录下所有文件文件
     拷贝目录下所有文件文件
-    '''
+    """
     # print('copy all file %s --> %s' % (fromDir, toDir))
     # print('copy all file %s --> %s' % (fromDir, toDir))
-    if not os.path.exists(fromDir):
-        print('%s not exists!' % fromDir)
+    if not os.path.exists(from_dir):
+        print('%s not exists!' % from_dir)
         return 1
         return 1
 
 
-    if not os.path.isdir(fromDir):
-        print('%s not a dir!' % fromDir)
+    if not os.path.isdir(from_dir):
+        print('%s not a dir!' % from_dir)
         return 1
         return 1
 
 
-    for fromFile in os.listdir(fromDir):
-        fromFilePath = os.path.join(fromDir, fromFile)
-        toFilePath = os.path.join(toDir, fromFile)
-        if os.path.isdir(fromFilePath):
+    for fromFile in os.listdir(from_dir):
+        from_file_path = os.path.join(from_dir, fromFile)
+        to_file_path = os.path.join(to_dir, fromFile)
+        if os.path.isdir(from_file_path):
             # 不支持的类型
             # 不支持的类型
             if support is not None and fromFile not in support:
             if support is not None and fromFile not in support:
                 continue
                 continue
 
 
-            ret = copyDir(fromFilePath, toFilePath, delete, support)
+            ret = copy_dir(from_file_path, to_file_path, delete, support)
             if ret:
             if ret:
                 return ret
                 return ret
         else:
         else:
-            ret = copyFile(fromFilePath, toFilePath, delete)
+            ret = copy_file(from_file_path, to_file_path, delete)
             if ret:
             if ret:
                 return ret
                 return ret
 
 
     return 0
     return 0
 
 
 
 
-def copyFile(formFile, toFile, delete=False):
-    '''
+def copy_file(from_file, to_file, delete=False):
+    """
     拷贝文件
     拷贝文件
-    '''
-    if not os.path.isfile(formFile):
-        print('----> %s not a file!' % formFile)
+    """
+    if not os.path.isfile(from_file):
+        print('----> %s not a file!' % from_file)
         return 1
         return 1
 
 
-    fpath, fname = os.path.split(toFile)  # 分离文件名和路径
-    if not os.path.exists(fpath):
-        # print('%s not exists, crate' % fpath)
-        os.makedirs(fpath)  # 创建路径
-
-    '''if os.path.exists(toFile) and os.path.getsize(formFile) > 104857600 and equalsFile(formFile, toFile):
-        print('skip copy %s --> %s' % (formFile, toFile))
-        if delete:
-            os.remove(formFile)
-            print('remove %s' % formFile)
-        return 0'''
+    # 分离文件名和路径
+    file_path, file_name = os.path.split(to_file)
+    if not os.path.exists(file_path):
+        # 创建路径
+        os.makedirs(file_path)
 
 
     if delete:
     if delete:
-        shutil.move(formFile, toFile)  # 移动文件
-        # print('move %s --> %s' % (formFile, toFile))
+        # 移动文件
+        shutil.move(from_file, to_file)
     else:
     else:
-        shutil.copyfile(formFile, toFile)  # 复制文件
-        # print('copy %s --> %s' % (formFile, toFile))
-
+        # 复制文件
+        shutil.copyfile(from_file, to_file)
     return 0
     return 0
 
 
 
 
-def replaceContent(file, oldText, newText):
-    '''
+def replace_content(file, old_txt, new_txt):
+    """
     全局替换
     全局替换
-    '''
-    with openFile(file, 'r+') as f:
+    """
+    with open_file(file, 'r+') as f:
         t = f.read()
         t = f.read()
-        t = t.replace(oldText, newText)
+        t = t.replace(old_txt, new_txt)
         # 读写偏移位置移到最开始处
         # 读写偏移位置移到最开始处
         f.seek(0, 0)
         f.seek(0, 0)
         # 清空内容
         # 清空内容
@@ -265,109 +265,106 @@ def replaceContent(file, oldText, newText):
         f.write(t)
         f.write(t)
 
 
 
 
-def readFile(file):
-    '''
+def read_file(file):
+    """
     读取文件内容
     读取文件内容
-    '''
+    """
     content = ''
     content = ''
-    with openFile(file, 'r') as f:
+    with open_file(file, 'r') as f:
         content = f.read()
         content = f.read()
     return content
     return content
 
 
 
 
-def createFile(file, content):
-    '''
+def create_file(file, content):
+    """
     创建文件
     创建文件
-    '''
-    fpath, fname = os.path.split(file)  # 分离文件名和路径
-    if not os.path.exists(fpath):
-        os.makedirs(fpath)
+    """
+    file_path, file_name = os.path.split(file)  # 分离文件名和路径
+    if not os.path.exists(file_path):
+        os.makedirs(file_path)
 
 
-    with openFile(file, 'w') as f:
+    with open_file(file, 'w') as f:
         f.write(content)
         f.write(content)
         f.close()
         f.close()
 
 
 
 
-def openFile(file, mode):
+def open_file(file, mode):
     return open(file, mode, encoding='UTF-8')
     return open(file, mode, encoding='UTF-8')
 
 
 
 
-def deleteFolder(folder):
-    '''
+def delete_folder(folder):
+    """
     删除目录以及目录下的文件
     删除目录以及目录下的文件
-    '''
+    """
     if not os.path.exists(folder):
     if not os.path.exists(folder):
         return
         return
-
-    # print('remove %s ...' % folder)
     shutil.rmtree(folder)
     shutil.rmtree(folder)
-    # print('removed %s' % folder)
 
 
 
 
-def getAAPTPath():
-    '''
+def get_aapt_path():
+    """
     获取aapt
     获取aapt
-    '''
+    """
     return getToolWithSystem('aapt')
     return getToolWithSystem('aapt')
 
 
 
 
-def getAAPT2Path():
-    '''
+def get_aapt2_path():
+    """
     获取aapt2
     获取aapt2
-    '''
+    """
     return getToolWithSystem('aapt2')
     return getToolWithSystem('aapt2')
 
 
 
 
-def getAndroidCompileToolPath():
-    '''
+def get_android_compile_tool_path():
+    """
     获取android.jar
     获取android.jar
-    '''
+    """
     return getFullToolPath('android.jar')
     return getFullToolPath('android.jar')
 
 
 
 
-def getDxPath():
-    '''
+def get_dx_path():
+    """
     获取dx.jar
     获取dx.jar
-    '''
+    """
     return getFullToolPath('dx.jar')
     return getFullToolPath('dx.jar')
 
 
 
 
-def getD8Path():
-    '''
+def get_d8_path():
+    """
     获取d8.jar
     获取d8.jar
-    '''
+    """
     return getFullToolPath('d8.jar')
     return getFullToolPath('d8.jar')
 
 
 
 
-def getAlignPath():
-    '''
+def get_zipalign_path():
+    """
     获取zipalign
     获取zipalign
-    '''
+    """
     return getToolWithSystem('zipalign')
     return getToolWithSystem('zipalign')
 
 
 
 
-def getMultiDexPath():
-    '''
+def get_multidex_path():
+    """
     获取multidex.jar
     获取multidex.jar
-    '''
+    """
     return getFullToolPath('android-support-multidex.jar')
     return getFullToolPath('android-support-multidex.jar')
 
 
 
 
-def getApkToolPath():
-    '''
+def get_apktool_path():
+    """
     获取apktool.jar
     获取apktool.jar
-    '''
-    return getFullToolPath('apktool_2.4.0.jar')
+    """
+    return getFullToolPath('apktool_2.6.0.jar')
 
 
 
 
-def getBaksmaliPath():
-    '''
+def get_baksmali_path():
+    """
     获取baksmali.jar
     获取baksmali.jar
-    '''
+    """
     return getFullToolPath('baksmali-2.3.jar')
     return getFullToolPath('baksmali-2.3.jar')
 
 
 
 
-def getApksignerPath():
+def get_apksigner_path():
     '''
     '''
     获取apksigner.jar
     获取apksigner.jar
     '''
     '''
@@ -385,52 +382,52 @@ def getOutApkPath(game, sdk, subChannel, cache):
     '''
     '''
     获取输出的apk的目录
     获取输出的apk的目录
     '''
     '''
-    return getFullPath('target', game, sdk, cache, '%s_%s_%s.apk' % (game, sdk, subChannel))
+    return get_full_path('target', game, sdk, cache, '%s_%s_%s.apk' % (game, sdk, subChannel))
 
 
 
 
 def getTargetApkPath(game, sdk, cache):
 def getTargetApkPath(game, sdk, cache):
     '''
     '''
     获取输出的apk的目录
     获取输出的apk的目录
     '''
     '''
-    return getFullPath('target', game, sdk, cache)
+    return get_full_path('target', game, sdk, cache)
 
 
 
 
 def getAlignApkPath(game, sdk, subChannel, cache):
 def getAlignApkPath(game, sdk, subChannel, cache):
     '''
     '''
     获取输出的apk的目录
     获取输出的apk的目录
     '''
     '''
-    return getFullPath('target', game, sdk, cache, '%s_%s_%s_align.apk' % (game, sdk, subChannel))
+    return get_full_path('target', game, sdk, cache, '%s_%s_%s_align.apk' % (game, sdk, subChannel))
 
 
 
 
-def getSiginedApkPath(game, sdk, subChannel, cache):
-    '''
+def get_signed_apk_path(game, sdk, sub_channel, cache):
+    """
     获取输出的apk的目录
     获取输出的apk的目录
-    '''
-    return getFullPath('target', game, sdk, cache, '%s_%s_%s_signed.apk' % (game, sdk, subChannel))
+    """
+    return get_full_path('target', game, sdk, cache, '%s_%s_%s_signed.apk' % (game, sdk, sub_channel))
 
 
 
 
 def getWalleApkPath(game, sdk, subChannel, cache):
 def getWalleApkPath(game, sdk, subChannel, cache):
-    '''
+    """
     获取输出的apk的目录
     获取输出的apk的目录
-    '''
-    return getFullPath('target', game, sdk, cache, '%s_%s_%s_walled.apk' % (game, sdk, subChannel))
+    """
+    return get_full_path('target', game, sdk, cache, '%s_%s_%s_walled.apk' % (game, sdk, subChannel))
 
 
 
 
 def getRenameApkPath(game, sdk, cache, name):
 def getRenameApkPath(game, sdk, cache, name):
     '''
     '''
     重命名输出的apk名称
     重命名输出的apk名称
     '''
     '''
-    return getFullPath('target', game, sdk, cache, '%s.apk' % name)
+    return get_full_path('target', game, sdk, cache, '%s.apk' % name)
 
 
 
 
 def getSignApkPath(game, sdk, subChannel, cache):
 def getSignApkPath(game, sdk, subChannel, cache):
     '''
     '''
     获取输出的apk的目录
     获取输出的apk的目录
     '''
     '''
-    return getFullPath('target', game, sdk, cache, '%s_%s_%s_signed.apk' % (game, sdk, subChannel))
+    return get_full_path('target', game, sdk, cache, '%s_%s_%s_signed.apk' % (game, sdk, subChannel))
 
 
 
 
-def getPackagePath(basePath, packageName):
+def get_package_path(basePath, packageName):
     '''
     '''
     包名对应的目录
     包名对应的目录
     '''
     '''
@@ -464,22 +461,22 @@ def getSystemPath():
 
 
 
 
 def getSystemSuffix():
 def getSystemSuffix():
-    '''
+    """
     系统工具后缀
     系统工具后缀
-    '''
+    """
     if platform.system() == 'Windows':
     if platform.system() == 'Windows':
         return '.exe'
         return '.exe'
     else:
     else:
         return ''
         return ''
 
 
 
 
-def getApplicationSmaliIndex(file):
-    '''
+def get_application_smali_index(file):
+    """
     获取application.smali的MultiDex信息
     获取application.smali的MultiDex信息
-    '''
+    """
     content = ('invoke-super', '->attachBaseContext(Landroid/content/Context;)V')
     content = ('invoke-super', '->attachBaseContext(Landroid/content/Context;)V')
     index = -1
     index = -1
-    with openFile(file, 'r') as f:
+    with open_file(file, 'r') as f:
         line = f.readline()
         line = f.readline()
         while line:
         while line:
             if content[0] in line and content[1] in line:
             if content[0] in line and content[1] in line:
@@ -490,10 +487,10 @@ def getApplicationSmaliIndex(file):
     return index
     return index
 
 
 
 
-def insertApplicationSmali(file, index):
-    '''
+def insert_application_smali(file, index):
+    """
     获取application.smali插入MultiDex的信息
     获取application.smali插入MultiDex的信息
-    '''
+    """
     if index == -1:
     if index == -1:
         # append
         # append
         content = '''# virtual methods
         content = '''# virtual methods
@@ -507,12 +504,12 @@ def insertApplicationSmali(file, index):
 
 
     return-void
     return-void
 .end method'''
 .end method'''
-        with openFile(file, 'a') as f:
+        with open_file(file, 'a') as f:
             f.write(content)
             f.write(content)
     else:
     else:
         # insert
         # insert
         content = '\n\tinvoke-static {p0}, Landroid/support/multidex/MultiDex;->install(Landroid/content/Context;)V\n'
         content = '\n\tinvoke-static {p0}, Landroid/support/multidex/MultiDex;->install(Landroid/content/Context;)V\n'
-        with openFile(file, 'r+') as f:
+        with open_file(file, 'r+') as f:
             f.seek(index)
             f.seek(index)
             last = f.read()
             last = f.read()
             f.seek(index)
             f.seek(index)
@@ -527,7 +524,7 @@ def changeVersion(yml, versionCode=None, versionName=None, targetSdkVersion=None
 
 
     tag = ['versionCode:', 'versionName:', 'targetSdkVersion:']
     tag = ['versionCode:', 'versionName:', 'targetSdkVersion:']
 
 
-    with openFile(yml, 'r+') as f:
+    with open_file(yml, 'r+') as f:
         content = ''
         content = ''
         line = f.readline()
         line = f.readline()
         while line:
         while line:
@@ -548,16 +545,16 @@ def changeVersion(yml, versionCode=None, versionName=None, targetSdkVersion=None
     return 0
     return 0
 
 
 
 
-def changeMinSdkVersion(yml, minSdkVersion):
-    with openFile(yml, 'r+') as f:
+def change_min_sdk_version(yml, min_sdk_version):
+    with open_file(yml, 'r+') as f:
         content = ''
         content = ''
         line = f.readline()
         line = f.readline()
         while line:
         while line:
             if 'minSdkVersion' in line:
             if 'minSdkVersion' in line:
                 start = line.index("'")
                 start = line.index("'")
                 version = int(line[start + 1:-2])
                 version = int(line[start + 1:-2])
-                if version < minSdkVersion:
-                    content += '  minSdkVersion: \'%s\'\n' % minSdkVersion
+                if version < min_sdk_version:
+                    content += '  minSdkVersion: \'%s\'\n' % min_sdk_version
                 else:
                 else:
                     return 0
                     return 0
             else:
             else:
@@ -571,23 +568,23 @@ def changeMinSdkVersion(yml, minSdkVersion):
     return 0
     return 0
 
 
 
 
-def list_files(src, resFiles):
-    '''
+def list_files(src, res_files):
+    """
     列出目录下所有的文件
     列出目录下所有的文件
-    '''
+    """
     if os.path.exists(src):
     if os.path.exists(src):
         if os.path.isfile(src):
         if os.path.isfile(src):
-            resFiles.append(src)
+            res_files.append(src)
         elif os.path.isdir(src):
         elif os.path.isdir(src):
             for f in os.listdir(src):
             for f in os.listdir(src):
-                list_files(os.path.join(src, f), resFiles)
-    return resFiles
+                list_files(os.path.join(src, f), res_files)
+    return res_files
 
 
 
 
-def getFileMd5(f):
-    '''
+def get_file_md5(f):
+    """
     获取文件的md5
     获取文件的md5
-    '''
+    """
     m = hashlib.md5()
     m = hashlib.md5()
     while True:
     while True:
         data = f.read(1024)  # 将文件分块读取
         data = f.read(1024)  # 将文件分块读取
@@ -597,58 +594,58 @@ def getFileMd5(f):
     return m.hexdigest()
     return m.hexdigest()
 
 
 
 
-def equalsFile(file1, file2):
-    '''
+def equals_file(file1, file2):
+    """
     比较两个文件是否是同一个文件
     比较两个文件是否是同一个文件
-    '''
+    """
     with open(file1, 'rb') as f1, open(file2, 'rb') as f2:
     with open(file1, 'rb') as f1, open(file2, 'rb') as f2:
-        file1Md5 = getFileMd5(f1)
-        file2Md5 = getFileMd5(f2)
+        file1Md5 = get_file_md5(f1)
+        file2Md5 = get_file_md5(f2)
         # print('file1Md5:',file1Md5)
         # print('file1Md5:',file1Md5)
         # print('file2Md5:',file2Md5)
         # print('file2Md5:',file2Md5)
         return file1Md5 == file2Md5
         return file1Md5 == file2Md5
 
 
 
 
-def getExecPermission(file):
-    '''
+def get_exec_permission(file):
+    """
     linux下获取执行权限
     linux下获取执行权限
-    '''
+    """
     if platform.system() == 'Windows':
     if platform.system() == 'Windows':
         return 0
         return 0
 
 
-    return execFormatCmd('chmod +x "%s"' % file)
+    return exec_format_cmd('chmod +x "%s"' % file)
 
 
 
 
-def copySdkSmaliCode(game, sdk, subChannel, config):
-    '''
+def copy_sdk_smali_code(game, sdk, sub_channel, config):
+    """
     拷贝代码
     拷贝代码
-    '''
-    print('copySdkSmaliCode -->  %s' % sdk)
-    sdkPath = getFullSDKPath(sdk)
+    """
+    print('copy sdk smali code -->  %s' % sdk)
+    sdkPath = get_full_sdk_path(sdk)
 
 
     xmyFile = os.path.join(sdkPath, 'smali')
     xmyFile = os.path.join(sdkPath, 'smali')
-    decompliePath = getDecompliePath(game, sdk, subChannel, config['cache'])
+    decompliePath = get_decompile_path(game, sdk, sub_channel, config['cache'])
     smaliPath = os.path.join(decompliePath, 'smali')
     smaliPath = os.path.join(decompliePath, 'smali')
-    ret = copyDir(xmyFile, smaliPath)
+    ret = copy_dir(xmyFile, smaliPath)
 
 
     return ret
     return ret
 
 
 
 
-def copyGameSmaliCode(game, sdk, subChannel, config):
-    '''
+def copy_game_smali_code(game, sdk, sub_channel, config):
+    """
     拷贝代码
     拷贝代码
-    '''
-    print('copyGameSmaliCode -->  %s' % sdk)
+    """
+    print('copy game smali code -->  %s' % sdk)
 
 
     if not config['aapt2disable']:
     if not config['aapt2disable']:
         print('aapt2disable = false ~~~')
         print('aapt2disable = false ~~~')
         return 0
         return 0
-    path = os.path.join(getCurrentPath(), "game_script", game, "gameSmali")
+    path = os.path.join(get_current_path(), "game_script", game, "gameSmali")
 
 
     print('copyDir = gameSmali~~~')
     print('copyDir = gameSmali~~~')
 
 
-    decompliePath = getDecompliePath(game, sdk, subChannel, config['cache'])
+    decompliePath = get_decompile_path(game, sdk, sub_channel, config['cache'])
     smaliPath = os.path.join(decompliePath, 'smali')
     smaliPath = os.path.join(decompliePath, 'smali')
-    ret = copyDir(path, smaliPath)
+    ret = copy_dir(path, smaliPath)
 
 
     return ret
     return ret

+ 21 - 21
game_script/ahlz/game_script.py

@@ -1,21 +1,21 @@
-import file_utils
-import common_utils
-import xml_utils
-import os.path
-import xml.etree.ElementTree as ET
-
-namespaces = {'android' : 'http://schemas.android.com/apk/res/android'}
-encoding = 'UTF-8'
-
-def execute(game, sdk, config):
-    print('execute %s game script...' % game)
-
-    subChannel = config['subChannel']
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    activityName = 'com.tencent.android.tpush.XGPushActivity'
-    #删除Activity
-    xml_utils.deleteActivityByName(manifest, activityName)
-    file_utils.copyGameSmaliCode(game, sdk, subChannel, config)
-    return 0
+import file_utils
+import common_utils
+import xml_utils
+import os.path
+import xml.etree.ElementTree as ET
+
+namespaces = {'android' : 'http://schemas.android.com/apk/res/android'}
+encoding = 'UTF-8'
+
+def execute(game, sdk, config):
+    print('execute %s game script...' % game)
+
+    subChannel = config['subChannel']
+
+    decompliePath = file_utils.get_decompile_path(game, sdk, subChannel, config['cache'])
+    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
+    activityName = 'com.tencent.android.tpush.XGPushActivity'
+    #删除Activity
+    xml_utils.delete_activity_by_name(manifest, activityName)
+    file_utils.copy_game_smali_code(game, sdk, subChannel, config)
+    return 0

+ 13 - 10
game_utils.py

@@ -1,11 +1,13 @@
-import file_utils
-import xml_utils
 import os.path
 import os.path
 import xml.etree.ElementTree as ET
 import xml.etree.ElementTree as ET
 
 
-namespaces = {'android' : 'http://schemas.android.com/apk/res/android'}
+import file_utils
+import xml_utils
+
+namespaces = {'android': 'http://schemas.android.com/apk/res/android'}
 encoding = 'UTF-8'
 encoding = 'UTF-8'
 
 
+
 def sdkLebianChange(game, sdk, config):
 def sdkLebianChange(game, sdk, config):
     '''
     '''
     乐变的处理,理论上只需要有接入的游戏需要处理
     乐变的处理,理论上只需要有接入的游戏需要处理
@@ -15,11 +17,12 @@ def sdkLebianChange(game, sdk, config):
 
 
     subChannel = config['subChannel']
     subChannel = config['subChannel']
 
 
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
+    decompliePath = file_utils.get_decompile_path(game, sdk, subChannel, config['cache'])
     manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
     manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
     changeProviderAuthorities(manifest, config['packageName'])
     changeProviderAuthorities(manifest, config['packageName'])
     return 0
     return 0
 
 
+
 def changeProviderAuthorities(manifest, packageName):
 def changeProviderAuthorities(manifest, packageName):
     '''
     '''
     标识为com.excelliance
     标识为com.excelliance
@@ -33,9 +36,9 @@ def changeProviderAuthorities(manifest, packageName):
     root = tree.getroot()
     root = tree.getroot()
 
 
     packageTag = 'com.excelliance'
     packageTag = 'com.excelliance'
-    attrAuthorities = xml_utils.getNamespacesFormat('android:authorities', namespaces)
+    attrAuthorities = xml_utils.get_namespaces_format('android:authorities', namespaces)
     for provider in root.findall('application/provider'):
     for provider in root.findall('application/provider'):
-        
+
         if attrAuthorities not in provider.attrib:
         if attrAuthorities not in provider.attrib:
             continue
             continue
 
 
@@ -45,9 +48,9 @@ def changeProviderAuthorities(manifest, packageName):
 
 
         auth = packageName + authorities[authorities.index(':'):]
         auth = packageName + authorities[authorities.index(':'):]
         provider.attrib[attrAuthorities] = auth
         provider.attrib[attrAuthorities] = auth
-    
-    attrName = xml_utils.getNamespacesFormat('android:name', namespaces)
-    attrTaskAffinity = xml_utils.getNamespacesFormat('android:taskAffinity', namespaces)
+
+    attrName = xml_utils.get_namespaces_format('android:name', namespaces)
+    attrTaskAffinity = xml_utils.get_namespaces_format('android:taskAffinity', namespaces)
 
 
     for activity in root.findall('application/activity'):
     for activity in root.findall('application/activity'):
         if packageTag not in activity.attrib[attrName]:
         if packageTag not in activity.attrib[attrName]:
@@ -56,4 +59,4 @@ def changeProviderAuthorities(manifest, packageName):
         if attrTaskAffinity in activity.attrib:
         if attrTaskAffinity in activity.attrib:
             activity.attrib[attrTaskAffinity] = packageName
             activity.attrib[attrTaskAffinity] = packageName
 
 
-    tree.write(manifest, encoding)
+    tree.write(manifest, encoding)

+ 1 - 1
internal/launcher_code/smali/com/jmhy/sdk/template/LauncherActivity.smali

@@ -106,7 +106,7 @@
     .local v1, "handler":Lcom/jmhy/sdk/template/LauncherActivity$LaunchHandler;
     .local v1, "handler":Lcom/jmhy/sdk/template/LauncherActivity$LaunchHandler;
     const/4 v2, 0x1
     const/4 v2, 0x1
 
 
-    const-wide/16 v3, 0xbb8
+    const-wide/16 v3, 0x28a
 
 
     invoke-virtual {v1, v2, v3, v4}, Lcom/jmhy/sdk/template/LauncherActivity$LaunchHandler;->sendEmptyMessageDelayed(IJ)Z
     invoke-virtual {v1, v2, v3, v4}, Lcom/jmhy/sdk/template/LauncherActivity$LaunchHandler;->sendEmptyMessageDelayed(IJ)Z
 
 

+ 0 - 80
internal_shanshen/launcher_code/smali/com/shanshen/sdk/template/LauncherActivity$LaunchHandler.smali

@@ -1,80 +0,0 @@
-.class Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;
-.super Landroid/os/Handler;
-.source "LauncherActivity.java"
-
-
-# annotations
-.annotation system Ldalvik/annotation/EnclosingClass;
-    value = Lcom/shanshen/sdk/template/LauncherActivity;
-.end annotation
-
-.annotation system Ldalvik/annotation/InnerClass;
-    accessFlags = 0xa
-    name = "LaunchHandler"
-.end annotation
-
-
-# instance fields
-.field reference:Ljava/lang/ref/WeakReference;
-    .annotation system Ldalvik/annotation/Signature;
-        value = {
-            "Ljava/lang/ref/WeakReference<",
-            "Lcom/shanshen/sdk/template/LauncherActivity;",
-            ">;"
-        }
-    .end annotation
-.end field
-
-
-# direct methods
-.method constructor <init>(Lcom/shanshen/sdk/template/LauncherActivity;)V
-    .locals 1
-
-    .line 36
-    invoke-direct {p0}, Landroid/os/Handler;-><init>()V
-
-    .line 37
-    new-instance v0, Ljava/lang/ref/WeakReference;
-
-    invoke-direct {v0, p1}, Ljava/lang/ref/WeakReference;-><init>(Ljava/lang/Object;)V
-
-    iput-object v0, p0, Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;->reference:Ljava/lang/ref/WeakReference;
-
-    return-void
-.end method
-
-
-# virtual methods
-.method public handleMessage(Landroid/os/Message;)V
-    .locals 2
-
-    .line 42
-    iget-object v0, p0, Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;->reference:Ljava/lang/ref/WeakReference;
-
-    invoke-virtual {v0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;
-
-    move-result-object v0
-
-    check-cast v0, Lcom/shanshen/sdk/template/LauncherActivity;
-
-    if-nez v0, :cond_0
-
-    return-void
-
-    .line 47
-    :cond_0
-    iget p1, p1, Landroid/os/Message;->what:I
-
-    const/4 v1, 0x1
-
-    if-eq p1, v1, :cond_1
-
-    goto :goto_0
-
-    .line 49
-    :cond_1
-    invoke-static {v0}, Lcom/shanshen/sdk/template/LauncherActivity;->access$000(Lcom/shanshen/sdk/template/LauncherActivity;)V
-
-    :goto_0
-    return-void
-.end method

+ 0 - 115
internal_shanshen/launcher_code/smali/com/shanshen/sdk/template/LauncherActivity.smali

@@ -1,115 +0,0 @@
-.class public Lcom/shanshen/sdk/template/LauncherActivity;
-.super Landroid/app/Activity;
-.source "LauncherActivity.java"
-
-
-# annotations
-.annotation system Ldalvik/annotation/MemberClasses;
-    value = {
-        Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;
-    }
-.end annotation
-
-
-# static fields
-.field private static final LAUNCH:I = 0x1
-
-
-# direct methods
-.method public constructor <init>()V
-    .locals 0
-
-    .line 12
-    invoke-direct {p0}, Landroid/app/Activity;-><init>()V
-
-    return-void
-.end method
-
-.method static synthetic access$000(Lcom/shanshen/sdk/template/LauncherActivity;)V
-    .locals 0
-    .param p0, "x0"    # Lcom/shanshen/sdk/template/LauncherActivity;
-
-    .line 12
-    invoke-direct {p0}, Lcom/shanshen/sdk/template/LauncherActivity;->launch()V
-
-    return-void
-.end method
-
-.method private launch()V
-    .locals 4
-
-    .line 26
-    new-instance v0, Landroid/content/Intent;
-
-    invoke-direct {v0}, Landroid/content/Intent;-><init>()V
-
-    .line 27
-    .local v0, "intent":Landroid/content/Intent;
-    new-instance v1, Landroid/content/ComponentName;
-
-    invoke-virtual {p0}, Lcom/shanshen/sdk/template/LauncherActivity;->getPackageName()Ljava/lang/String;
-
-    move-result-object v2
-
-    const-string v3, "{class}"
-
-    invoke-direct {v1, v2, v3}, Landroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-
-    invoke-virtual {v0, v1}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
-
-    .line 28
-    invoke-virtual {p0, v0}, Lcom/shanshen/sdk/template/LauncherActivity;->startActivity(Landroid/content/Intent;)V
-
-    .line 30
-    invoke-virtual {p0}, Lcom/shanshen/sdk/template/LauncherActivity;->finish()V
-
-    .line 31
-    return-void
-.end method
-
-
-# virtual methods
-.method protected onCreate(Landroid/os/Bundle;)V
-    .locals 5
-    .param p1, "savedInstanceState"    # Landroid/os/Bundle;
-
-    .line 17
-    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
-
-    .line 18
-    invoke-virtual {p0}, Lcom/shanshen/sdk/template/LauncherActivity;->getResources()Landroid/content/res/Resources;
-
-    move-result-object v0
-
-    const-string v1, "shanshen_sdk_launcher_template"
-
-    const-string v2, "layout"
-
-    invoke-virtual {p0}, Lcom/shanshen/sdk/template/LauncherActivity;->getPackageName()Ljava/lang/String;
-
-    move-result-object v3
-
-    invoke-virtual {v0, v1, v2, v3}, Landroid/content/res/Resources;->getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-
-    move-result v0
-
-    .line 19
-    .local v0, "id":I
-    invoke-virtual {p0, v0}, Lcom/shanshen/sdk/template/LauncherActivity;->setContentView(I)V
-
-    .line 21
-    new-instance v1, Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;
-
-    invoke-direct {v1, p0}, Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;-><init>(Lcom/shanshen/sdk/template/LauncherActivity;)V
-
-    .line 22
-    .local v1, "handler":Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;
-    const/4 v2, 0x1
-
-    const-wide/16 v3, 0xbb8
-
-    invoke-virtual {v1, v2, v3, v4}, Lcom/shanshen/sdk/template/LauncherActivity$LaunchHandler;->sendEmptyMessageDelayed(IJ)Z
-
-    .line 23
-    return-void
-.end method

+ 0 - 12
internal_shanshen/launcher_res/layout/shanshen_sdk_launcher_template.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <ImageView
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-		android:scaleType="centerCrop"
-        android:src="@drawable/shanshen_sdk_launcher_bg"/>
-</FrameLayout>

BIN
log_sdk/gdt/gdt.jar


BIN
log_sdk/gdt/jniLibs/armeabi-v7a/libturingad.so


+ 1 - 1
log_sdk/gdt/libs/config.json

@@ -1,3 +1,3 @@
 [
 [
-	"GDTActionSDK.min.1.6.5.jar"
+	"GDTActionSDK.min.1.7.4.jar"
 ]
 ]

+ 3 - 1
log_sdk/gdt/manifest.xml

@@ -6,5 +6,7 @@
 		<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 		<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 	</permissions>
 	</permissions>
 
 
-    <application/>
+	<application>
+		<provider android:name="com.qq.gdt.action.GDTInitProvider" android:authorities="${applicationId}.GDTInitProvider" android:exported="false" />
+	</application>
 </manifest>
 </manifest>

BIN
log_sdk/jrtt/jrtt.jar


BIN
log_sdk/jrtt/libs/jrtt_logsdk.jar


+ 0 - 0
oaid_sdk/1.0.10/assets/A3AEECD8.dex


+ 0 - 0
oaid_sdk/1.0.10/assets/supplierconfig.json


+ 0 - 0
oaid_sdk/1.0.10/libs/miit_mdid_1.0.10.jar


+ 1 - 1
package.py

@@ -1,3 +1,3 @@
 import package_utils
 import package_utils
 
 
-package_utils.packConsoleInput()
+package_utils.packConsoleInput()

+ 0 - 178
package_channel.py

@@ -1,178 +0,0 @@
-import file_utils
-import config_utils
-import sys
-import os.path
-import json
-
-def packageChannel():
-    if len(sys.argv) < 2:
-        print('argument is missing')
-        return 1
-
-    channelConfig = sys.argv[1]
-
-    jsonText = file_utils.readFile(channelConfig)
-    config = json.loads(jsonText)
-
-    print('*************config*****************')
-    print(jsonText)
-    print('************************************')
-
-    # 检查配置
-    if not checkConfig(config):
-        return 1
-
-    # 检查文件
-    gameApk = config['package']
-    if not os.path.exists(gameApk):
-        print('%s not exists' % gameApk)
-
-    if supportSignV2(gameApk):
-        packageChannelV2(gameApk, config)
-    else:
-        packageChannelV1(gameApk, config)
-
-def supportSignV2(gameApk):
-    '''
-    验证是否APK Signature Scheme v2
-    '''
-    apksigner = file_utils.getApksignerPath()
-    ret = getJavaResult(apksigner, 'verify --verbose "%s"' % gameApk)
-
-    if '(APK Signature Scheme v2): true' in ret:
-        return True
-    return False
-
-def packageChannelV2(gameApk, config):
-    walle = file_utils.getWallePath()
-
-    if not os.path.exists(config['outPath']):
-        os.makedirs(config['outPath'])
-
-    successCount = 0
-    failureCount = 0
-    channels = config['channel']
-    for channel in channels:
-        signedApk = os.path.join(config['outPath'], channel['outName'] + '.apk')
-        print('add channel package %s...' % signedApk)
-        appid = ''
-        appkey = ''
-        version = config_utils.getDate()
-        if 'appid' in channel:
-            appid = channel['appid']
-        if 'appkey' in channel:
-            appkey = channel['appkey']
-        if 'version' in channel:
-            version = channel['version']
-        ret = file_utils.execJarCmd(walle, 'put -e version=%s,agent=%s,appid=%s,appkey=%s "%s" "%s"' % (version, channel['agent'], appid, appkey, gameApk, signedApk))
-        if ret:
-            failureCount += 1
-        else:
-            successCount += 1
-
-    print('success %d, failure %d' % (successCount, failureCount))
-
-def packageChannelV1(gameApk, config):
-    # 解包
-    decompliePath = os.path.join(file_utils.getCurrentPath(), 'gen', 'channel')
-    if os.path.exists(decompliePath):
-        print('delete decomplie folder...')
-        file_utils.deleteFolder(decompliePath)
-
-    print('decomplie apk...')
-    apktoolPath = file_utils.getApkToolPath()
-    ret = file_utils.execJarCmd(apktoolPath, 'd -f "%s" -o "%s"' % (gameApk, decompliePath))
-    if ret:
-        return ret
-
-    if not os.path.exists(config['outPath']):
-        os.makedirs(config['outPath'])
-
-    alignapkTool = file_utils.getAlignPath()
-    apksigner = file_utils.getApksignerPath()
-    path = os.path.join(file_utils.getCurrentPath(), 'keystore', 'key.json')
-    jsonText = file_utils.readFile(path)
-    signConfig = json.loads(jsonText)
-    keystore = signConfig['default']
-    storeFile = os.path.join(file_utils.getCurrentPath(), 'keystore', keystore['storeFile'])
-
-    successCount = 0
-    failureCount = 0
-    channels = config['channel']
-    
-    for channel in channels:
-        changeChannel(decompliePath, channel)
-
-        temp = channel['agent']
-        backApk = os.path.join(decompliePath, temp + '.apk')
-        alignApk = os.path.join(decompliePath, temp + '_align.apk')
-        signedApk = os.path.join(config['outPath'], channel['outName'] + '.apk')
-
-        print('add channel package %s...' % signedApk)
-        print('recomplie apk...')
-        ret = file_utils.execJarCmd(apktoolPath, 'b -f "%s" -o "%s"' % (decompliePath, backApk))
-        if ret:
-            failureCount += 1
-            continue
-
-        print('align apk...')
-        ret = file_utils.execFormatCmd('"%s" -f -p 4 "%s" "%s"' % (alignapkTool, backApk, alignApk))
-        if ret:
-            failureCount += 1
-            continue
-
-        print('sign apk...')
-        ret = file_utils.execJarCmd(apksigner, 'sign --v2-signing-enabled=false --ks "%s" --ks-key-alias %s --ks-pass pass:%s --key-pass pass:%s --out "%s" "%s"' % (storeFile, keystore['keyAlias'], keystore['storePassword'], keystore['keyPassword'], signedApk, alignApk))
-        if ret:
-            failureCount += 1
-        else:
-            successCount += 1
-
-        if os.path.exists(alignApk):
-            os.remove(alignApk)
-        if os.path.exists(backApk):
-            os.remove(backApk)
-
-    print('success %d, failure %d' % (successCount, failureCount))
-
-def changeChannel(decompliePath, channel):
-    '''
-    修改渠道
-    '''
-    properties = os.path.join(decompliePath, 'assets', 'jmhy.properties')
-    appid = ''
-    appkey = ''
-    version = config_utils.getDate()
-    if 'appid' in channel:
-        appid = channel['appid']
-    if 'appkey' in channel:
-        appkey = channel['appkey']
-    if 'version' in channel:
-        version = channel['version']
-    content = 'version=%s\nagent=%s\nappid=%s\nappkey=%s' % (version, channel['agent'], appid, appkey)
-    file_utils.createFile(properties, content)
-
-def checkConfig(config):
-    if 'package' not in config:
-        print('package not exists in config')
-        return False
-
-    if 'outPath' not in config:
-        print('outPath not exists in config')
-        return False
-
-    if 'channel' not in config:
-        print('channel not exists in config')
-        return False
-
-    return True
-
-def getJavaResult(jar, cmd):
-    return getCmdResult('java -jar "%s" %s' % (jar, cmd))
-
-def getCmdResult(cmd):
-    p = os.popen(cmd)
-    content = p.read()
-    return content
-
-packageChannel()

+ 0 - 93
package_channel_douyou.py

@@ -1,93 +0,0 @@
-import file_utils
-import config_utils
-import sys
-import os.path
-import json
-
-def packageChannel():
-    if len(sys.argv) < 2:
-        print('argument is missing')
-        return 1
-
-    channelConfig = sys.argv[1]
-
-    jsonText = file_utils.readFile(channelConfig)
-    config = json.loads(jsonText)
-
-    print('*************config*****************')
-    print(jsonText)
-    print('************************************')
-
-    # 检查配置
-    if not checkConfig(config):
-        return 1
-
-    # 检查文件
-    gameApk = config['package']
-    if not os.path.exists(gameApk):
-        print('%s not exists' % gameApk)
-        return 1
-
-    if supportSignV2(gameApk):
-        packageChannelV2(gameApk, config)
-        return 0
-    else:
-        print('apk not support Signature Scheme v2' % gameApk)
-        return 1
-
-def supportSignV2(gameApk):
-    '''
-    验证是否APK Signature Scheme v2
-    '''
-    apksigner = file_utils.getApksignerPath()
-    ret = getJavaResult(apksigner, 'verify --verbose "%s"' % gameApk)
-
-    if '(APK Signature Scheme v2): true' in ret:
-        return True
-    return False
-
-def packageChannelV2(gameApk, config):
-    print('add channel package ...')
-    walle = file_utils.getWallePath()
-
-    if not os.path.exists(config['outPath']):
-        os.makedirs(config['outPath'])
-
-    successCount = 0
-    failureCount = 0
-    channels = config['channel']
-    for channel in channels:
-        print('add channel package %s --> %s...' % (channel['agent'], channel['outName']))
-        signedApk = os.path.join(config['outPath'], channel['outName'] + '.apk')
-        ret = file_utils.execJarCmd(walle, 'put -c %s "%s" "%s"' % (channel['agent'], gameApk, signedApk))
-        if ret:
-            failureCount += 1
-        else:
-            successCount += 1
-
-    print('success %d, failure %d' % (successCount, failureCount))
-
-def checkConfig(config):
-    if 'package' not in config:
-        print('package not exists in config')
-        return False
-
-    if 'outPath' not in config:
-        print('outPath not exists in config')
-        return False
-
-    if 'channel' not in config:
-        print('channel not exists in config')
-        return False
-
-    return True
-
-def getJavaResult(jar, cmd):
-    return getCmdResult('java -jar "%s" %s' % (jar, cmd))
-
-def getCmdResult(cmd):
-    p = os.popen(cmd)
-    content = p.read()
-    return content
-
-packageChannel()

+ 0 - 3
package_record.py

@@ -1,3 +0,0 @@
-import package_utils_record
-
-package_utils_record.packConsoleInput()

+ 0 - 3
package_shanshen.py

@@ -1,3 +0,0 @@
-import package_utils_shanshen
-
-package_utils_shanshen.packConsoleInput()

+ 28 - 23
package_test.py

@@ -6,17 +6,19 @@ import os
 import os.path
 import os.path
 import json
 import json
 
 
+
 def packTest():
 def packTest():
     '''
     '''
     测试代码
     测试代码
     '''
     '''
-    game = 'sample'
-    sdk = 'float'
-    subChannel = 'test'
+    game = 'qyj2'
+    sdk = 'jm'
+    subChannel = 'jm'
 
 
-    channelPath = file_utils.getChannelPath(game, sdk)
+    channelPath = file_utils.getChannelPath('', game, sdk)
+    print('channel_path :%s', channelPath)
     configPath = os.path.join(channelPath, 'config.json')
     configPath = os.path.join(channelPath, 'config.json')
-    jsonText = file_utils.readFile(configPath)
+    jsonText = file_utils.read_file(configPath)
     config = json.loads(jsonText)
     config = json.loads(jsonText)
     config_utils.replaceArgs(config)
     config_utils.replaceArgs(config)
 
 
@@ -25,34 +27,36 @@ def packTest():
         return 1
         return 1
 
 
     package_utils.decomplie(game, sdk, subChannel, config)
     package_utils.decomplie(game, sdk, subChannel, config)
-    package_utils.removeNoSupportAttr(game, sdk, subChannel, config)
-    package_utils.mergeDrawableRes(game, sdk, subChannel, config)
-    package_utils.removeSameRes(game, sdk, subChannel, config)
-    package_utils.copyRes(game, sdk, subChannel, config)
-    package_utils.mergeManifestRes(game, sdk, subChannel, config)
-    package_utils.changePlaceholders(game, sdk, subChannel, config)
-    package_utils.addMetaData(game, sdk, subChannel, config)
-    package_utils.copyAppRes(game, sdk, subChannel, config)
-    package_utils.changePackageName(game, sdk, subChannel, config)
-    package_utils.changeAppName(game, sdk, subChannel, config)
-    package_utils.changeAppIcon(game, sdk, subChannel, config)
-    package_utils.addLauncher(game, sdk, subChannel, config)
-    package_utils.packJar(game, sdk, subChannel, config)
-    package_utils.doSDKPostScript(game, sdk, config)
-    package_utils.doGamePostScript(game, sdk, config)
+    package_utils.remove_no_support_attr(game, sdk, subChannel, config)
+    package_utils.merge_drawable_res(game, sdk, subChannel, config)
+    package_utils.remove_same_values_res(game, sdk, subChannel, config)
+    package_utils.copy_res(game, sdk, subChannel, config)
+    package_utils.merge_manifest_res(game, sdk, subChannel, config)
+    package_utils.change_placeholders(game, sdk, subChannel, config)
+    package_utils.add_meta_data(game, sdk, subChannel, config)
+    package_utils.copy_app_res(game, sdk, subChannel, config)
+    package_utils.change_package_name(game, sdk, subChannel, config)
+    package_utils.change_app_name(game, sdk, subChannel, config)
+    package_utils.change_app_icon(game, sdk, subChannel, config)
+    package_utils.add_launcher(game, sdk, subChannel, config)
+    package_utils.pack_jar(game, sdk, subChannel, config)
+    package_utils.do_sdk_post_script(game, sdk, config)
+    package_utils.do_game_post_script(game, sdk, config)
     package_utils.generateNewRFile(game, sdk, subChannel, config)
     package_utils.generateNewRFile(game, sdk, subChannel, config)
-    package_utils.splitDex(game, sdk, subChannel, config)
+    package_utils.split_dex(game, sdk, subChannel, config)
     package_utils.recomplie(game, sdk, subChannel, config)
     package_utils.recomplie(game, sdk, subChannel, config)
     package_utils.alignApk(game, sdk, subChannel, config)
     package_utils.alignApk(game, sdk, subChannel, config)
-    package_utils.apksignerApk(game, sdk, subChannel, config)
+    package_utils.apk_signer_apk(game, sdk, subChannel, config)
     package_utils.clearTemp(game, sdk, subChannel, config)
     package_utils.clearTemp(game, sdk, subChannel, config)
 
 
+
 def getCmd(cmd):
 def getCmd(cmd):
     p = os.popen(cmd)
     p = os.popen(cmd)
     content = p.read()
     content = p.read()
-    #print(content)
+    # print(content)
     return content
     return content
 
 
+
 def getItemConfig(config, subChannel):
 def getItemConfig(config, subChannel):
     if type(config) == dict:
     if type(config) == dict:
         if subChannel is None or config['subChannel'] == subChannel:
         if subChannel is None or config['subChannel'] == subChannel:
@@ -63,4 +67,5 @@ def getItemConfig(config, subChannel):
                 return subChannel
                 return subChannel
     return None
     return None
 
 
+
 packTest()
 packTest()

File diff suppressed because it is too large
+ 431 - 211
package_utils.py


+ 0 - 1246
package_utils_record.py

@@ -1,1246 +0,0 @@
-# 安卓游戏打包脚本
-# 1.用apktool解包
-# 2.复制res资源、assets资源、jniLib资源
-# 3.修改包名、app名、渠道文件
-# 4.添加app icon、合并AndroidManifest文件
-# 5.添加app启动图,修改AndroidManifest文件
-# 6.生成新的R文件
-# 7.将新的R文件编译,生成dex,再用baksmali生成smali,替换旧的R文件
-# 8.将jar资源打包成dex,再用baksmali生成smali,拷贝到smali目录下
-# 9.统计方法量,并分割dex(将smali文件拷贝到目录smali_classes2)
-# 10.用apktool回包
-# 11.重新签名
-import file_utils
-import xml_utils
-import smali_utils
-import config_utils_record
-import game_utils
-import os
-import os.path
-import json
-import sys
-import importlib
-import uuid
-import zipfile
-
-from xml.etree import ElementTree as ET
-from xml.etree.ElementTree import SubElement
-
-def pack(game, sdk, config):
-    config['cache'] = uuid.uuid1()
-    subChannel = config['subChannel']
-    # 解包
-    ret = decomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 删除旧代码
-    ret = removeOldCode(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    if 'deleteList' in config:
-        # 删除旧资源
-        ret = removeOldRes(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 删除一些不支持的属性
-    ret = removeNoSupportAttr(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 删除一些不支持的配置
-    ret = fixUnSupportConfig(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 合并Drawable-v4目录
-    ret = mergeDrawableRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 移除相同的资源
-    ret = removeSameRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 复制res资源
-    ret = copyRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 合并主文件
-    ret = mergeManifestRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 替换占位符
-    ret = changePlaceholders(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 添加meta-data
-    ret = addMetaData(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 复制app res资源
-    ret = copyAppRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 合并语言文件
-    ret = mergeLanguage(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 增加配置文件
-    ret = addConfig(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    #保存旧包名
-    config['oldPackageName'] = getPackageName(game, sdk, subChannel, config)
-    # 更改包名
-    if 'packageName' in config and config['packageName'] != '':
-        ret = changePackageName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    else:
-        config['packageName'] = getPackageName(game, sdk, subChannel, config)
-    # 更改app名
-    if 'name' in config and config['name'] != '':
-        ret = changeAppName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改app icon
-    if config['changeIcon']:
-        ret = changeAppIcon(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 添加启动图操作
-    if config['addLauncher']:
-        ret = addLauncher(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 打包lib依赖
-    ret = packJar(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # sdk脚本处理
-    ret = doSDKPostScript(game, sdk, config)
-    if ret:
-        return ret
-    # 乐变sdk的特殊处理
-    ret = game_utils.sdkLebianChange(game, sdk, config)
-    if ret:
-        return ret
-    # 复制EntryActivity文件
-    ret = copyEntryActivityCode(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 游戏脚本处理
-    ret = doGamePostScript(game, sdk, config)
-    if ret:
-        return ret
-    # 生成R文件
-    '''ret = generateNewRFile(game, sdk, subChannel, config)
-    if ret:
-        return ret'''
-    # 添加MultiDex支持
-    if config['splitDex']:
-        ret = splitDex(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改版本号
-    ret = changeVersion(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 回编译
-    ret = recomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 对齐apk
-    ret = alignApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 签名
-    ret = apksignerApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 清理产生的中间文件
-    if config['clearCache']:
-        clearTemp(game, sdk, subChannel, config)
-
-    return 0
-
-def decomplie(game, sdk, subChannel, config):
-    '''
-    解包
-    '''
-    apktoolPath = file_utils.getApkToolPath()
-    gamePath = file_utils.getFullGameApk(config,game)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    if os.path.exists(decompliePath):
-        print('delete decomplie folder...')
-        file_utils.deleteFolder(decompliePath)
-
-    print('decomplie apk...')
-
-    return file_utils.execJarCmd(apktoolPath, 'd -f "%s" -o "%s"' % (gamePath, decompliePath))
-
-def removeOldRes(game, sdk, subChannel, config):
-    '''
-    删除旧资源
-    '''
-    print('delete res ...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    for subPath in config['deleteList']:
-        resPath = os.path.join(decompliePath, subPath)
-        if os.path.exists(resPath):
-            os.remove(resPath)
-            print('delete ' + resPath)
-    return 0
-
-def removeOldCode(game, sdk, subChannel, config):
-    '''
-    删除旧代码
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    codePath = os.path.join(decompliePath, 'smali', 'com', 'jmhy', 'lib', 'record')
-    #file_utils.deleteFolder(codePath)
-    allFiles = []
-    allFiles = file_utils.list_files(codePath, allFiles)
-    for f in allFiles:
-        fpath, fname = os.path.split(f)  #分离文件名和路径
-        if fname == 'R.smali' or fname.startswith('R$'):
-            continue
-        os.remove(f)
-        print('remove %s' % f)
-    return 0
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    复制res资源
-    '''
-    # 拷贝sdk资源
-    print('copy res...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    resPath = os.path.join(sdkPath, 'res')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-
-    for d in os.listdir(resPath):
-        copyResWithType(resPath, decomplieResPath, d)
-
-    # 拷贝assets
-    print('copy assets...')
-    assetsPath = file_utils.getFullPath(sdkPath, 'assets')
-    decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-    if os.path.exists(assetsPath):
-        ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-        if ret:
-            return ret
-
-    # 拷贝jniLib
-    print('copy jniLibs...')
-    jniPath = file_utils.getFullPath(sdkPath, 'jniLibs')
-    decomplieJniPath = file_utils.getFullPath(decompliePath, 'lib')
-    abiFilters = []
-    if os.path.exists(decomplieJniPath):
-        for abi in os.listdir(decomplieJniPath):
-            if abi == 'armeabi-v7a' or abi == 'armeabi':
-                abiFilters.append(abi)
-    else:
-        abiFilters = ['armeabi-v7a']
-
-    if os.path.exists(jniPath):
-        ret = file_utils.copyFileAllDir(jniPath, decomplieJniPath, False, abiFilters)
-        if ret:
-            return ret
-
-    return 0
-
-def mergeDrawableRes(game, sdk, subChannel, config):
-    '''
-    合并Drawable-v4目录
-    '''
-    print('merge drawable path...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-
-    for path in os.listdir(resPath):
-        print('res path %s' % path)
-        if (path.startswith('drawable') or path.startswith('mipmap')) and path.endswith('-v4'):
-            print('merge path %s' % path)
-            v4DrawablePath = os.path.join(resPath, path)
-            drawablePath = os.path.join(resPath, path[:-3])
-
-            if os.path.exists(drawablePath):
-                ret = file_utils.copyFileAllDir(v4DrawablePath, drawablePath, True)
-                if ret:
-                    return ret
-            else:
-                os.rename(v4DrawablePath, drawablePath)
-    return 0
-
-def removeSameRes(game, sdk, subChannel, config):
-    '''
-    移除相同的资源
-    '''
-    # 读取sdk的资源
-    print('remove same res...')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    sdkResPath = os.path.join(sdkPath, 'res')
-    resList = []
-    for path in os.listdir(sdkResPath):
-        if not path.startswith('values'):
-            continue
-
-        absPath = os.path.join(sdkResPath, path)
-        for resFile in os.listdir(absPath):
-            '''if not resFile.startswith('jm_'):
-                continue'''
-
-            resList = xml_utils.readAllRes(os.path.join(absPath, resFile), resList)
-
-    if len(resList) == 0:
-        print('no same res found')
-        return 0
-
-    removeList = []
-    # 移除相同的资源
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-    for path in os.listdir(resPath):
-        if not path.startswith('values'):
-            continue
-
-        absPath = os.path.join(resPath, path)
-        for resFile in os.listdir(absPath):
-            print('resFile ==> ' + os.path.join(absPath, resFile))
-            #xml_utils.removeSameRes(os.path.join(absPath, resFile), resList)
-            removeList = xml_utils.removeSameRes2(os.path.join(absPath, resFile), resList, removeList)
-
-    print('--------------')
-    print(removeList)
-    if len(removeList) == 0:
-        print('no same res remove')
-        return 0
-    publicResPath = os.path.join(decompliePath, 'res/values/public.xml')
-    print('publicResPath ---->' + publicResPath)
-    xml_utils.removeIdFromPublic(publicResPath,removeList)
-
-
-    return 0
-
-def mergeManifestRes(game, sdk, subChannel, config):
-    '''
-    合并主文件
-    '''
-    print('merge AndroidManifest...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    libManifest = file_utils.getFullPath(sdkPath, 'manifest.xml')
-    return xml_utils.mergeManifestRes(manifest, libManifest)
-
-def copyAppRes(game, sdk, subChannel, config):
-    '''
-    拷贝app的资源,比如app icon、启动图等
-    '''
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    # assets
-    print('copy assets...')
-    assetsPath = file_utils.getFullPath(channelPath, 'assets')
-    decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-    if os.path.exists(assetsPath):
-        ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-        if ret:
-            return ret
-
-    # icon
-    print('copy icon...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'icon')
-    if ret:
-        return ret
-    # 启动图
-    print('copy splash...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'splash')
-    if ret:
-        return ret
-    # 其他图片
-    print('copy image...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'image')
-    if ret:
-        return ret
-    return 0
-
-def mergeLanguage(game, sdk, subChannel, config):
-    '''
-    合并语言文件
-    '''
-    print('merge language...')
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    mergePath = file_utils.getFullPath(channelPath, 'merge')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    if not os.path.exists(mergePath):
-        print('%s not exists!' % mergePath)
-        return 0
-
-    if not os.path.isdir(mergePath):
-        print('%s not a dir!' % mergePath)
-        return 0
-
-    for fileName in os.listdir(mergePath):
-        mergeJson(mergePath, decompliePath, fileName)
-    return 0
-
-def mergeJson(srcDir, changeDir, fileName):
-    srcFile = os.path.join(srcDir, fileName)
-    if os.path.isdir(srcFile):
-        for fileName2 in os.listdir(srcFile):
-            changeDir2 = os.path.join(changeDir, fileName)
-            mergeJson(srcFile, changeDir2, fileName2)
-    else:
-        changeFile = os.path.join(changeDir, fileName)
-        if not os.path.exists(changeFile):
-            print('%s not exists!' % changeFile)
-            return 0
-        jsonText1 = file_utils.readFile(srcFile)
-        jsonText2 = file_utils.readFile(changeFile)
-        print('*************src config*************')
-        print(jsonText1)
-        print('************************************')
-        print('*************target config*************')
-        print(jsonText2)
-        print('************************************')
-
-        json1 = json.loads(jsonText1)
-        json2 = json.loads(jsonText2)
-
-        for item in json1:
-            if item in json2:
-                json2[item] = json1[item]
-
-        jsonStr = json.dumps(json2, ensure_ascii=False)
-        print('*************merge config*************')
-        print(jsonStr)
-        print('************************************')
-        print('>> %s' % changeFile)
-        file_utils.createFile(changeFile, jsonStr)
-    return 0
-    
-def copyAppResWithType(decompliePath, channelPath, typeName):
-    decomplieResPath = os.path.join(decompliePath, 'res')
-    iconPath = os.path.join(channelPath, typeName)
-    if not os.path.exists(iconPath):
-        print('dir "%s" not exists' % iconPath)
-        return 0
-    for d in os.listdir(iconPath):
-        ret = copyResWithType(iconPath, decomplieResPath, d)
-        if ret:
-            return ret
-
-    return 0
-
-def copyResWithType(resPath, decomplieResPath, typeName):
-    # appt的打包目录会带-v4后缀
-    resDir = os.path.join(resPath, typeName)
-    target = os.path.join(decomplieResPath, typeName)
-    targetV4 = os.path.join(decomplieResPath, typeName + '-v4')
-    if not os.path.exists(target) and not os.path.exists(targetV4):
-        os.makedirs(target)
-        return file_utils.copyFileAllDir(resDir, target, False)
-    elif not os.path.exists(target):
-        return file_utils.copyFileAllDir(resDir, targetV4, False)
-    else:
-        return file_utils.copyFileAllDir(resDir, target, False)
-
-def removeNoSupportAttr(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的属性
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersion')
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersionCodename')
-    
-    return 0
-
-def fixUnSupportConfig(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的配置
-    '''
-    # 检查minSdkVersion
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    minSdkVersion = 15
-    file_utils.changeMinSdkVersion(yml, minSdkVersion)
-
-    resPath = os.path.join(decompliePath, 'res')
-
-    tag = '-v'
-    for res in os.listdir(resPath):
-        print('res = ' + res)
-        if res.startswith('values') and tag in res:
-            start = res.index(tag)
-            version = res[start+len(tag):]
-            if not version.isdigit():
-                continue
-            
-            version = int(version)
-            print('version = %d' % version)
-            if version < minSdkVersion:
-                unSopportPath = os.path.join(resPath, res)
-                print('unSopportPath = ' + unSopportPath)
-                file_utils.deleteFolder(unSopportPath)
-                print('deleteFolder = ' + unSopportPath)
-    
-    return 0
-
-def changePackageName(game, sdk, subChannel, config):
-    '''
-    更改包名
-    '''
-    # 全局替换AndroidManifest里面的包名
-    newPackageName = config['packageName']
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    packageName = xml_utils.getPackageName(manifest)
-    
-    xml_utils.changePackageName(manifest, newPackageName)
-    print('change package name %s --> %s' % (packageName, newPackageName))
-    return 0
-
-def getPackageName(game, sdk, subChannel, config):
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    packageName = xml_utils.getPackageName(manifest)
-    return packageName
-
-def changeAppName(game, sdk, subChannel, config):
-    '''
-    更改app名
-    '''
-    # 生成string.xml文件
-    name = config['name']
-
-    resName = 'shanshen_sdk_name'
-    if 'outName' in config:
-        resName = resName + '_' + config['outName']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    stringFile = os.path.join(decompliePath, 'res', 'values', 'sdk_strings_temp.xml')
-    content = '<?xml version="1.0" encoding="utf-8"?><resources><string name="%s">%s</string></resources>' % (resName, name)
-    file_utils.createFile(stringFile, content)
-
-    # 修改主文件的app名的值
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppName(manifest, '@string/%s' % resName)
-    print('change app name %s' % name)
-    return 0
-
-def changeAppIcon(game, sdk, subChannel, config):
-    '''
-    更改app icon
-    '''
-    print('change app icon...')
-    resName = 'record_sdk_icon'
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppIcon(manifest, '@mipmap/%s' % resName)
-    return 0
-
-def addMetaData(game, sdk, subChannel, config):
-    '''
-    添加meta-data
-    '''
-    if 'metaData' not in config:
-        return 0
-
-    print('add meta-data...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.addMetaData(manifest, config['metaData'])
-    return 0
-
-def addConfig(game, sdk, subChannel, config):
-    '''
-    添加config.json
-    '''
-    if 'configData' not in config:
-        print('configData is null')
-        return 0
-
-    print('add config.json...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    configJson = os.path.join(decompliePath, 'assets', 'tool_config.json')
-    jsonText = json.dumps(config['configData'], ensure_ascii=False)
-    file_utils.createFile(configJson, jsonText)
-    return 0
-
-def changePlaceholders(game, sdk, subChannel, config):
-    '''
-    处理掉占位符
-    '''
-    if 'placeholders' not in config:
-        return 0
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-
-    placeholders = config['placeholders']
-    for placeholder in placeholders:
-        oldText = '${%s}' % placeholder
-        newText = placeholders[placeholder]
-        print('change placeholder %s -> %s' % (oldText, newText))
-        file_utils.replaceContent(manifest, oldText, newText)
-
-    return 0
-
-def addLauncher(game, sdk, subChannel, config):
-    '''
-    添加启动图
-    '''
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    splashPath = os.path.join(channelPath, 'splash')
-    if len(os.listdir(splashPath)) == 0:
-        print('dir splash is empty')
-        return 0
-
-    print('add launcher...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    activity = xml_utils.getLauncherActivityName(manifest)
-    if activity == 'com.shanshen.sdk.template.LauncherActivity':
-        print('add launcher already exist...')
-        return 1
-
-    # 添加关联资源
-    internalPath = os.path.join(file_utils.getCurrentPath(), 'internal_shanshen')
-    ret = copyAppResWithType(decompliePath, internalPath, 'launcher_res')
-    if ret:
-        return ret
-
-    # 拷贝代码
-    print('copy launcher code...')
-    codePath = os.path.join(internalPath, 'launcher_code', 'smali')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(codePath, smaliPath)
-    if ret:
-        return ret
-
-    # 修改主文件信息
-    print('change launcher config...')
-    orientation = xml_utils.getScreenOrientation(manifest)
-    activity = xml_utils.removeLauncherActivity(manifest)
-    xml_utils.addLauncherActivity(manifest, orientation, 'com.shanshen.sdk.template.LauncherActivity')
-
-    # 修改跳转的
-    launcherActivity = os.path.join(decompliePath, 'smali', 'com', 'shanshen', 'sdk', 'template', 'LauncherActivity.smali')
-    file_utils.replaceContent(launcherActivity, '{class}', activity)
-
-    print('change launcher %s to %s' % (activity, 'com.shanshen.sdk.template.LauncherActivity'))
-
-    # config['oldLauncher'] = activity
-
-    if 'launcherTime' in config:
-        timeHex = formatHex(config['launcherTime'])
-        file_utils.replaceContent(launcherActivity, '0x0BB8', timeHex)
-
-    return 0
-
-def addMoreIcon(game, sdk, subChannel, config):
-    '''
-    添加多个图标
-    '''
-    print('add more icon support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    icon = '@mipmap/common_sdk_icon'
-    if not config['changeIcon']:
-        manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-        icon = xml_utils.getApplicationAttr(manifest, 'icon')
-
-    switchIcon = icon
-    if config['switchIcon']:
-        switchIcon = '@mipmap/common_sdk_icon2'
-
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    return xml_utils.addMoreIcon(manifest, icon, switchIcon)
-
-def formatHex(millisecond):
-    '''
-    将毫秒转为16进制,4位格式
-    '''
-    timeHex = str(hex(millisecond)).upper()
-    timeHex = timeHex[2:]
-    formatHex = ''
-    if len(timeHex) == 3:
-        formatHex = '0x0' + timeHex
-    elif len(timeHex) == 4:
-        formatHex = '0x' + timeHex
-    else:
-        formatHex = '0x0BB8'
-    return formatHex
-
-def doSDKPostScript(game, sdk, config):
-    '''
-    执行sdk相关特殊处理脚本
-    '''
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    scriptPath = os.path.join(sdkPath, 'script')
-    targetScript = os.path.join(scriptPath, 'sdk_script.py')
-    if not os.path.exists(targetScript):
-        print('sdk_script no exists')
-        return 0
-
-    print('doSDKPostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('sdk_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def doGamePostScript(game, sdk, config):
-    '''
-    执行游戏相关特殊处理脚本
-    '''
-    channelPath = file_utils.getFullGamePath(game)
-    scriptPath = os.path.join(channelPath, 'script')
-    targetScript = os.path.join(scriptPath, 'game_script.py')
-    if not os.path.exists(targetScript):
-        print('game_script no exists')
-        return 0
-
-    print('doGamePostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('game_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def generateNewRFile(game, sdk, subChannel, config):
-    '''
-    生成新的R文件
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    androidPlatforms = file_utils.getAndroidCompileToolPath()
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-    compliePath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(compliePath):
-        os.makedirs(compliePath)
-
-    # 生成R文件
-    print('create R.java ...')
-    if config['aapt2disable']:
-        aapt = file_utils.getAAPTPath()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-        createRCmd = '"%s" p -f -m -J "%s" -S "%s" -I "%s" -M "%s"' % (aapt, compliePath, decomplieResPath, androidPlatforms, manifest)
-        ret = file_utils.execFormatCmd(createRCmd)
-        if ret:
-            return ret
-    else:
-        # compile
-        aapt = file_utils.getAAPT2Path()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-
-        print('compiled res ...')
-        complieResPath = os.path.join(compliePath, 'compiled')
-        complieResCmd = '"%s" compile --dir "%s" -o "%s"' % (aapt, decomplieResPath, complieResPath)
-        file_utils.execFormatCmd(complieResCmd)
-
-        # unzip
-        print('unzip compiled res ...')
-        unzipResPath = os.path.join(compliePath, 'aapt2_res')
-        with zipfile.ZipFile(complieResPath) as zf:
-            zf.extractall(unzipResPath)
-            print('create unzip %s' % unzipResPath)
-
-        # link
-        print('link res ...')
-        outApk = os.path.join(compliePath, 'res.apk')
-        linkResCmd = '"%s" link -o "%s" -I "%s" --manifest "%s" --java "%s" --auto-add-overlay' % (aapt, outApk, androidPlatforms, manifest, compliePath)
-        for filename in os.listdir(unzipResPath):
-            linkResCmd += ' %s' % filename
-        print('link cmd len is %s' % len(linkResCmd))
-        ret = file_utils.execFormatCmd(linkResCmd, unzipResPath)
-        if ret:
-            return ret
-
-    # 编译R文件
-    print('complie R.java ...')
-    packageName = xml_utils.getPackageName(manifest)
-    packagePath = file_utils.getPackagePath(compliePath, packageName)
-    RSourceFile = os.path.join(packagePath, 'R.java')
-    complieRCmd = 'javac -source 1.8 -target 1.8 -encoding UTF-8 "%s"' % RSourceFile
-    ret = file_utils.execFormatCmd(complieRCmd)
-    if ret:
-        return ret
-
-    # 生成dex
-    print('dex R.class ...')
-    dx = file_utils.getDxPath()
-    outDex = os.path.join(compliePath, 'classes.dex')
-    ret = file_utils.execJarCmd(dx, '--dex --output="%s" "%s"' % (outDex, compliePath))
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy R.smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    file_utils.copyFileAllDir(outPath, smaliPath)
-    return 0
-
-def packJar(game, sdk, subChannel, config):
-    '''
-    打包所有的jar
-    '''
-    splitDex = config['splitDex']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outPath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(outPath):
-        os.makedirs(outPath)
-
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --multi-dex --no-warning --output="%s"' % outPath
-    else:
-        dx = file_utils.getD8Path()
-        androidPlatforms = file_utils.getAndroidCompileToolPath()
-        dexCmd = '--lib "%s" --output "%s"' % (androidPlatforms, outPath)
-
-    # 找到所有lib依赖
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    libs = os.path.join(sdkPath, 'libs')
-    libConfig = os.path.join(libs, 'config.json')
-
-    # 存在配置文件
-    if os.path.exists(libConfig):
-        jsonText = file_utils.readFile(libConfig)
-        libConf = json.loads(jsonText)
-        if 'libConfig' in config and config['libConfig'] in libConf:
-            conf = config['libConfig']
-            libList = libConf[conf]
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        elif 'default' in libConf:
-            libList = libConf['default']
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        else:
-            for jar in os.listdir(libs):
-                if not jar.endswith('.jar'):
-                    continue
-                dexCmd += ' ' + os.path.join(libs, jar)
-    else:
-        for jar in os.listdir(libs):
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-
-    # multidex.jar
-    if splitDex:
-        dexCmd += ' ' + file_utils.getMultiDexPath()
-
-    # sdk实现类
-    print('packageing all jar ...')
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    outDex = os.path.join(outPath, 'classes.dex')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy all smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(outPath, smaliPath, True)
-    if ret:
-        return ret
-
-    return 0
-
-def splitDex(game, sdk, subChannel, config):
-    '''
-    分割dex
-    '''
-    # 判断是否已经存在application
-    # 存在,则往原application添加内容
-    # 不存在,则拷贝一个默认的android.support.multidex.MultiDexApplication
-    print('add MultiDex support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    application = xml_utils.getApplicationAttr(manifest, 'name')
-    if application is None:
-        ret = xml_utils.changeApplicationAttr(manifest, 'name', 'android.support.multidex.MultiDexApplication')
-        if ret:
-            return ret
-    else:
-        smaliPath = os.path.join(decompliePath, 'smali')
-        applicationFile = file_utils.getPackagePath(smaliPath, application)
-        applicationFile += '.smali'
-        ret = changeApplicationDex(applicationFile)
-        if ret:
-            return ret
-
-    return splitSmali(game, sdk, subChannel, config, application)
-
-def changeApplicationDex(file):
-    '''
-    修改application的smali文件,增加MultiDex操作
-    '''
-    index = file_utils.getApplicationSmaliIndex(file)
-    file_utils.insertApplicationSmali(file, index)
-    return 0
-
-def splitSmali(game, sdk, subChannel, config, application):
-    '''
-    如果函数上限超过限制,自动拆分smali,以便生成多个dex文件
-    '''
-    print('splitSmali...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    smaliPath = os.path.join(decompliePath, 'smali')
-
-    appPackage = None
-    if application:
-        appPackage = application[:application.rfind('.')]
-        appPackage = appPackage.replace('.', '/')
-
-    allFiles = []
-    allFiles = file_utils.list_files(smaliPath, allFiles)
-    
-    #print('file count is %d' % len(allFiles))
-
-    #maxFuncNum = 65535
-    # 留一点空间,防止计算误差
-    maxFuncNum = 64000
-    currFucNum = 0
-    totalFucNum = 0
-
-    currDexIndex = 1
-
-    allRefs = []
-
-    #保证Application等类在第一个classex.dex文件中
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            currFucNum += smali_utils.get_smali_method_count(f, allRefs)
-
-    totalFucNum = currFucNum
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if not f.endswith('.smali'):
-            continue
-
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            continue
-
-        thisFucNum = smali_utils.get_smali_method_count(f, allRefs)
-        totalFucNum += thisFucNum
-
-        #print('%d # %d ==> %s' % (thisFucNum, currDexIndex, f))
-        #print('totalFucNum is %d' % totalFucNum)
-        if currFucNum + thisFucNum >= maxFuncNum:
-            currFucNum = thisFucNum
-            currDexIndex += 1
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            os.makedirs(newDexPath)
-        else:
-            currFucNum += thisFucNum
-
-        if currDexIndex > 1:
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            targetFile = newDexPath + f[len(smaliPath):]
-            file_utils.copyFile(f, targetFile, True)
-    return 0
-
-def changeVersion(game, sdk, subChannel, config):
-    '''
-    更改版本号
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    versionCode = None
-    versionName = None
-    targetSdkVersion = None
-    if 'versionCode' in config:
-        versionCode = config['versionCode']
-    if 'versionName' in config:
-        versionName = config['versionName']
-    if 'targetSdkVersion' in config:
-        targetSdkVersion = config['targetSdkVersion']
-
-    return file_utils.changeVersion(yml, versionCode, versionName, targetSdkVersion)
-
-def recomplie(game, sdk, subChannel, config):
-    '''
-    回编译
-    '''
-    print('recomplie apk...')
-    apktoolPath = file_utils.getApkToolPath()
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-
-    useAppt2 = ' --use-aapt2'
-    if config['aapt2disable']:
-        useAppt2 = ''
-
-    return file_utils.execJarCmd(apktoolPath, 'b -f "%s" -o "%s"%s' % (decompliePath, outApk, useAppt2))
-
-def alignApk(game, sdk, subChannel, config):
-    '''
-    对齐apk
-    '''
-    print('align apk...')
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    alignapkTool = file_utils.getAlignPath()
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-
-    ret = file_utils.getExecPermission(alignapkTool)
-    if ret:
-        return ret
-
-    # zipalign.exe -v -p 4 input.apk output.apk
-    return file_utils.execFormatCmd('"%s" -f -p 4 "%s" "%s"' % (alignapkTool, outApk, alignApk))
-
-def apksignerApk(game, sdk, subChannel, config):
-    '''
-    签名apk
-    '''
-    print('sign apk...')
-    path = os.path.join(file_utils.getCurrentPath(), 'keystore', 'key.json')
-    jsonText = file_utils.readFile(path)
-    signConfig = json.loads(jsonText)
-    keystore = {}
-    if game in signConfig:
-        if sdk in signConfig[game] and subChannel in signConfig[game][sdk]:
-            keystore = signConfig[game][sdk][subChannel]
-        else:
-            keystore = signConfig['default']
-    else:
-        keystore = signConfig['default']
-
-    print('storeFile is "%s"' % keystore['storeFile'])
-    
-    apksigner = file_utils.getApksignerPath()
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    storeFile = os.path.join(file_utils.getCurrentPath(), 'keystore', keystore['storeFile'])
-
-    if 'outName' in config and 'outPath' in config:
-        if not os.path.exists(config['outPath']):
-            os.makedirs(config['outPath'])
-
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-        print('signedApk = ' + signedApk)
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-        print('signedApk = ' + signedApk)
-
-    # java -jar apksigner.jar sign --ks key.jks --ks-key-alias releasekey --ks-pass pass:pp123456 --key-pass pass:pp123456 --out output.apk input.apk
-    v2disable = ''
-    if 'v2disable' in config and config['v2disable']:
-        v2disable = ' --v2-signing-enabled=false'
-        
-    return file_utils.execJarCmd(apksigner, 'sign%s --ks "%s" --ks-key-alias %s --ks-pass pass:%s --key-pass pass:%s --out "%s" "%s"' % (v2disable, storeFile, keystore['keyAlias'], keystore['storePassword'], keystore['keyPassword'], signedApk, alignApk))
-
-def addChannel(game, sdk, subChannel, config):
-    '''
-    添加渠道信息
-    '''
-    if 'v2disable' in config and config['v2disable']:
-        return 0
-    
-    walle = file_utils.getWallePath()
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    if 'outName' in config and 'outPath' in config:
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-
-    properties = config['properties']
-
-    appid = ''
-    appkey = ''
-    if 'appid' in properties:
-        appid = properties['appid']
-    if 'appkey' in properties:
-        appkey = properties['appkey']
-
-    return file_utils.execJarCmd(walle, 'put -e version=%s,agent=%s,appid=%s,appkey=%s "%s" "%s"' % (config_utils_record.getDate(), properties['agent'], appid, appkey, signedApk, signedApk))
-
-def clearTemp(game, sdk, subChannel, config):
-    '''
-    清空中间产生的文件
-    '''
-    print('clear temp...')
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-    if os.path.exists(outApk):
-        os.remove(outApk)
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    file_utils.deleteFolder(decompliePath)
-
-    print('clear temp end')
-
-def packConsoleInput():
-    '''
-    控制台打包
-    '''
-    if len(sys.argv) < 3:
-        print('argument is missing')
-        return 1
-
-    # 校验参数
-    game = sys.argv[1]
-    sdk = sys.argv[2]
-    # 可选参数,没有则默认打全部渠道
-    subChannel = None
-    if len(sys.argv) > 3:
-        subChannel = sys.argv[3]
-        
-    return packConsole(game, sdk, subChannel)
-
-def packConsole(game, sdk, subChannel):
-    '''
-    控制台打包
-    '''
-    if not os.path.exists(file_utils.getFullGameApk(game)):
-        print('game "%s" not exists' % game)
-        return 1
-    if not os.path.exists(file_utils.getFullSDKPath(sdk)):
-        print('sdk "%s" not exists' % sdk)
-        return 1
-
-    # 读取配置
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    if not os.path.exists(configPath):
-        print('%s not exists' % configPath)
-        return 1
-    
-    jsonText = file_utils.readFile(configPath)
-    config = json.loads(jsonText)
-
-    # 检查参数
-    if not config_utils_record.checkConfig(config):
-        return 1
-
-    # 处理参数
-    config_utils_record.replaceArgs(config)
-
-    successCount = 0
-    failureCount = 0
-    if type(config) == dict:
-        if subChannel is None or config['subChannel'] == subChannel:
-            ret = pack(game, sdk, config)
-            if ret:
-                failureCount += 1
-            else:
-                successCount += 1
-        else:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-    elif type(config) == list:
-        found = False
-        for itemConfig in config:
-            if subChannel is None or itemConfig['subChannel'] == subChannel:
-                found = True
-                ret = pack(game, sdk, itemConfig)
-                if ret:
-                    failureCount += 1
-                else:
-                    successCount += 1
-
-        if not found:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-
-    print('success %d, failure %d' % (successCount, failureCount))
-        
-    return 0
-
-def copyEntryActivityCode(game, sdk, subChannel, config):
-    '''
-    拷贝代码
-    '''
-    print('copy EntryActivity.smali')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    EntryActivity = 'EntryActivity.smali'
-    entryFile = os.path.join(sdkPath, 'smali', EntryActivity)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    smaliPath = os.path.join(decompliePath, 'smali')
-    targetPath = file_utils.getPackagePath(smaliPath, config['packageName'])
-    targetFile = os.path.join(targetPath, EntryActivity)
-    ret = file_utils.copyFile(entryFile, targetFile)
-    if ret:
-        return ret
-    writeActivityToManifest(os.path.join(decompliePath, 'AndroidManifest.xml'),config)
-    oldText = 'com/jmhy/floatsdk/sample/EntryActivity'
-    newText = config['packageName'].replace('.', '/') + "/EntryActivity"
-    print("EntryActivity.smali change '{}' to '{}' ...".format(oldText,newText))
-    file_utils.replaceContent(targetFile, oldText, newText)
-    return 0
-
-def writeActivityToManifest(targetManifest, config):
-    androidNS = 'http://schemas.android.com/apk/res/android'
-    ET.register_namespace('android', androidNS)
-    targetTree = ET.parse(targetManifest)
-    targetRoot = targetTree.getroot()
-    appNode = targetRoot.find('application')
-    activitys = appNode.findall('activity')
-    keyName = "{0}{1}{2}name".format("{",androidNS,"}")
-    theme = "{0}{1}{2}theme".format("{",androidNS,"}")
-    for activity in activitys:
-        activityName = activity.get(keyName)
-        if activityName.find('.EntryActivity')>=0:
-            oldName = activityName;
-            newName = config['packageName'] + ".EntryActivity"
-            activity.set(keyName,newName)
-            print("EntryActivity change '{}' to '{}' ...".format(oldName, newName))
-        if activityName.find('com.tool.floatsdk.ui.WebActivity')>=0:
-            if activity.get(theme) is not None or activity.get(theme) != "":
-                del activity.attrib[theme]
-
-    perNode = targetRoot.find('permissions')
-    #permissions = perNode.findall('uses-permission')
-    print(perNode)
-    print("------------")
-
-    targetTree.write(targetManifest, 'UTF-8')
-
-
-
-

+ 0 - 1075
package_utils_shanshen.py

@@ -1,1075 +0,0 @@
-# 安卓游戏打包脚本
-# 1.用apktool解包
-# 2.复制res资源、assets资源、jniLib资源
-# 3.修改包名、app名、渠道文件
-# 4.添加app icon、合并AndroidManifest文件
-# 5.添加app启动图,修改AndroidManifest文件
-# 6.生成新的R文件
-# 7.将新的R文件编译,生成dex,再用baksmali生成smali,替换旧的R文件
-# 8.将jar资源打包成dex,再用baksmali生成smali,拷贝到smali目录下
-# 9.统计方法量,并分割dex(将smali文件拷贝到目录smali_classes2)
-# 10.用apktool回包
-# 11.重新签名
-import file_utils
-import xml_utils
-import smali_utils
-import config_utils_shanshen
-import game_utils
-import os
-import os.path
-import json
-import sys
-import importlib
-import uuid
-import zipfile
-
-def pack(game, sdk, config):
-    config['cache'] = uuid.uuid1()
-    subChannel = config['subChannel']
-    # 解包
-    ret = decomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 删除旧代码
-    ret = removeOldCode(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 删除一些不支持的属性
-    ret = removeNoSupportAttr(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 删除一些不支持的配置
-    ret = fixUnSupportConfig(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 合并Drawable-v4目录
-    ret = mergeDrawableRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 移除相同的资源
-    ret = removeSameRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 复制res资源
-    ret = copyRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 合并主文件
-    ret = mergeManifestRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 替换占位符
-    ret = changePlaceholders(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 添加meta-data
-    ret = addMetaData(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 复制app res资源
-    ret = copyAppRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 更改包名
-    if 'packageName' in config and config['packageName'] != '':
-        ret = changePackageName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    else:
-        config['packageName'] = getPackageName(game, sdk, subChannel, config)
-    # 更改app名
-    if 'name' in config and config['name'] != '':
-        ret = changeAppName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改app icon
-    if config['changeIcon']:
-        ret = changeAppIcon(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 添加启动图操作
-    if config['addLauncher']:
-        ret = addLauncher(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 打包lib依赖
-    ret = packJar(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # sdk脚本处理
-    ret = doSDKPostScript(game, sdk, config)
-    if ret:
-        return ret
-    # 乐变sdk的特殊处理
-    ret = game_utils.sdkLebianChange(game, sdk, config)
-    if ret:
-        return ret
-    # 游戏脚本处理
-    ret = doGamePostScript(game, sdk, config)
-    if ret:
-        return ret
-    # 生成R文件
-    '''ret = generateNewRFile(game, sdk, subChannel, config)
-    if ret:
-        return ret'''
-    # 添加MultiDex支持
-    if config['splitDex']:
-        ret = splitDex(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改版本号
-    ret = changeVersion(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 回编译
-    ret = recomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 对齐apk
-    ret = alignApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 签名
-    ret = apksignerApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 添加渠道信息
-    ret = addChannel(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 清理产生的中间文件
-    if config['clearCache']:
-        clearTemp(game, sdk, subChannel, config)
-
-    return 0
-
-def decomplie(game, sdk, subChannel, config):
-    '''
-    解包
-    '''
-    apktoolPath = file_utils.getApkToolPath()
-    gamePath = file_utils.getFullGameApk(game)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    if os.path.exists(decompliePath):
-        print('delete decomplie folder...')
-        file_utils.deleteFolder(decompliePath)
-
-    print('decomplie apk...')
-
-    return file_utils.execJarCmd(apktoolPath, 'd -f "%s" -o "%s"' % (gamePath, decompliePath))
-
-def removeOldCode(game, sdk, subChannel, config):
-    '''
-    删除旧代码
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    codePath = os.path.join(decompliePath, 'smali', 'com', 'shanshen', 'sdk')
-    #file_utils.deleteFolder(codePath)
-    allFiles = []
-    allFiles = file_utils.list_files(codePath, allFiles)
-    for f in allFiles:
-        fpath, fname = os.path.split(f)  #分离文件名和路径
-        if fname == 'R.smali' or fname.startswith('R$'):
-            continue
-        os.remove(f)
-        print('remove %s' % f)
-    return 0
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    复制res资源
-    '''
-    # 拷贝sdk资源
-    print('copy res...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    resPath = os.path.join(sdkPath, 'res')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-
-    for d in os.listdir(resPath):
-        copyResWithType(resPath, decomplieResPath, d)
-
-    # 拷贝assets
-    print('copy assets...')
-    assetsPath = file_utils.getFullPath(sdkPath, 'assets')
-    decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-    if os.path.exists(assetsPath):
-        ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-        if ret:
-            return ret
-
-    # 拷贝jniLib
-    print('copy jniLibs...')
-    jniPath = file_utils.getFullPath(sdkPath, 'jniLibs')
-    decomplieJniPath = file_utils.getFullPath(decompliePath, 'lib')
-    abiFilters = []
-    if os.path.exists(decomplieJniPath):
-        for abi in os.listdir(decomplieJniPath):
-            if abi == 'armeabi-v7a' or abi == 'armeabi':
-                abiFilters.append(abi)
-    else:
-        abiFilters = ['armeabi-v7a']
-
-    if os.path.exists(jniPath):
-        ret = file_utils.copyFileAllDir(jniPath, decomplieJniPath, False, abiFilters)
-        if ret:
-            return ret
-    return 0
-
-def mergeDrawableRes(game, sdk, subChannel, config):
-    '''
-    合并Drawable-v4目录
-    '''
-    print('merge drawable path...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-
-    for path in os.listdir(resPath):
-        print('res path %s' % path)
-        if (path.startswith('drawable') or path.startswith('mipmap')) and path.endswith('-v4'):
-            print('merge path %s' % path)
-            v4DrawablePath = os.path.join(resPath, path)
-            drawablePath = os.path.join(resPath, path[:-3])
-
-            if os.path.exists(drawablePath):
-                ret = file_utils.copyFileAllDir(v4DrawablePath, drawablePath, True)
-                if ret:
-                    return ret
-            else:
-                os.rename(v4DrawablePath, drawablePath)
-    return 0
-
-def removeSameRes(game, sdk, subChannel, config):
-    '''
-    移除相同的资源
-    '''
-    # 读取sdk的资源
-    print('remove same res...')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    sdkResPath = os.path.join(sdkPath, 'res')
-    resList = []
-    for path in os.listdir(sdkResPath):
-        if not path.startswith('values'):
-            continue
-
-        absPath = os.path.join(sdkResPath, path)
-        for resFile in os.listdir(absPath):
-            '''if not resFile.startswith('jm_'):
-                continue'''
-
-            resList = xml_utils.readAllRes(os.path.join(absPath, resFile), resList)
-
-    if len(resList) == 0:
-        print('no same res found')
-        return 0
-
-    # 移除相同的资源
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-    for path in os.listdir(resPath):
-        if not path.startswith('values'):
-            continue
-
-        absPath = os.path.join(resPath, path)
-        for resFile in os.listdir(absPath):
-            xml_utils.removeSameRes(os.path.join(absPath, resFile), resList)
-
-    return 0
-
-def mergeManifestRes(game, sdk, subChannel, config):
-    '''
-    合并主文件
-    '''
-    print('merge AndroidManifest...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    libManifest = file_utils.getFullPath(sdkPath, 'manifest.xml')
-    return xml_utils.mergeManifestRes(manifest, libManifest)
-
-def copyAppRes(game, sdk, subChannel, config):
-    '''
-    拷贝app的资源,比如app icon、启动图等
-    '''
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    # assets
-    print('copy assets...')
-    assetsPath = file_utils.getFullPath(channelPath, 'assets')
-    decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-    if os.path.exists(assetsPath):
-        ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-        if ret:
-            return ret
-
-    # icon
-    print('copy icon...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'icon')
-    if ret:
-        return ret
-    # 启动图
-    print('copy splash...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'splash')
-    if ret:
-        return ret
-    # 其他图片
-    print('copy image...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'image')
-    if ret:
-        return ret
-    return 0
-    
-def copyAppResWithType(decompliePath, channelPath, typeName):
-    decomplieResPath = os.path.join(decompliePath, 'res')
-    iconPath = os.path.join(channelPath, typeName)
-    if not os.path.exists(iconPath):
-        print('dir "%s" not exists' % iconPath)
-        return 0
-    for d in os.listdir(iconPath):
-        ret = copyResWithType(iconPath, decomplieResPath, d)
-        if ret:
-            return ret
-
-    return 0
-
-def copyResWithType(resPath, decomplieResPath, typeName):
-    # appt的打包目录会带-v4后缀
-    resDir = os.path.join(resPath, typeName)
-    target = os.path.join(decomplieResPath, typeName)
-    targetV4 = os.path.join(decomplieResPath, typeName + '-v4')
-    if not os.path.exists(target) and not os.path.exists(targetV4):
-        os.makedirs(target)
-        return file_utils.copyFileAllDir(resDir, target, False)
-    elif not os.path.exists(target):
-        return file_utils.copyFileAllDir(resDir, targetV4, False)
-    else:
-        return file_utils.copyFileAllDir(resDir, target, False)
-
-def removeNoSupportAttr(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的属性
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersion')
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersionCodename')
-    
-    return 0
-
-def fixUnSupportConfig(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的配置
-    '''
-    # 检查minSdkVersion
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    minSdkVersion = 15
-    file_utils.changeMinSdkVersion(yml, minSdkVersion)
-
-    resPath = os.path.join(decompliePath, 'res')
-
-    tag = '-v'
-    for res in os.listdir(resPath):
-        print('res = ' + res)
-        if res.startswith('values') and tag in res:
-            start = res.index(tag)
-            version = res[start+len(tag):]
-            if not version.isdigit():
-                continue
-            
-            version = int(version)
-            print('version = %d' % version)
-            if version < minSdkVersion:
-                unSopportPath = os.path.join(resPath, res)
-                print('unSopportPath = ' + unSopportPath)
-                file_utils.deleteFolder(unSopportPath)
-                print('deleteFolder = ' + unSopportPath)
-    
-    return 0
-
-def changePackageName(game, sdk, subChannel, config):
-    '''
-    更改包名
-    '''
-    # 全局替换AndroidManifest里面的包名
-    newPackageName = config['packageName']
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    packageName = xml_utils.getPackageName(manifest)
-    
-    xml_utils.changePackageName(manifest, newPackageName)
-    print('change package name %s --> %s' % (packageName, newPackageName))
-    return 0
-
-def getPackageName(game, sdk, subChannel, config):
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    packageName = xml_utils.getPackageName(manifest)
-    return packageName
-
-def changeAppName(game, sdk, subChannel, config):
-    '''
-    更改app名
-    '''
-    # 生成string.xml文件
-    name = config['name']
-
-    resName = 'shanshen_sdk_name'
-    if 'outName' in config:
-        resName = resName + '_' + config['outName']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    stringFile = os.path.join(decompliePath, 'res', 'values', 'sdk_strings_temp.xml')
-    content = '<?xml version="1.0" encoding="utf-8"?><resources><string name="%s">%s</string></resources>' % (resName, name)
-    file_utils.createFile(stringFile, content)
-
-    # 修改主文件的app名的值
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppName(manifest, '@string/%s' % resName)
-    print('change app name %s' % name)
-    return 0
-
-def changeAppIcon(game, sdk, subChannel, config):
-    '''
-    更改app icon
-    '''
-    print('change app icon...')
-    resName = 'shanshen_sdk_icon'
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppIcon(manifest, '@mipmap/%s' % resName)
-    return 0
-
-def addMetaData(game, sdk, subChannel, config):
-    '''
-    添加meta-data
-    '''
-    if 'metaData' not in config:
-        return 0
-
-    print('add meta-data...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.addMetaData(manifest, config['metaData'])
-    return 0
-
-def changePlaceholders(game, sdk, subChannel, config):
-    '''
-    处理掉占位符
-    '''
-    if 'placeholders' not in config:
-        return 0
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-
-    placeholders = config['placeholders']
-    for placeholder in placeholders:
-        oldText = '${%s}' % placeholder
-        newText = placeholders[placeholder]
-        print('change placeholder %s -> %s' % (oldText, newText))
-        file_utils.replaceContent(manifest, oldText, newText)
-
-    return 0
-
-def addLauncher(game, sdk, subChannel, config):
-    '''
-    添加启动图
-    '''
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    splashPath = os.path.join(channelPath, 'splash')
-    if len(os.listdir(splashPath)) == 0:
-        print('dir splash is empty')
-        return 0
-
-    print('add launcher...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    activity = xml_utils.getLauncherActivityName(manifest)
-    if activity == 'com.shanshen.sdk.template.LauncherActivity':
-        print('add launcher already exist...')
-        return 1
-    
-    # 添加关联资源
-    internalPath = os.path.join(file_utils.getCurrentPath(), 'internal_shanshen')
-    ret = copyAppResWithType(decompliePath, internalPath, 'launcher_res')
-    if ret:
-        return ret
-
-    # 拷贝代码
-    print('copy launcher code...')
-    codePath = os.path.join(internalPath, 'launcher_code', 'smali')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(codePath, smaliPath)
-    if ret:
-        return ret
-
-    # 修改主文件信息
-    print('change launcher config...')
-    orientation = xml_utils.getScreenOrientation(manifest)
-    activity = xml_utils.removeLauncherActivity(manifest)
-    xml_utils.addLauncherActivity(manifest, orientation, 'com.shanshen.sdk.template.LauncherActivity')
-
-    # 修改跳转的
-    launcherActivity = os.path.join(decompliePath, 'smali', 'com', 'shanshen', 'sdk', 'template', 'LauncherActivity.smali')
-    file_utils.replaceContent(launcherActivity, '{class}', activity)
-
-    print('change launcher %s to %s' % (activity, 'com.shanshen.sdk.template.LauncherActivity'))
-
-    # config['oldLauncher'] = activity
-
-    if 'launcherTime' in config:
-        timeHex = formatHex(config['launcherTime'])
-        file_utils.replaceContent(launcherActivity, '0x0BB8', timeHex)
-
-    return 0
-
-def addMoreIcon(game, sdk, subChannel, config):
-    '''
-    添加多个图标
-    '''
-    print('add more icon support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    icon = '@mipmap/common_sdk_icon'
-    if not config['changeIcon']:
-        manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-        icon = xml_utils.getApplicationAttr(manifest, 'icon')
-
-    switchIcon = icon
-    if config['switchIcon']:
-        switchIcon = '@mipmap/common_sdk_icon2'
-
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    return xml_utils.addMoreIcon(manifest, icon, switchIcon)
-
-def formatHex(millisecond):
-    '''
-    将毫秒转为16进制,4位格式
-    '''
-    timeHex = str(hex(millisecond)).upper()
-    timeHex = timeHex[2:]
-    formatHex = ''
-    if len(timeHex) == 3:
-        formatHex = '0x0' + timeHex
-    elif len(timeHex) == 4:
-        formatHex = '0x' + timeHex
-    else:
-        formatHex = '0x0BB8'
-    return formatHex
-
-def doSDKPostScript(game, sdk, config):
-    '''
-    执行sdk相关特殊处理脚本
-    '''
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    scriptPath = os.path.join(sdkPath, 'script')
-    targetScript = os.path.join(scriptPath, 'sdk_script.py')
-    if not os.path.exists(targetScript):
-        print('sdk_script no exists')
-        return 0
-
-    print('doSDKPostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('sdk_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def doGamePostScript(game, sdk, config):
-    '''
-    执行游戏相关特殊处理脚本
-    '''
-    channelPath = file_utils.getFullGamePath(game)
-    scriptPath = os.path.join(channelPath, 'script')
-    targetScript = os.path.join(scriptPath, 'game_script.py')
-    if not os.path.exists(targetScript):
-        print('game_script no exists')
-        return 0
-
-    print('doGamePostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('game_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def generateNewRFile(game, sdk, subChannel, config):
-    '''
-    生成新的R文件
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    androidPlatforms = file_utils.getAndroidCompileToolPath()
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-    compliePath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(compliePath):
-        os.makedirs(compliePath)
-
-    # 生成R文件
-    print('create R.java ...')
-    if config['aapt2disable']:
-        aapt = file_utils.getAAPTPath()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-        createRCmd = '"%s" p -f -m -J "%s" -S "%s" -I "%s" -M "%s"' % (aapt, compliePath, decomplieResPath, androidPlatforms, manifest)
-        ret = file_utils.execFormatCmd(createRCmd)
-        if ret:
-            return ret
-    else:
-        # compile
-        aapt = file_utils.getAAPT2Path()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-
-        print('compiled res ...')
-        complieResPath = os.path.join(compliePath, 'compiled')
-        complieResCmd = '"%s" compile --dir "%s" -o "%s"' % (aapt, decomplieResPath, complieResPath)
-        file_utils.execFormatCmd(complieResCmd)
-
-        # unzip
-        print('unzip compiled res ...')
-        unzipResPath = os.path.join(compliePath, 'aapt2_res')
-        with zipfile.ZipFile(complieResPath) as zf:
-            zf.extractall(unzipResPath)
-            print('create unzip %s' % unzipResPath)
-
-        # link
-        print('link res ...')
-        outApk = os.path.join(compliePath, 'res.apk')
-        linkResCmd = '"%s" link -o "%s" -I "%s" --manifest "%s" --java "%s" --auto-add-overlay' % (aapt, outApk, androidPlatforms, manifest, compliePath)
-        for filename in os.listdir(unzipResPath):
-            linkResCmd += ' %s' % filename
-        print('link cmd len is %s' % len(linkResCmd))
-        ret = file_utils.execFormatCmd(linkResCmd, unzipResPath)
-        if ret:
-            return ret
-
-    # 编译R文件
-    print('complie R.java ...')
-    packageName = xml_utils.getPackageName(manifest)
-    packagePath = file_utils.getPackagePath(compliePath, packageName)
-    RSourceFile = os.path.join(packagePath, 'R.java')
-    complieRCmd = 'javac -source 1.8 -target 1.8 -encoding UTF-8 "%s"' % RSourceFile
-    ret = file_utils.execFormatCmd(complieRCmd)
-    if ret:
-        return ret
-
-    # 生成dex
-    print('dex R.class ...')
-    dx = file_utils.getDxPath()
-    outDex = os.path.join(compliePath, 'classes.dex')
-    ret = file_utils.execJarCmd(dx, '--dex --output="%s" "%s"' % (outDex, compliePath))
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy R.smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    file_utils.copyFileAllDir(outPath, smaliPath)
-    return 0
-
-def packJar(game, sdk, subChannel, config):
-    '''
-    打包所有的jar
-    '''
-    splitDex = config['splitDex']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outPath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(outPath):
-        os.makedirs(outPath)
-
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --multi-dex --no-warning --output="%s"' % outPath
-    else:
-        dx = file_utils.getD8Path()
-        androidPlatforms = file_utils.getAndroidCompileToolPath()
-        dexCmd = '--lib "%s" --output "%s"' % (androidPlatforms, outPath)
-
-    # 找到所有lib依赖
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    libs = os.path.join(sdkPath, 'libs')
-    libConfig = os.path.join(libs, 'config.json')
-
-    # 存在配置文件
-    if os.path.exists(libConfig):
-        jsonText = file_utils.readFile(libConfig)
-        libConf = json.loads(jsonText)
-        if 'libConfig' in config and config['libConfig'] in libConf:
-            conf = config['libConfig']
-            libList = libConf[conf]
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        elif 'default' in libConf:
-            libList = libConf['default']
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        else:
-            for jar in os.listdir(libs):
-                if not jar.endswith('.jar'):
-                    continue
-                dexCmd += ' ' + os.path.join(libs, jar)
-    else:
-        for jar in os.listdir(libs):
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-
-    # multidex.jar
-    if splitDex:
-        dexCmd += ' ' + file_utils.getMultiDexPath()
-
-    # sdk实现类
-    print('packageing all jar ...')
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    outDex = os.path.join(outPath, 'classes.dex')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy all smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(outPath, smaliPath, True)
-    if ret:
-        return ret
-
-    return 0
-
-def splitDex(game, sdk, subChannel, config):
-    '''
-    分割dex
-    '''
-    # 判断是否已经存在application
-    # 存在,则往原application添加内容
-    # 不存在,则拷贝一个默认的android.support.multidex.MultiDexApplication
-    print('add MultiDex support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    application = xml_utils.getApplicationAttr(manifest, 'name')
-    if application is None:
-        ret = xml_utils.changeApplicationAttr(manifest, 'name', 'android.support.multidex.MultiDexApplication')
-        if ret:
-            return ret
-    else:
-        smaliPath = os.path.join(decompliePath, 'smali')
-        applicationFile = file_utils.getPackagePath(smaliPath, application)
-        applicationFile += '.smali'
-        ret = changeApplicationDex(applicationFile)
-        if ret:
-            return ret
-
-    return splitSmali(game, sdk, subChannel, config, application)
-
-def changeApplicationDex(file):
-    '''
-    修改application的smali文件,增加MultiDex操作
-    '''
-    index = file_utils.getApplicationSmaliIndex(file)
-    file_utils.insertApplicationSmali(file, index)
-    return 0
-
-def splitSmali(game, sdk, subChannel, config, application):
-    '''
-    如果函数上限超过限制,自动拆分smali,以便生成多个dex文件
-    '''
-    print('splitSmali...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    smaliPath = os.path.join(decompliePath, 'smali')
-
-    appPackage = None
-    if application:
-        appPackage = application[:application.rfind('.')]
-        appPackage = appPackage.replace('.', '/')
-
-    allFiles = []
-    allFiles = file_utils.list_files(smaliPath, allFiles)
-    
-    #print('file count is %d' % len(allFiles))
-
-    #maxFuncNum = 65535
-    # 留一点空间,防止计算误差
-    maxFuncNum = 64000
-    currFucNum = 0
-    totalFucNum = 0
-
-    currDexIndex = 1
-
-    allRefs = []
-
-    #保证Application等类在第一个classex.dex文件中
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            currFucNum += smali_utils.get_smali_method_count(f, allRefs)
-
-    totalFucNum = currFucNum
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if not f.endswith('.smali'):
-            continue
-
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            continue
-
-        thisFucNum = smali_utils.get_smali_method_count(f, allRefs)
-        totalFucNum += thisFucNum
-
-        #print('%d # %d ==> %s' % (thisFucNum, currDexIndex, f))
-        #print('totalFucNum is %d' % totalFucNum)
-        if currFucNum + thisFucNum >= maxFuncNum:
-            currFucNum = thisFucNum
-            currDexIndex += 1
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            os.makedirs(newDexPath)
-        else:
-            currFucNum += thisFucNum
-
-        if currDexIndex > 1:
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            targetFile = newDexPath + f[len(smaliPath):]
-            file_utils.copyFile(f, targetFile, True)
-    return 0
-
-def changeVersion(game, sdk, subChannel, config):
-    '''
-    更改版本号
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    versionCode = None
-    versionName = None
-    targetSdkVersion = None
-    if 'versionCode' in config:
-        versionCode = config['versionCode']
-    if 'versionName' in config:
-        versionName = config['versionName']
-    if 'targetSdkVersion' in config:
-        targetSdkVersion = config['targetSdkVersion']
-
-    return file_utils.changeVersion(yml, versionCode, versionName, targetSdkVersion)
-
-def recomplie(game, sdk, subChannel, config):
-    '''
-    回编译
-    '''
-    print('recomplie apk...')
-    apktoolPath = file_utils.getApkToolPath()
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-
-    useAppt2 = ' --use-aapt2'
-    if config['aapt2disable']:
-        useAppt2 = ''
-
-    return file_utils.execJarCmd(apktoolPath, 'b -f "%s" -o "%s"%s' % (decompliePath, outApk, useAppt2))
-
-def alignApk(game, sdk, subChannel, config):
-    '''
-    对齐apk
-    '''
-    print('align apk...')
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    alignapkTool = file_utils.getAlignPath()
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-
-    ret = file_utils.getExecPermission(alignapkTool)
-    if ret:
-        return ret
-
-    # zipalign.exe -v -p 4 input.apk output.apk
-    return file_utils.execFormatCmd('"%s" -f -p 4 "%s" "%s"' % (alignapkTool, outApk, alignApk))
-
-def apksignerApk(game, sdk, subChannel, config):
-    '''
-    签名apk
-    '''
-    print('sign apk...')
-    path = os.path.join(file_utils.getCurrentPath(), 'keystore', 'key.json')
-    jsonText = file_utils.readFile(path)
-    signConfig = json.loads(jsonText)
-    keystore = {}
-    if game in signConfig:
-        if sdk in signConfig[game] and subChannel in signConfig[game][sdk]:
-            keystore = signConfig[game][sdk][subChannel]
-        else:
-            keystore = signConfig['default']
-    else:
-        keystore = signConfig['default']
-
-    print('storeFile is "%s"' % keystore['storeFile'])
-    
-    apksigner = file_utils.getApksignerPath()
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    storeFile = os.path.join(file_utils.getCurrentPath(), 'keystore', keystore['storeFile'])
-
-    if 'outName' in config and 'outPath' in config:
-        if not os.path.exists(config['outPath']):
-            os.makedirs(config['outPath'])
-
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-    
-    # java -jar apksigner.jar sign --ks key.jks --ks-key-alias releasekey --ks-pass pass:pp123456 --key-pass pass:pp123456 --out output.apk input.apk
-    v2disable = ''
-    if 'v2disable' in config and config['v2disable']:
-        v2disable = ' --v2-signing-enabled=false'
-        
-    return file_utils.execJarCmd(apksigner, 'sign%s --ks "%s" --ks-key-alias %s --ks-pass pass:%s --key-pass pass:%s --out "%s" "%s"' % (v2disable, storeFile, keystore['keyAlias'], keystore['storePassword'], keystore['keyPassword'], signedApk, alignApk))
-
-def addChannel(game, sdk, subChannel, config):
-    '''
-    添加渠道信息
-    '''
-    if 'v2disable' in config and config['v2disable']:
-        return 0
-    
-    walle = file_utils.getWallePath()
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    if 'outName' in config and 'outPath' in config:
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-
-    properties = config['properties']
-
-    appid = ''
-    appkey = ''
-    if 'appid' in properties:
-        appid = properties['appid']
-    if 'appkey' in properties:
-        appkey = properties['appkey']
-
-    return file_utils.execJarCmd(walle, 'put -e version=%s,agent=%s,appid=%s,appkey=%s "%s" "%s"' % (config_utils_shanshen.getDate(), properties['agent'], appid, appkey, signedApk, signedApk))
-
-def clearTemp(game, sdk, subChannel, config):
-    '''
-    清空中间产生的文件
-    '''
-    print('clear temp...')
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-    if os.path.exists(outApk):
-        os.remove(outApk)
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    file_utils.deleteFolder(decompliePath)
-
-    print('clear temp end')
-
-def packConsoleInput():
-    '''
-    控制台打包
-    '''
-    if len(sys.argv) < 3:
-        print('argument is missing')
-        return 1
-
-    # 校验参数
-    game = sys.argv[1]
-    sdk = sys.argv[2]
-    # 可选参数,没有则默认打全部渠道
-    subChannel = None
-    if len(sys.argv) > 3:
-        subChannel = sys.argv[3]
-        
-    return packConsole(game, sdk, subChannel)
-
-def packConsole(game, sdk, subChannel):
-    '''
-    控制台打包
-    '''
-    if not os.path.exists(file_utils.getFullGameApk(game)):
-        print('game "%s" not exists' % game)
-        return 1
-    if not os.path.exists(file_utils.getFullSDKPath(sdk)):
-        print('sdk "%s" not exists' % sdk)
-        return 1
-
-    # 读取配置
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    if not os.path.exists(configPath):
-        print('%s not exists' % configPath)
-        return 1
-    
-    jsonText = file_utils.readFile(configPath)
-    config = json.loads(jsonText)
-
-    # 检查参数
-    if not config_utils_shanshen.checkConfig(config):
-        return 1
-
-    # 处理参数
-    config_utils_shanshen.replaceArgs(config)
-
-    successCount = 0
-    failureCount = 0
-    if type(config) == dict:
-        if subChannel is None or config['subChannel'] == subChannel:
-            ret = pack(game, sdk, config)
-            if ret:
-                failureCount += 1
-            else:
-                successCount += 1
-        else:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-    elif type(config) == list:
-        found = False
-        for itemConfig in config:
-            if subChannel is None or itemConfig['subChannel'] == subChannel:
-                found = True
-                ret = pack(game, sdk, itemConfig)
-                if ret:
-                    failureCount += 1
-                else:
-                    successCount += 1
-
-        if not found:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-
-    print('success %d, failure %d' % (successCount, failureCount))
-        
-    return 0

+ 0 - 1323
package_utils_yfsdk.py

@@ -1,1323 +0,0 @@
-# 安卓游戏打包脚本
-# 1.用apktool解包
-# 2.复制res资源、assets资源、jniLib资源
-# 3.修改包名、app名、渠道文件
-# 4.添加app icon、合并AndroidManifest文件
-# 5.添加app启动图,修改AndroidManifest文件
-# 6.生成新的R文件
-# 7.将新的R文件编译,生成dex,再用baksmali生成smali,替换旧的R文件
-# 8.将jar资源打包成dex,再用baksmali生成smali,拷贝到smali目录下
-# 9.统计方法量,并分割dex(将smali文件拷贝到目录smali_classes2)
-# 10.用apktool回包
-# 11.重新签名
-import file_utils
-import xml_utils
-import smali_utils
-import config_utils
-import game_utils
-import os
-import os.path
-import json
-import sys
-import importlib
-import uuid
-import zipfile
-import time
-import datetime
-
-
-ignoreLauncher = ['jm_ysdk', 'jm_yijie', 'jm_quick', 'jm_beiyu', 'jm_xq_jrtt','jm_zy_ysdk']
-adaptApp = ['yjzx']
-startTime = ''
-
-def pack(game, sdk, config):
-    config['cache'] = uuid.uuid1()
-    subChannel = config['subChannel']
-    print('game = %s, sdk = %s, subChannel = %s, ...' % (game,sdk,subChannel))
-
-    # 解包
-    ret = decomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-        # 删除旧代码
-    ret = removeOldCode(game, sdk, subChannel, config)
-    if ret:
-        return ret
-
-    # 复制app res资源
-    ret = copyAppRes(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 更改包名
-    if 'packageName' in config and config['packageName'] != '':
-        ret = changePackageName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改app名
-    if 'name' in config and config['name'] != '':
-        ret = changeAppName(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 更改app icon
-    if config['changeIcon']:
-        ret = changeAppIcon(game, sdk, subChannel, config)
-        if ret:
-            return ret
-    # 添加启动图操作
-    if config['addLauncher']:
-        ret = addLauncher(game, sdk, subChannel, config)
-        if ret:
-            return ret
-
-    ret = copyIcon(game, sdk, subChannel, config)
-
-    ret = packJar(game, sdk, subChannel, config)
-    if ret:
-        return ret
-
-    # 增加配置文件
-    ret = createJmhyProperties(game, sdk, subChannel, config)
-    if ret:
-        return ret
-
-    # 更改版本号
-    ret = changeVersion(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 回编译
-    ret = recomplie(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 对齐apk
-    ret = alignApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 签名
-    ret = apksignerApk(game, sdk, subChannel, config)
-    if ret:
-        return ret
-    # 清理产生的中间文件
-    if config['clearCache']:
-        clearTemp(game, sdk, subChannel, config)
-
-    endTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
-    d1 = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M:%S')
-    d2 = datetime.datetime.strptime(startTime,  '%Y-%m-%d %H:%M:%S')
-    d = d1 - d2
-    print ('开始时间:' + startTime)
-    print ('结束时间:' + endTime)
-    print ('用时:{}'.format(config_utils.getTime(d.seconds)))
-    return 0
-
-def decomplie(game, sdk, subChannel, config):
-    '''
-    解包
-    '''
-    apktoolPath = file_utils.getApkToolPath()
-    gamePath = file_utils.getFullGameApk(game)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    if os.path.exists(decompliePath):
-        print('delete decomplie folder...')
-        file_utils.deleteFolder(decompliePath)
-
-    print('decomplie apk...')
-
-    return file_utils.execJarCmd(apktoolPath, 'd -f "%s" -o "%s"' % (gamePath, decompliePath))
-
-def removeOldCode(game, sdk, subChannel, config):
-    '''
-    删除旧代码
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    codePath = os.path.join(decompliePath, 'smali', 'com', 'Jcat', 'Adsdk')
-    #file_utils.deleteFolder(codePath)
-    allFiles = []
-    allFiles = file_utils.list_files(codePath, allFiles)
-    for f in allFiles:
-        fpath, fname = os.path.split(f)  #分离文件名和路径
-        if fname == 'R.smali' or fname.startswith('R$'):
-            continue
-        os.remove(f)
-        #print('remove %s' % f)
-    return 0
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    复制res资源
-    '''
-    # 拷贝sdk资源
-    print('copy res...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    resPath = os.path.join(sdkPath, 'res')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-
-    for d in os.listdir(resPath):
-        copyResWithType(resPath, decomplieResPath, d)
-
-    # 拷贝assets
-    print('copy assets...')
-    assetsPath = file_utils.getFullPath(sdkPath, 'assets')
-    decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-    if os.path.exists(assetsPath):
-        ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-        if ret:
-            return ret
-
-    # 拷贝jniLib
-    print('copy jniLibs...')
-    jniPath = file_utils.getFullPath(sdkPath, 'jniLibs')
-    decomplieJniPath = file_utils.getFullPath(decompliePath, 'lib')
-    abiFilters = []
-    if os.path.exists(decomplieJniPath):
-        for abi in os.listdir(decomplieJniPath):
-            if abi == 'armeabi-v7a' or abi == 'armeabi':
-                abiFilters.append(abi)
-    else:
-        abiFilters = ['armeabi-v7a']
-
-    if os.path.exists(jniPath):
-        ret = file_utils.copyFileAllDir(jniPath, decomplieJniPath, False, abiFilters)
-        if ret:
-            return ret
-    return 0
-
-def mergeDrawableRes(game, sdk, subChannel, config):
-    '''
-    合并Drawable-v4目录
-    '''
-    print('merge drawable path...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-
-    for path in os.listdir(resPath):
-        print('res path %s' % path)
-        if (path.startswith('drawable') or path.startswith('mipmap')) and path.endswith('-v4'):
-            print('merge path %s' % path)
-            v4DrawablePath = os.path.join(resPath, path)
-            drawablePath = os.path.join(resPath, path[:-3])
-
-            if os.path.exists(drawablePath):
-                ret = file_utils.copyFileAllDir(v4DrawablePath, drawablePath, True)
-                if ret:
-                    return ret
-            else:
-                os.rename(v4DrawablePath, drawablePath)
-    return 0
-
-def removeSameRes(game, sdk, subChannel, config):
-    '''
-    移除相同的资源
-    '''
-    # 读取sdk的资源
-    print('remove same res...')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    sdkResPath = os.path.join(sdkPath, 'res')
-    resList = []
-    for path in os.listdir(sdkResPath):
-        if not path.startswith('values'):
-            continue
-        absPath = os.path.join(sdkResPath, path)
-        for resFile in os.listdir(absPath):
-            '''if not resFile.startswith('jm_'):
-                continue'''
-            if resFile.endswith('.DS_Store'):
-                continue
-            #print('readAllRes -- > ' + os.path.join(absPath, resFile))
-
-            resList = xml_utils.readAllRes(os.path.join(absPath, resFile), resList)
-
-    if len(resList) == 0:
-        print('no same res found')
-        return 0
-
-    # 移除相同的资源
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    resPath = os.path.join(decompliePath, 'res')
-    for path in os.listdir(resPath):
-        if not path.startswith('values'):
-            continue
-
-        absPath = os.path.join(resPath, path)
-        for resFile in os.listdir(absPath):
-            xml_utils.removeSameRes(os.path.join(absPath, resFile), resList)
-
-    return 0
-
-def mergeManifestRes(game, sdk, subChannel, config):
-    '''
-    合并主文件
-    '''
-    print('merge AndroidManifest...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    libManifest = file_utils.getFullPath(sdkPath, 'manifest.xml')
-    return xml_utils.mergeManifestRes(manifest, libManifest)
-
-def copyAppRes(game, sdk, subChannel, config):
-    '''
-    拷贝app的资源,比如app icon、启动图等
-    '''
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-
-    # assets
-    print('copy assets...')
-    #适配一剑斩仙
-    if game in adaptApp:
-        print('适配一剑斩仙...')
-        decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-        skinZipPath = os.path.join(decomplieAssetsPath, 'skin.zip')
-        skinPath = os.path.join(decomplieAssetsPath, 'skin')
-        if os.path.exists(skinZipPath):
-            with zipfile.ZipFile(skinZipPath) as zf:
-                zf.extractall(decomplieAssetsPath)
-                print('create unzip skin' )
-            assetsPath = file_utils.getFullPath(channelPath, 'assets')
-            decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-            if os.path.exists(assetsPath):
-                ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-            with zipfile.ZipFile(skinZipPath, 'w') as z:
-                for root, dirs, files in os.walk(skinPath):
-                    for single_file in files:
-                        filepath = os.path.join(root, single_file)
-                        print ('create zip ---> ' + filepath)
-                        temPath = 'skin/' + single_file
-                        z.write(filepath, temPath)
-            z.close()
-        else:
-            print('normal copy assets...')
-            assetsPath = file_utils.getFullPath(channelPath, 'assets')
-            decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-            if os.path.exists(assetsPath):
-                ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-                if ret:
-                    return ret
-    else:
-        print('normal copy assets...')
-        assetsPath = file_utils.getFullPath(channelPath, 'assets')
-        decomplieAssetsPath = file_utils.getFullPath(decompliePath, 'assets')
-        if os.path.exists(assetsPath):
-            ret = file_utils.copyFileAllDir(assetsPath, decomplieAssetsPath)
-            if ret:
-                return ret
-
-    # icon
-    print('copy icon...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'icon')
-    if ret:
-        return ret
-    # 启动图
-    print('copy splash...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'splash')
-    if ret:
-        return ret
-    # 其他图片
-    print('copy image...')
-    ret = copyAppResWithType(decompliePath, channelPath, 'image')
-    if ret:
-        return ret
-    return 0
-    
-def copyAppResWithType(decompliePath, channelPath, typeName):
-    decomplieResPath = os.path.join(decompliePath, 'res')
-    iconPath = os.path.join(channelPath, typeName)
-    if not os.path.exists(iconPath):
-        print('dir "%s" not exists' % iconPath)
-        return 0
-    for d in os.listdir(iconPath):
-        ret = copyResWithType(iconPath, decomplieResPath, d)
-        if ret:
-            return ret
-
-    return 0
-
-def copyResWithType(resPath, decomplieResPath, typeName):
-    # appt的打包目录会带-v4后缀
-    resDir = os.path.join(resPath, typeName)
-    target = os.path.join(decomplieResPath, typeName)
-    targetV4 = os.path.join(decomplieResPath, typeName + '-v4')
-    if not os.path.exists(target) and not os.path.exists(targetV4):
-        os.makedirs(target)
-        return file_utils.copyFileAllDir(resDir, target, False)
-    elif not os.path.exists(target):
-        return file_utils.copyFileAllDir(resDir, targetV4, False)
-    else:
-        return file_utils.copyFileAllDir(resDir, target, False)
-
-def removeNoSupportAttr(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的属性
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersion')
-    xml_utils.removeRootAttr(manifest, 'compileSdkVersionCodename')
-    
-    return 0
-
-def fixUnSupportConfig(game, sdk, subChannel, config):
-    '''
-    删除一些不支持的配置
-    '''
-    # 检查minSdkVersion
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    minSdkVersion = 15
-    file_utils.changeMinSdkVersion(yml, minSdkVersion)
-
-    resPath = os.path.join(decompliePath, 'res')
-
-    tag = '-v'
-    for res in os.listdir(resPath):
-        #print('res = ' + res)
-        if res.startswith('values') and tag in res:
-            start = res.index(tag)
-            version = res[start+len(tag):]
-            if not version.isdigit():
-                continue
-            
-            version = int(version)
-            print('version = %d' % version)
-            if version < minSdkVersion:
-                unSopportPath = os.path.join(resPath, res)
-                print('unSopportPath = ' + unSopportPath)
-                file_utils.deleteFolder(unSopportPath)
-                print('deleteFolder = ' + unSopportPath)
-    
-    return 0
-
-def changePackageName(game, sdk, subChannel, config):
-    '''
-    更改包名
-    '''
-    # 全局替换AndroidManifest里面的包名
-    newPackageName = config['packageName']
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    packageName = xml_utils.getPackageName(manifest)
-    
-    xml_utils.changePackageName(manifest, newPackageName)
-    print('change package name %s --> %s' % (packageName, newPackageName))
-    return 0
-
-def changeAppName(game, sdk, subChannel, config):
-    '''
-    更改app名
-    '''
-    # 生成string.xml文件
-    name = config['name']
-
-    resName = 'common_sdk_name'
-    if 'outName' in config:
-        resName = resName + '_' + config['outName']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    stringFile = os.path.join(decompliePath, 'res', 'values', 'sdk_strings_temp.xml')
-    content = '<?xml version="1.0" encoding="utf-8"?><resources><string name="%s">%s</string></resources>' % (resName, name)
-    file_utils.createFile(stringFile, content)
-
-    # 修改主文件的app名的值
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppName(manifest, '@string/%s' % resName)
-    print('change app name %s' % name)
-    return 0
-
-def changeAppIcon(game, sdk, subChannel, config):
-    '''
-    更改app icon
-    '''
-    print('change app icon...')
-    resName = 'common_sdk_icon'
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.changeAppIcon(manifest, '@mipmap/%s' % resName)
-    return 0
-
-def addMetaData(game, sdk, subChannel, config):
-    '''
-    添加meta-data
-    '''
-    if 'metaData' not in config:
-        return 0
-
-    print('add meta-data...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    xml_utils.addMetaData(manifest, config['metaData'])
-    return 0
-
-def addConfig(game, sdk, subChannel, config):
-    '''
-    添加config.json
-    '''
-    if 'configData' not in config:
-        return 0
-
-    print('add jmad.properties...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    configJson = os.path.join(decompliePath, 'assets', 'jmad.properties')
-    jsonText = json.dumps(config['configData'], ensure_ascii=False)
-    file_utils.createFile(configJson, jsonText)
-    return 0
-
-def createJmhyProperties(game, sdk, subChannel, config):
-    '''
-    创建jmhy.properties
-    '''
-    print('create jmad.properties...')
-    propValue = config['properties']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    properties = os.path.join(decompliePath, 'assets', 'jmad.properties')
-    content = ''
-    for key in propValue:
-        content = '%s%s=%s\n' % (content, key, propValue[key])
-    file_utils.createFile(properties, content)
-    return 0
-
-def changePlaceholders(game, sdk, subChannel, config):
-    '''
-    处理掉占位符
-    '''
-    if 'placeholders' not in config:
-        return 0
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-
-    placeholders = config['placeholders']
-    for placeholder in placeholders:
-        oldText = '${%s}' % placeholder
-        newText = placeholders[placeholder]
-        print('change placeholder %s -> %s' % (oldText, newText))
-        file_utils.replaceContent(manifest, oldText, newText)
-
-    return 0
-
-def addLauncher(game, sdk, subChannel, config):
-    '''
-    添加启动图
-    '''
-    # ysdk的特殊处理
-    if sdk in ignoreLauncher:
-        return 0
-
-    channelPath = file_utils.getSubChannelPath(game, sdk, subChannel)
-    splashPath = os.path.join(channelPath, 'splash')
-    if len(os.listdir(splashPath)) == 0:
-        print('dir splash is empty')
-        return 0
-
-    print('add launcher...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    activity = xml_utils.getLauncherActivityName(manifest)
-    if activity == 'com.jmhy.sdk.template.LauncherActivity':
-        print('add launcher already exist...')
-        return 1
-    # 添加关联资源
-    internalPath = file_utils.getFullInternalPath()
-    ret = copyAppResWithType(decompliePath, internalPath, 'launcher_res')
-    if ret:
-        return ret
-
-    # 拷贝代码
-    print('copy launcher code...')
-    codePath = os.path.join(internalPath, 'launcher_code', 'smali')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(codePath, smaliPath)
-    if ret:
-        return ret
-
-    # 修改主文件信息
-    print('change launcher config...')
-    
-    orientation = xml_utils.getScreenOrientation(manifest)
-    activity = xml_utils.removeLauncherActivity(manifest)
-    xml_utils.addLauncherActivity(manifest, orientation, 'com.jmhy.sdk.template.LauncherActivity')
-
-    # 修改跳转的
-    launcherActivity = os.path.join(decompliePath, 'smali', 'com', 'jmhy', 'sdk', 'template', 'LauncherActivity.smali')
-    file_utils.replaceContent(launcherActivity, '{class}', activity)
-
-    print('change launcher %s to %s' % (activity, 'com.jmhy.sdk.template.LauncherActivity'))
-
-    # config['oldLauncher'] = activity
-
-    if 'launcherTime' in config:
-        timeHex = formatHex(config['launcherTime'])
-        file_utils.replaceContent(launcherActivity, '0x0BB8', timeHex)
-
-    return 0
-
-def addMoreIcon(game, sdk, subChannel, config):
-    '''
-    添加多个图标
-    '''
-    print('add more icon support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    icon = '@mipmap/common_sdk_icon'
-    if not config['changeIcon']:
-        manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-        icon = xml_utils.getApplicationAttr(manifest, 'icon')
-
-    switchIcon = icon
-    if config['switchIcon']:
-        switchIcon = '@mipmap/common_sdk_icon2'
-
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    return xml_utils.addMoreIcon(manifest, icon, switchIcon)
-
-def copyIcon(game, sdk, subChannel, config):
-    '''
-    复制icon到res ,一键登录使用
-    '''
-    if config['changeIcon']:
-        decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-        decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-        iconPath = os.path.join(decomplieResPath, 'mipmap-xhdpi', 'common_sdk_icon.png')
-        desPath = os.path.join(decomplieResPath, 'drawable-hdpi', 'jm_cmcc_icon.png')
-        file_utils.copyFile(iconPath, desPath)
-    else:
-        decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-        decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-        desPath = os.path.join(decomplieResPath, 'drawable-hdpi', 'jm_cmcc_icon.png')
-
-        manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-        icon = xml_utils.getApplicationAttr(manifest, 'icon')
-        tag = icon[1:].split("/")
-        if len(tag) < 1:
-            return
-        hdpi = ['-xhdpi', '-xxhdpi', '-xxxhdpi']
-        for h in hdpi:
-            p1 = '%s%s' % (tag[0],h)
-            png = tag[1] + ".png"
-            iconPath = os.path.join(decomplieResPath, p1, png)
-            if os.path.exists(iconPath):
-                print ('iconPath = ' + iconPath)
-                file_utils.copyFile(iconPath, desPath)
-                break
-
-
-def formatHex(millisecond):
-    '''
-    将毫秒转为16进制,4位格式
-    '''
-    timeHex = str(hex(millisecond)).upper()
-    timeHex = timeHex[2:]
-    formatHex = ''
-    if len(timeHex) == 3:
-        formatHex = '0x0' + timeHexaddLauncher
-    elif len(timeHex) == 4:
-        formatHex = '0x' + timeHex
-    else:
-        formatHex = '0x0BB8'
-    return formatHex
-
-def doSDKPostScript(game, sdk, config):
-    '''
-    执行sdk相关特殊处理脚本
-    '''
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    scriptPath = os.path.join(sdkPath, 'script')
-    targetScript = os.path.join(scriptPath, 'sdk_script.py')
-    if not os.path.exists(targetScript):
-        print('sdk_script no exists')
-        return 0
-
-    print('doSDKPostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('sdk_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def doGamePostScript(game, sdk, config):
-    '''
-    执行游戏相关特殊处理脚本
-    '''
-    channelPath = file_utils.getFullGamePath(game)
-    scriptPath = os.path.join(channelPath, 'script')
-    targetScript = os.path.join(scriptPath, 'game_script.py')
-    if not os.path.exists(targetScript):
-        print('game_script no exists')
-        return 0
-
-    print('doGamePostScript...')
-    sys.path.append(scriptPath)
-
-    module = importlib.import_module('game_script')
-    ret = module.execute(game, sdk, config)
-
-    sys.path.remove(scriptPath)
-
-    return ret
-
-def addLogSdk(game, sdk, subChannel, config, logSdk):
-    # 拷贝jniLibs
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    sdkPath = file_utils.getFullLogSDKPath(logSdk)
-
-    print('copy log jniLibs...')
-    jniPath = file_utils.getFullPath(sdkPath, 'jniLibs')
-    decomplieJniPath = file_utils.getFullPath(decompliePath, 'lib')
-    abiFilters = []
-    if os.path.exists(decomplieJniPath):
-        for abi in os.listdir(decomplieJniPath):
-            if abi == 'armeabi-v7a' or abi == 'armeabi':
-                abiFilters.append(abi)
-    else:
-        abiFilters = ['armeabi-v7a']
-
-    if os.path.exists(jniPath):
-        ret = file_utils.copyFileAllDir(jniPath, decomplieJniPath, False, abiFilters)
-        if ret:
-            return ret
-    
-    print('merge log AndroidManifest...')
-    libManifest = file_utils.getFullPath(sdkPath, 'manifest.xml')
-    if os.path.exists(libManifest):
-        manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-        ret = xml_utils.mergeManifestRes(manifest, libManifest)
-        if ret:
-            return ret
-
-    return packLogJar(game, sdk, subChannel, config, logSdk)
-
-def generateNewRFile(game, sdk, subChannel, config):
-    '''
-    生成新的R文件
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    androidPlatforms = file_utils.getAndroidCompileToolPath()
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    decomplieResPath = file_utils.getFullPath(decompliePath, 'res')
-    compliePath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(compliePath):
-        os.makedirs(compliePath)
-
-    # 生成R文件
-    print('生成R文件 ...')
-    if config['aapt2disable']:
-        aapt = file_utils.getAAPTPath()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-        createRCmd = '"%s" p -f -m -J "%s" -S "%s" -I "%s" -M "%s"' % (aapt, compliePath, decomplieResPath, androidPlatforms, manifest)
-        ret = file_utils.execFormatCmd(createRCmd)
-        if ret:
-            return ret
-    else:
-        # compile
-        aapt = file_utils.getAAPT2Path()
-        ret = file_utils.getExecPermission(aapt)
-        if ret:
-            return ret
-
-        print('compiled res ...')
-        complieResPath = os.path.join(compliePath, 'compiled')
-        complieResCmd = '"%s" compile --dir "%s" -o "%s"' % (aapt, decomplieResPath, complieResPath)
-        file_utils.execFormatCmd(complieResCmd)
-
-        # unzip
-        print('unzip compiled res ...')
-        unzipResPath = os.path.join(compliePath, 'aapt2_res')
-        with zipfile.ZipFile(complieResPath) as zf:
-            zf.extractall(unzipResPath)
-            print('create unzip %s' % unzipResPath)
-
-        # link
-        print('link res ...')
-        outApk = os.path.join(compliePath, 'res.apk')
-        linkResCmd = '"%s" link -o "%s" -I "%s" --manifest "%s" --java "%s" --auto-add-overlay' % (aapt, outApk, androidPlatforms, manifest, compliePath)
-        for filename in os.listdir(unzipResPath):
-            linkResCmd += ' %s' % filename
-        print('link cmd len is %s' % len(linkResCmd))
-        ret = file_utils.execFormatCmd(linkResCmd, unzipResPath)
-        if ret:
-            return ret
-
-    # 编译R文件
-    print('complie R.java ...')
-    packageName = xml_utils.getPackageName(manifest)
-    packagePath = file_utils.getPackagePath(compliePath, packageName)
-    RSourceFile = os.path.join(packagePath, 'R.java')
-    complieRCmd = 'javac -source 1.8 -target 1.8 -encoding UTF-8 "%s"' % RSourceFile
-    ret = file_utils.execFormatCmd(complieRCmd)
-    if ret:
-        return ret
-
-    # 生成dex
-    print('dex R.class ...')
-    outDex = os.path.join(compliePath, 'classes.dex')
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --no-warning --output="%s" "%s"' % (outDex, compliePath)
-    else:
-        dx = file_utils.getD8Path()
-        clazz = os.path.join(packagePath, '*.class')
-        dexCmd = '--lib "%s" --output "%s" %s' % (androidPlatforms, compliePath, clazz)
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy R.smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    file_utils.copyFileAllDir(outPath, smaliPath)
-    return 0
-
-def packJar(game, sdk, subChannel, config):
-    '''
-    打包所有的jar
-    '''
-    splitDex = config['splitDex']
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outPath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(outPath):
-        os.makedirs(outPath)
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --multi-dex --no-warning --output="%s"' % outPath
-    else:
-        dx = file_utils.getD8Path()
-        androidPlatforms = file_utils.getAndroidCompileToolPath()
-        dexCmd = '--lib "%s" --output "%s"' % (androidPlatforms, outPath)
-
-    # 找到所有lib依赖
-    sdkPath = file_utils.getFullSDKPath(sdk)
-    print('sdkpath --> ' + sdkPath)
-    libs = os.path.join(sdkPath, 'libs')
-    libConfig = os.path.join(libs, 'config.json')
-
-    # 存在配置文件
-    if os.path.exists(libConfig):
-        jsonText = file_utils.readFile(libConfig)
-        libConf = json.loads(jsonText)
-        if 'libConfig' in config and config['libConfig'] in libConf:
-            conf = config['libConfig']
-            libList = libConf[conf]
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        elif 'default' in libConf:
-            libList = libConf['default']
-            for jar in libList:
-                dexCmd += ' ' + os.path.join(libs, jar)
-        else:
-            for jar in os.listdir(libs):
-                if not jar.endswith('.jar'):
-                    continue
-                dexCmd += ' ' + os.path.join(libs, jar)
-    else:
-        for jar in os.listdir(libs):
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-
-    # multidex.jar
-    if splitDex:
-        dexCmd += ' ' + file_utils.getMultiDexPath()
-
-    # sdk实现类
-    print('packageing all jar ...')
-    #dexCmd += ' ' + os.path.join(sdkPath, '%s.jar' % sdk)
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    outDex = os.path.join(outPath, 'classes.dex')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy all smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(outPath, smaliPath, True)
-    if ret:
-        return ret
-
-    return 0
-
-def packLogJar(game, sdk, subChannel, config, logSdk):
-    '''
-    打包Log jar
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outPath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(outPath):
-        os.makedirs(outPath)
-
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --multi-dex --no-warning --output="%s"' % outPath
-    else:
-        dx = file_utils.getD8Path()
-        androidPlatforms = file_utils.getAndroidCompileToolPath()
-        dexCmd = '--lib "%s" --output "%s"' % (androidPlatforms, outPath)
-
-    # 找到所有lib依赖
-    sdkPath = file_utils.getFullLogSDKPath(logSdk)
-    libs = os.path.join(sdkPath, 'libs')
-    libConfig = os.path.join(libs, 'config.json')
-
-    # 存在配置文件
-    if os.path.exists(libConfig):
-        jsonText = file_utils.readFile(libConfig)
-        libList = json.loads(jsonText)
-        for jar in libList:
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-    else:
-        for jar in os.listdir(libs):
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-
-    # sdk实现类
-    print('packageing all log jar ...')
-    dexCmd += ' ' + os.path.join(sdkPath, '%s.jar' % logSdk)
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    outDex = os.path.join(outPath, 'classes.dex')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-    
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy all log smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(outPath, smaliPath, True)
-    if ret:
-        return ret
-
-    return 0
-
-
-
-
-def packReativeJar(game, sdk, subChannel, config, logSdk):
-    '''
-    打包Reative jar
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outPath = file_utils.getFullPath(decompliePath, 'gen')
-
-    if not os.path.exists(outPath):
-        os.makedirs(outPath)
-
-    if config['aapt2disable']:
-        dx = file_utils.getDxPath()
-        dexCmd = '--dex --multi-dex --no-warning --output="%s"' % outPath
-    else:
-        dx = file_utils.getD8Path()
-        androidPlatforms = file_utils.getAndroidCompileToolPath()
-        dexCmd = '--lib "%s" --output "%s"' % (androidPlatforms, outPath)
-
-    # 找到所有lib依赖
-    sdkPath = file_utils.getFullLogSDKPath(logSdk)
-    libs = os.path.join(sdkPath, 'libs')
-    libConfig = os.path.join(libs, 'config.json')
-
-    # 存在配置文件
-    if os.path.exists(libConfig):
-        jsonText = file_utils.readFile(libConfig)
-        libList = json.loads(jsonText)
-        for jar in libList:
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-    else:
-        for jar in os.listdir(libs):
-            if not jar.endswith('.jar'):
-                continue
-            dexCmd += ' ' + os.path.join(libs, jar)
-
-    # sdk实现类
-    print('packageing all log jar ...')
-    dexCmd += ' ' + os.path.join(sdkPath, '%s.jar' % logSdk)
-    ret = file_utils.execJarCmd(dx, dexCmd)
-    if ret:
-        return ret
-
-    # 反向dex生成smali
-    # 存放在out目录
-    print('baksmali classes.dex ...')
-    outDex = os.path.join(outPath, 'classes.dex')
-    baksmaliPath = file_utils.getBaksmaliPath()
-    outPath = file_utils.getFullPath(decompliePath, 'out')
-
-    ret = file_utils.execJarCmd(baksmaliPath, 'd "%s" -o "%s"' % (outDex, outPath))
-    if ret:
-        return ret
-
-    # 将生成的文件拷贝到目标目录
-    print('copy all log smali ...')
-    smaliPath = file_utils.getFullPath(decompliePath, 'smali')
-    ret = file_utils.copyFileAllDir(outPath, smaliPath, True)
-    if ret:
-        return ret
-
-    return 0
-
-def splitDex(game, sdk, subChannel, config):
-    '''
-    分割dex
-    '''
-    # 判断是否已经存在application
-    # 存在,则往原application添加内容
-    # 不存在,则拷贝一个默认的android.support.multidex.MultiDexApplication
-    print('add MultiDex support...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    manifest = os.path.join(decompliePath, 'AndroidManifest.xml')
-    application = xml_utils.getApplicationAttr(manifest, 'name')
-    if application is None:
-        ret = xml_utils.changeApplicationAttr(manifest, 'name', 'android.support.multidex.MultiDexApplication')
-        if ret:
-            return ret
-    else:
-        smaliPath = os.path.join(decompliePath, 'smali')
-        applicationFile = file_utils.getPackagePath(smaliPath, application)
-        applicationFile += '.smali'
-        ret = changeApplicationDex(applicationFile)
-        if ret:
-            return ret
-
-    return splitSmali(game, sdk, subChannel, config, application)
-
-def changeApplicationDex(file):
-    '''
-    修改application的smali文件,增加MultiDex操作
-    '''
-    index = file_utils.getApplicationSmaliIndex(file)
-    file_utils.insertApplicationSmali(file, index)
-    return 0
-
-def splitSmali(game, sdk, subChannel, config, application):
-    '''
-    如果函数上限超过限制,自动拆分smali,以便生成多个dex文件
-    '''
-    print('splitSmali...')
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    smaliPath = os.path.join(decompliePath, 'smali')
-
-    appPackage = None
-    if application:
-        appPackage = application[:application.rfind('.')]
-        appPackage = appPackage.replace('.', '/')
-
-    allFiles = []
-    allFiles = file_utils.list_files(smaliPath, allFiles)
-    
-    #print('file count is %d' % len(allFiles))
-
-    #maxFuncNum = 65535
-    # 留一点空间,防止计算误差
-    maxFuncNum = 64000
-    currFucNum = 0
-    totalFucNum = 0
-
-    currDexIndex = 1
-
-    allRefs = []
-
-    #保证Application等类在第一个classex.dex文件中
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            currFucNum += smali_utils.get_smali_method_count(f, allRefs)
-
-    totalFucNum = currFucNum
-    for f in allFiles:
-        f = f.replace('\\', '/')
-        if not f.endswith('.smali'):
-            continue
-
-        if (appPackage and appPackage in f) or '/android/support/multidex' in f:
-            continue
-
-        thisFucNum = smali_utils.get_smali_method_count(f, allRefs)
-        totalFucNum += thisFucNum
-
-        #print('%d # %d ==> %s' % (thisFucNum, currDexIndex, f))
-        #print('totalFucNum is %d' % totalFucNum)
-        if currFucNum + thisFucNum >= maxFuncNum:
-            currFucNum = thisFucNum
-            currDexIndex += 1
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            os.makedirs(newDexPath)
-        else:
-            currFucNum += thisFucNum
-
-        if currDexIndex > 1:
-            newDexPath = os.path.join(decompliePath, 'smali_classes%d' % currDexIndex)
-            targetFile = newDexPath + f[len(smaliPath):]
-            file_utils.copyFile(f, targetFile, True)
-    return 0
-
-def changeVersion(game, sdk, subChannel, config):
-    '''
-    更改版本号
-    '''
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    yml = os.path.join(decompliePath, 'apktool.yml')
-
-    versionCode = None
-    versionName = None
-    targetSdkVersion = None
-    if 'versionCode' in config:
-        versionCode = config['versionCode']
-    if 'versionName' in config:
-        versionName = config['versionName']
-    if 'targetSdkVersion' in config:
-        targetSdkVersion = config['targetSdkVersion']
-    else:
-        targetSdkVersion = 26
-    print('changeVersion versionCode=%s,versionName=%s,targetSdkVersion=%s' % (versionCode, versionName, targetSdkVersion))
-
-    return file_utils.changeVersion(yml, versionCode, versionName, targetSdkVersion)
-
-def recomplie(game, sdk, subChannel, config):
-    '''
-    回编译
-    '''
-    print('recomplie apk...')
-    apktoolPath = file_utils.getApkToolPath()
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-
-    useAppt2 = ' --use-aapt2'
-    if config['aapt2disable']:
-        useAppt2 = ''
-
-    return file_utils.execJarCmd(apktoolPath, 'b -f "%s" -o "%s"%s' % (decompliePath, outApk, useAppt2))
-
-def alignApk(game, sdk, subChannel, config):
-    '''
-    对齐apk
-    '''
-    print('align apk...')
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    alignapkTool = file_utils.getAlignPath()
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-
-    ret = file_utils.getExecPermission(alignapkTool)
-    if ret:
-        return ret
-
-    # zipalign.exe -v -p 4 input.apk output.apk
-    return file_utils.execFormatCmd('"%s" -f -p 4 "%s" "%s"' % (alignapkTool, outApk, alignApk))
-
-def apksignerApk(game, sdk, subChannel, config):
-    '''
-    签名apk
-    '''
-    print('sign apk...')
-    print('game = %s, sdk = %s, subChannel = %s, ...' % (game,sdk,subChannel))
-    path = os.path.join(file_utils.getCurrentPath(), 'keystore', 'key.json')
-    jsonText = file_utils.readFile(path)
-    signConfig = json.loads(jsonText)
-    keystore = {}
-    for key in signConfig.keys():
-        print(key)
-        if game.find(key) > -1:
-            if sdk in signConfig[key]:
-                keystore = signConfig[key][sdk]
-            else:
-                keystore = signConfig['default']
-        else:
-            keystore = signConfig['default']
-
-    # if game in signConfig:
-    #     if sdk in signConfig[game]:
-    #         keystore = signConfig[game][sdk]
-    #     else:
-    #         keystore = signConfig['default']
-    # else:
-    #     keystore = signConfig['default']
-
-    print('storeFile is "%s"' % keystore['storeFile'])
-    
-    apksigner = file_utils.getApksignerPath()
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    storeFile = os.path.join(file_utils.getCurrentPath(), 'keystore', keystore['storeFile'])
-
-    if 'outName' in config and 'outPath' in config:
-        if not os.path.exists(config['outPath']):
-            os.makedirs(config['outPath'])
-
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-    
-    # java -jar apksigner.jar sign --ks key.jks --ks-key-alias releasekey --ks-pass pass:pp123456 --key-pass pass:pp123456 --out output.apk input.apk
-    v2disable = ''
-    if 'v2disable' in config and config['v2disable']:
-        v2disable = ' --v2-signing-enabled=false'
-        
-    return file_utils.execJarCmd(apksigner, 'sign%s --ks "%s" --ks-key-alias %s --ks-pass pass:%s --key-pass pass:%s --out "%s" "%s"' % (v2disable, storeFile, keystore['keyAlias'], keystore['storePassword'], keystore['keyPassword'], signedApk, alignApk))
-
-def addChannel(game, sdk, subChannel, config):
-    '''
-    添加渠道信息
-    '''
-    if 'v2disable' in config and config['v2disable']:
-        return 0
-    
-    walle = file_utils.getWallePath()
-    signedApk = file_utils.getSignApkPath(game, sdk, subChannel, config['cache'])
-    if 'outName' in config and 'outPath' in config:
-        signedApk = os.path.join(config['outPath'], config['outName'] + '.apk')
-    elif 'outName' in config:
-        signedApk = file_utils.getRenameApkPath(game, sdk, config['cache'], config['outName'])
-
-    properties = config['properties']
-
-    appid = ''
-    appkey = ''
-    host = ''
-    if 'appid' in properties:
-        appid = properties['appid']
-    if 'appkey' in properties:
-        appkey = properties['appkey']
-    if 'host' in properties:
-        host = properties['host']
-
-    return file_utils.execJarCmd(walle, 'put -e version=%s,agent=%s,appid=%s,appkey=%s,host=%s "%s" "%s"' % (config_utils.getDate(), properties['agent'], appid, appkey, host, signedApk, signedApk))
-
-def clearTemp(game, sdk, subChannel, config):
-    '''
-    清空中间产生的文件
-    '''
-    print('clear temp...')
-    alignApk = file_utils.getAlignApkPath(game, sdk, subChannel, config['cache'])
-    outApk = file_utils.getOutApkPath(game, sdk, subChannel, config['cache'])
-    if os.path.exists(alignApk):
-        os.remove(alignApk)
-    if os.path.exists(outApk):
-        os.remove(outApk)
-
-    decompliePath = file_utils.getDecompliePath(game, sdk, subChannel, config['cache'])
-    file_utils.deleteFolder(decompliePath)
-
-    print('clear temp end')
-
-def packConsoleInput():
-    '''
-    控制台打包
-    '''
-    if len(sys.argv) < 3:
-        print('argument is missing')
-        return 1
-
-    # 校验参数
-    game = sys.argv[1]
-    sdk = sys.argv[2]
-    # 可选参数,没有则默认打全部渠道
-    subChannel = None
-    if len(sys.argv) > 3:
-        subChannel = sys.argv[3]
-        
-    return packConsole(game, sdk, subChannel)
-
-def packConsole(game, sdk, subChannel):
-    '''
-    控制台打包
-    '''
-    print('--------- yfsdk ---------')
-
-    if not os.path.exists(file_utils.getFullGameApk(game)):
-        print('game "%s" not exists' % game)
-        return 1
-    # if not os.path.exists(file_utils.getFullSDKPath(sdk)):
-    #     print('sdk "%s" not exists' % sdk)
-    #     return 1
-    global  startTime
-    startTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
-
-    # 读取配置
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    if not os.path.exists(configPath):
-        print('%s not exists' % configPath)
-        return 1
-    
-    jsonText = file_utils.readFile(configPath)
-    config = json.loads(jsonText)
-
-    # 检查参数
-    if not config_utils.checkConfig(config):
-        return 1
-
-    # 处理参数
-    config_utils.replaceArgs(config)
-
-    successCount = 0
-    failureCount = 0
-    if type(config) == dict:
-        if subChannel is None or config['subChannel'] == subChannel:
-            ret = pack(game, sdk, config)
-            if ret:
-                failureCount += 1
-            else:
-                successCount += 1
-        else:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-    elif type(config) == list:
-        found = False
-        for itemConfig in config:
-            if subChannel is None or itemConfig['subChannel'] == subChannel:
-                found = True
-                ret = pack(game, sdk, itemConfig)
-                if ret:
-                    failureCount += 1
-                else:
-                    successCount += 1
-
-        if not found:
-            print('subChannel "%s" no found' % subChannel)
-            return 1
-
-    print('success %d, failure %d' % (successCount, failureCount))
-        
-    return 0

+ 134 - 118
package_web.py

@@ -1,52 +1,50 @@
-import file_utils
-import package_utils
-import package_web_record
-import package_web_shanshen
-import package_web_yfsdk
+import importlib
+import json
 import os.path
 import os.path
 import sys
 import sys
-import json
-import importlib
+
 import common_utils
 import common_utils
+import file_utils
+import package_utils
 
 
-sdkMapping = {
-    'ysdk': 'jm_ysdk',
-    'ziyun': {
-        'default': 'jm_zy',
-        'ysdk': 'jm_zy_ysdk',
-    },
-    'xunqu': {
-        'default': 'jm_xq',
-        'xiaomi': 'jm_xq_mi',
-        'jrtt': 'jm_xq_jrtt'
-    },
-    'jingqi': 'jm_jq',
-    'qytx': {
-        'default': 'jm_qytx',
-        'cangyu': 'jm_qytx2',
-        'cangyu_new': 'jm_cangyu'
-    },
+sdk_mapping = {
     'jmsdk': 'jm',
     'jmsdk': 'jm',
-    'oppo': 'jm_oppo',
-    'quick': 'jm_quick',
-    'beiyu': 'jm_beiyu',
-    'yijie': 'jm_yijie',
-    'gzjysdk': 'gzjysdk',
-    'record': 'record',
-    'float': 'float',
-    'yfsdk': 'yfsdk'
+    'qingshi': 'qingshi'
 }
 }
 
 
-scriptMapping = {
-    'jm_xq_mi': 'jm_xq',
-    'jm_xq_jrtt': 'jm_xq',
-    'jm_qytx2': 'jm_qytx',
-    'jm_cangyu': 'jm_qytx'
+script_mapping = {
+    'jmsdk': 'jm',
+    'qingshi': 'qingshi'
 }
 }
 
 
-newSdk = ["shanshen", "gzjysdk"]
-recordSdk = ["record", "float"]
-yanfaSdk = ["yfsdk"]  # 研发sdk打包
+
+def package_test(package_config):
+    # 打包配置的路径
+    json_text = file_utils.read_file(package_config)
+    config = json.loads(json_text)
+    # 重构sdk判断
+    if 'refactorSdk' in config and toBoolean(config['refactorSdk']):
+        print('重构sdk特殊处理...')
+        config['sdk'] = 'qingshi'
+        properties = config['properties']
+        if 'version' in properties:
+            properties['QS_PACKAGE_VERSION'] = properties.pop('version')
+        if 'agent' in properties:
+            properties['QS_CAMPAIGN_ID'] = properties.pop('agent')
+        if 'appid' in properties:
+            properties['QS_APP_ID'] = properties.pop('appid')
+        if 'appkey' in properties:
+            properties['QS_APP_KEY'] = properties.pop('appkey')
+        if 'host' in properties:
+            properties['QS_ONLINE_ENV'] = properties.pop('host')
+        if 'testGcpCode' in config:
+            properties['QS_GCP_ID'] = config['testGcpCode']
+    print('*************config*****************')
+    print(json.JSONEncoder().encode(config))
+    print('************************************')
+
+    sdk = get_mapping_sdk(config)
+    package(config, sdk)
 
 
 
 
 def packageWeb():
 def packageWeb():
@@ -56,21 +54,31 @@ def packageWeb():
 
 
     # 打包配置的路径
     # 打包配置的路径
     packageConfig = sys.argv[1]
     packageConfig = sys.argv[1]
-    jsonText = file_utils.readFile(packageConfig)
-    config = json.loads(jsonText)
+    json_text = file_utils.read_file(packageConfig)
+    config = json.loads(json_text)
+    # 重构sdk判断
+    if 'refactorSdk' in config and toBoolean(config['refactorSdk']):
+        print('重构sdk特殊处理...')
+        config['sdk'] = 'qingshi'
+        properties = config['properties']
+        if 'version' in properties:
+            properties['QS_PACKAGE_VERSION'] = properties.pop('version')
+        if 'agent' in properties:
+            properties['QS_CAMPAIGN_ID'] = properties.pop('agent')
+        if 'appid' in properties:
+            properties['QS_APP_ID'] = properties.pop('appid')
+        if 'appkey' in properties:
+            properties['QS_APP_KEY'] = properties.pop('appkey')
+        if 'host' in properties:
+            properties['QS_ONLINE_ENV'] = properties.pop('host')
+        if 'testGcpCode' in config:
+            properties['QS_GCP_ID'] = config['testGcpCode']
     print('*************config*****************')
     print('*************config*****************')
-    print(jsonText)
+    print(json.JSONEncoder().encode(config))
     print('************************************')
     print('************************************')
 
 
-    sdk = getMappingSdk(config)
-    if sdk in recordSdk:
-        package_web_record.package(config, sdk)
-    elif sdk in newSdk:
-        package_web_shanshen.package(config, sdk)
-    elif sdk in yanfaSdk:
-        package_web_yfsdk.package(config, sdk)
-    else:
-        package(config, sdk)
+    sdk = get_mapping_sdk(config)
+    package(config, sdk)
 
 
 
 
 def package(config, sdk):
 def package(config, sdk):
@@ -82,13 +90,13 @@ def package(config, sdk):
     if 'subChannel' in config:
     if 'subChannel' in config:
         subChannel = config['subChannel']
         subChannel = config['subChannel']
         jsonConfig['subChannel'] = config['subChannel']
         jsonConfig['subChannel'] = config['subChannel']
-    config['random'] = common_utils.getRandomNumber(6)
+    config['random'] = common_utils.get_random_number(6)
     outName = config['random']
     outName = config['random']
 
 
     channelPath = file_utils.getChannelPath(game, outName, sdk)
     channelPath = file_utils.getChannelPath(game, outName, sdk)
     subChannelPath = os.path.join(channelPath, subChannel)
     subChannelPath = os.path.join(channelPath, subChannel)
     print('打包开始,删除缓存目录 %s ' % subChannelPath)
     print('打包开始,删除缓存目录 %s ' % subChannelPath)
-    file_utils.deleteFolder(subChannelPath)
+    file_utils.delete_folder(subChannelPath)
 
 
     # 必须参数
     # 必须参数
     jsonConfig['packageName'] = config['packageName']
     jsonConfig['packageName'] = config['packageName']
@@ -122,6 +130,9 @@ def package(config, sdk):
     if 'aapt2disable' in config:
     if 'aapt2disable' in config:
         jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])
         jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])
 
 
+    if 'refactorSdk' in config and toBoolean(config['refactorSdk']):
+        jsonConfig['refactorSdk'] = toBoolean(config['refactorSdk'])
+
     # sdk相关参数
     # sdk相关参数
     if 'properties' in config:
     if 'properties' in config:
         jsonConfig['properties'] = config['properties']
         jsonConfig['properties'] = config['properties']
@@ -175,51 +186,51 @@ def package(config, sdk):
     if 'ks_params' in config:
     if 'ks_params' in config:
         jsonConfig['logSdk'] = ['ks']
         jsonConfig['logSdk'] = ['ks']
     # 获取sdk相关配置
     # 获取sdk相关配置
-    getSdkConfig(sdk, jsonConfig, config)
+    get_sdk_config(sdk, jsonConfig, config)
 
 
     # 生成配置文件
     # 生成配置文件
-    createOrUpdateConfigFile(game, sdk, jsonConfig)
+    create_or_update_config_file(game, sdk, jsonConfig)
 
 
     # 拷贝资源
     # 拷贝资源
-    copyRes(game, sdk, subChannel, config)
+    copy_res(game, sdk, subChannel, config)
 
 
     # 打包
     # 打包
     package_utils.packConsole(game, sdk, config, subChannel)
     package_utils.packConsole(game, sdk, config, subChannel)
 
 
 
 
-def toBoolean(booleanStr):
-    if type(booleanStr) == bool:
-        return booleanStr
+def toBoolean(bool_str):
+    if type(bool_str) == bool:
+        return bool_str
 
 
-    if booleanStr == 'true':
+    if bool_str == 'true':
         return True
         return True
     return False
     return False
 
 
 
 
-def getSdkConfig(sdk, jsonConfig, config):
-    scriptPath = os.path.join(file_utils.getCurrentPath(), 'sdk_script')
-    sdkScript = getScriptMapping(sdk)
-    targetScript = os.path.join(scriptPath, '%s.py' % sdkScript)
-    if not os.path.exists(targetScript):
-        print('%s no exists' % targetScript)
+def get_sdk_config(sdk, json_config, config):
+    script_path = os.path.join(file_utils.get_current_path(), 'sdk_script')
+    sdk_script = get_script_mapping(sdk)
+    target_script = os.path.join(script_path, '%s.py' % sdk_script)
+    if not os.path.exists(target_script):
+        print('%s no exists' % target_script)
         return 0
         return 0
-    print('sdk_script -- > %s' % targetScript)
-    sys.path.append(scriptPath)
-    module = importlib.import_module(sdkScript)  # 动态导入相应模块
-    module.getSdkConfig(jsonConfig, config)  # 执行脚本功能
-    sys.path.remove(scriptPath)
+    print('sdk_script -- > %s' % target_script)
+    sys.path.append(script_path)
+    module = importlib.import_module(sdk_script)  # 动态导入相应模块
+    module.get_sdk_config(json_config, config)  # 执行脚本功能
+    sys.path.remove(script_path)
 
 
 
 
-def createOrUpdateConfigFile(game, sdk, jsonConfig):
-    '''
+def create_or_update_config_file(game, sdk, json_config):
+    """
     更新配置文件
     更新配置文件
-    '''
-    if 'subChannel' not in jsonConfig:
+    """
+    if 'subChannel' not in json_config:
         return 0
         return 0
 
 
     print('createOrUpdateConfigFile ...')
     print('createOrUpdateConfigFile ...')
 
 
-    random = jsonConfig['random']
+    random = json_config['random']
 
 
     channelPath = file_utils.getChannelPath(game, random, sdk)
     channelPath = file_utils.getChannelPath(game, random, sdk)
     configPath = os.path.join(channelPath, 'config.json')
     configPath = os.path.join(channelPath, 'config.json')
@@ -228,62 +239,65 @@ def createOrUpdateConfigFile(game, sdk, jsonConfig):
     print("channelPath%s" % channelPath)
     print("channelPath%s" % channelPath)
     if os.path.exists(configPath):
     if os.path.exists(configPath):
         # 更新数据
         # 更新数据
-        jsonText = file_utils.readFile(configPath)
+        jsonText = file_utils.read_file(configPath)
         config = json.loads(jsonText)
         config = json.loads(jsonText)
 
 
         count = 0
         count = 0
         if type(config) == list:
         if type(config) == list:
             for item in config:
             for item in config:
-                if item['subChannel'] == jsonConfig['subChannel']:
+                if item['subChannel'] == json_config['subChannel']:
                     print('find same config ...')
                     print('find same config ...')
                     del config[count]
                     del config[count]
                     break
                     break
 
 
                 count += 1
                 count += 1
 
 
-            config.append(jsonConfig)
+            config.append(json_config)
 
 
             createConfigFile(config, configPath)
             createConfigFile(config, configPath)
         elif type(config) == dict:
         elif type(config) == dict:
-            if config['subChannel'] == jsonConfig['subChannel']:
+            if config['subChannel'] == json_config['subChannel']:
                 print('find same config ...')
                 print('find same config ...')
-                createConfigFile(jsonConfig, configPath)
+                createConfigFile(json_config, configPath)
             else:
             else:
                 print('add a new config ...')
                 print('add a new config ...')
-                config = [config, jsonConfig]
+                config = [config, json_config]
 
 
                 createConfigFile(config, configPath)
                 createConfigFile(config, configPath)
     else:
     else:
         print('create a new config ...')
         print('create a new config ...')
-        createConfigFile([jsonConfig], configPath)
+        createConfigFile([json_config], configPath)
 
 
 
 
-def createConfigFile(jsonConfig, configPath):
-    '''
+def createConfigFile(json_config, config_path):
+    """
     创建配置文件
     创建配置文件
-    '''
-    jsonStr = json.dumps(jsonConfig, ensure_ascii=False)
+    """
+    jsonStr = json.dumps(json_config, ensure_ascii=False)
     print('*************out config*************')
     print('*************out config*************')
     print(jsonStr)
     print(jsonStr)
     print('************************************')
     print('************************************')
-    file_utils.createFile(configPath, jsonStr)
+    file_utils.create_file(config_path, jsonStr)
 
 
 
 
-def copyRes(game, sdk, subChannel, config):
-    '''
+def copy_res(game, sdk, sub_channel, config):
+    """
     拷贝资源
     拷贝资源
-    '''
-    if subChannel is None:
+    """
+    if sub_channel is None:
         return 0
         return 0
     random = config['random']
     random = config['random']
     channelPath = file_utils.getChannelPath(game, random, sdk)
     channelPath = file_utils.getChannelPath(game, random, sdk)
-    subChannelPath = os.path.join(channelPath, subChannel)
+    subChannelPath = os.path.join(channelPath, sub_channel)
+    print('channel_path: %s' % channelPath)
+    print('sub_channel_path: %s' % subChannelPath)
+
     if 'icon' in config and os.path.exists(config['icon']):
     if 'icon' in config and os.path.exists(config['icon']):
         mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
         mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
         for mipmap in mipmapSupport:
         for mipmap in mipmapSupport:
             iconPath = os.path.join(
             iconPath = os.path.join(
                 subChannelPath, 'icon', mipmap, 'common_sdk_icon.png')
                 subChannelPath, 'icon', mipmap, 'common_sdk_icon.png')
-            file_utils.copyFile(config['icon'], iconPath)
+            file_utils.copy_file(config['icon'], iconPath)
 
 
     '''if 'switchIcon' in config and os.path.exists(config['switchIcon']):
     '''if 'switchIcon' in config and os.path.exists(config['switchIcon']):
         mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
         mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
@@ -294,7 +308,7 @@ def copyRes(game, sdk, subChannel, config):
     if 'splash' in config and os.path.exists(config['splash']):
     if 'splash' in config and os.path.exists(config['splash']):
         splashPath = os.path.join(
         splashPath = os.path.join(
             subChannelPath, 'splash', 'drawable-hdpi', 'common_sdk_launcher_bg.jpg')
             subChannelPath, 'splash', 'drawable-hdpi', 'common_sdk_launcher_bg.jpg')
-        file_utils.copyFile(config['splash'], splashPath)
+        file_utils.copy_file(config['splash'], splashPath)
 
 
     # print('------subChannelPath 目录清空:%s  -------' % subChannelPath)
     # print('------subChannelPath 目录清空:%s  -------' % subChannelPath)
     # file_utils.deleteFolder(subChannelPath)
     # file_utils.deleteFolder(subChannelPath)
@@ -311,51 +325,53 @@ def copyRes(game, sdk, subChannel, config):
             if toFile[:3] == 'res':
             if toFile[:3] == 'res':
                 toFile = 'image' + toFile[3:]
                 toFile = 'image' + toFile[3:]
 
 
-            resPath = getPackagePath(subChannelPath, toFile)
-            file_utils.copyFile(item['fromFile'], resPath)
+            resPath = get_package_path(subChannelPath, toFile)
+            file_utils.copy_file(item['fromFile'], resPath)
 
 
     if 'package' in config and os.path.exists(config['package']):
     if 'package' in config and os.path.exists(config['package']):
         newGameApk = config['package']
         newGameApk = config['package']
         gameApk = file_utils.getFullGameApk(game)
         gameApk = file_utils.getFullGameApk(game)
-        cacheGameApk = file_utils.getCacheGameApk(game, random, sdk)
-        file_utils.copyFile(newGameApk, cacheGameApk)
+        cache_game_apk = file_utils.get_cache_game_apk(game, random, sdk)
+        file_utils.copy_file(newGameApk, cache_game_apk)
         return 1
         return 1
 
 
 
 
-def getPackagePath(basePath, packageName):
-    '''
+def get_package_path(base_path, package_name):
+    """
     包名对应的目录
     包名对应的目录
-    '''
-    packageNameSplit = packageName.replace('\\', '/').split('/')
-    newPath = basePath
-    for item in packageNameSplit:
+    """
+    package_name_split = package_name.replace('\\', '/').split('/')
+    newPath = base_path
+    for item in package_name_split:
         newPath = os.path.join(newPath, item)
         newPath = os.path.join(newPath, item)
     return newPath
     return newPath
 
 
 
 
-def getMappingSdk(config):
+def get_mapping_sdk(config):
     sdk = config['sdk']
     sdk = config['sdk']
     mapping = sdk
     mapping = sdk
-    if sdk in sdkMapping:
-        mapping = sdkMapping[sdk]
+    if sdk in sdk_mapping:
+        mapping = sdk_mapping[sdk]
     else:
     else:
         return 'jm_' + sdk
         return 'jm_' + sdk
 
 
     if type(mapping) == dict:
     if type(mapping) == dict:
-        sdkConfig = config[sdk]
-        if 'SUB_CHANNEL' in sdkConfig and sdkConfig['SUB_CHANNEL'] != '':
-            subChannel = sdkConfig['SUB_CHANNEL']
+        sdk_config = config[sdk]
+        if 'SUB_CHANNEL' in sdk_config and sdk_config['SUB_CHANNEL'] != '':
+            sub_channel = sdk_config['SUB_CHANNEL']
         else:
         else:
-            subChannel = 'default'
-        return mapping[subChannel]
+            sub_channel = 'default'
+        return mapping[sub_channel]
     else:
     else:
         return mapping
         return mapping
 
 
 
 
-def getScriptMapping(sdk):
-    if sdk in scriptMapping:
-        return scriptMapping[sdk]
+def get_script_mapping(sdk):
+    if sdk in script_mapping:
+        return script_mapping[sdk]
     return sdk
     return sdk
 
 
 
 
-packageWeb()
+# packageWeb()
+if __name__ == '__main__':
+    package_test('/Users/suyghur/Develop/yyxx/qs/test_config/test.json')

+ 0 - 314
package_web_record.py

@@ -1,314 +0,0 @@
-import file_utils
-import package_utils_record
-import os.path
-import sys
-import json
-import importlib
-from PIL import Image, ImageDraw
-
-def packageWeb():
-    if len(sys.argv) < 2:
-        print('argument is missing')
-        return 1
-
-    # 打包配置的路径
-    packageConfig = sys.argv[1]
-
-    jsonText = file_utils.readFile(packageConfig)
-    config = json.loads(jsonText)
-
-    print('*************config*****************')
-    print(jsonText)
-    print('************************************')
-
-    package(config, config['sdk'])
-
-def package(config, sdk):
-    print('use script 3rd')
-    jsonConfig = {}
-    game = config['app']
-    subChannel = None
-
-    if 'subChannel' in config:
-        subChannel = config['subChannel']
-        jsonConfig['subChannel'] = config['subChannel']
-
-    # 必须参数
-    jsonConfig['packageName'] = config['packageName']
-    jsonConfig['name'] = config['name']
-
-    # 可选参数
-    if 'outName' in config:
-        jsonConfig['outName'] = config['outName']
-
-    if 'outPath' in config:
-        jsonConfig['outPath'] = config['outPath']
-
-    if 'changeIcon' in config:
-        jsonConfig['changeIcon'] = toBoolean(config['changeIcon'])
-
-    if 'addLauncher' in config:
-        jsonConfig['addLauncher'] = toBoolean(config['addLauncher'])
-
-    if 'versionCode' in config:
-        jsonConfig['versionCode'] = config['versionCode']
-
-    if 'versionName' in config:
-        jsonConfig['versionName'] = config['versionName']
-
-    if 'targetSdkVersion' in config:
-        jsonConfig['targetSdkVersion'] = config['targetSdkVersion']
-        
-    if 'v2disable' in config:
-        jsonConfig['v2disable'] = toBoolean(config['v2disable'])
-
-    if 'aapt2disable' in config:
-        jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])
-
-    # sdk相关参数
-    if 'properties' in config:
-        jsonConfig['properties'] = config['properties']
-
-    jsonConfig['bgMusic'] = config['bgMusic']
-    if 'recordConfig' in config:
-        recordConfig = config['recordConfig']
-        setRecordConfig(jsonConfig, recordConfig)
-
-        userIcon = recordConfig['userIcon']
-        suffix = userIcon[userIcon.index('.'):]
-        item = {'fromFile':userIcon, 'toFile':'res/drawable/float_sdk_user_icon' + suffix}
-
-        if 'copyList' in config:
-            copyList = config['copyList']
-            copyList.append(item)
-        else:
-            config['copyList'] = [item]
-
-    configData = jsonConfig['configData']
-    properties = jsonConfig['properties']
-    configData['agent'] = properties['agent']
-    configData['buildTime'] = properties['version']
-    configData['appId'] = properties['appid']
-    configData['appkey'] = properties['appkey']
-    if 'host' in properties:
-        configData['host'] = properties['host']
-
-    if 'deleteList' in config:
-        jsonConfig['deleteList'] = config['deleteList']
-
-    
-
-    # 获取sdk相关配置
-    getSdkConfig(sdk, jsonConfig, config)
-
-    # 生成配置文件
-    createOrUpdateConfigFile(game, sdk, jsonConfig)
-
-    # 拷贝资源
-    copyRes(game, sdk, subChannel, config)
-
-    # 打包
-    package_utils_record.packConsole(game, sdk, subChannel)
-
-def setRecordConfig(config, recordConfig):
-    configData = None
-    if 'configData' in config:
-        configData = config['configData']
-        configData['bgMusic'] = 'bg_music.mp3'
-        configData['gameId'] = recordConfig['gameId']
-        configData['gameName'] = recordConfig['gameName']
-        configData['gameIcon'] = recordConfig['gameIcon']
-        configData['gameUrl'] = recordConfig['gameUrl']
-        configData['skinId'] = recordConfig['skinId']
-        configData['host'] = recordConfig['host']
-        configData['appDownUrl'] = recordConfig['appDownUrl']
-        configData['userId'] = recordConfig['userId']
-        configData['userName'] = recordConfig['userName']
-        configData['userDesc'] = recordConfig['userDesc']
-    else:
-        config['configData'] = {
-            'bgMusic':'bg_music.mp3',
-            'gameId':recordConfig['gameId'],
-            'gameName':recordConfig['gameName'],
-            'gameIcon':recordConfig['gameIcon'],
-            'gameUrl':recordConfig['gameUrl'],
-            'skinId':recordConfig['skinId'],
-            'host':recordConfig['host'],
-            'appDownUrl':recordConfig['appDownUrl'],
-            'userId':recordConfig['userId'],
-            'userName':recordConfig['userName'],
-            'userDesc':recordConfig['userDesc']
-        }
-
-def toBoolean(booleanStr):
-    if type(booleanStr) == bool:
-        return booleanStr
-
-    if booleanStr == 'true':
-        return True
-    return False
-
-def getSdkConfig(sdk, jsonConfig, config):
-    scriptPath = os.path.join(file_utils.getCurrentPath(), 'sdk_script')
-    sdkScript = getScriptMapping(sdk)
-    targetScript = os.path.join(scriptPath, '%s.py' % sdkScript)
-    if not os.path.exists(targetScript):
-        print('%s no exists' % targetScript)
-        return 0
-
-    sys.path.append(scriptPath)
-    module = importlib.import_module(sdkScript)# 动态导入相应模块
-    module.getSdkConfig(jsonConfig, config)# 执行脚本功能
-    sys.path.remove(scriptPath)
-
-def createOrUpdateConfigFile(game, sdk, jsonConfig):
-    '''
-    更新配置文件
-    '''
-    if 'subChannel' not in jsonConfig:
-        return 0
-
-    print('createOrUpdateConfigFile ...')
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    #configPath = os.path.join(file_utils.getCurrentPath(), 'test', 'test.json')
-
-    if os.path.exists(configPath):
-        # 更新数据
-        jsonText = file_utils.readFile(configPath)
-        config = json.loads(jsonText)
-
-        count = 0
-        if type(config) == list:
-            for item in config:
-                if item['subChannel'] == jsonConfig['subChannel']:
-                    print('find same config ...')
-                    del config[count]
-                    break
-
-                count += 1
-
-            config.append(jsonConfig)
-
-            createConfigFile(config, configPath)
-        elif type(config) == dict:
-            if config['subChannel'] == jsonConfig['subChannel']:
-                print('find same config ...')
-                createConfigFile(jsonConfig, configPath)
-            else:
-                print('add a new config ...')
-                config = [config, jsonConfig]
-
-                createConfigFile(config, configPath)
-    else:
-        print('create a new config ...')
-        createConfigFile([jsonConfig], configPath)
-
-def createConfigFile(jsonConfig, configPath):
-    '''
-    创建配置文件
-    '''
-    jsonStr = json.dumps(jsonConfig, ensure_ascii=False)
-    print('*************out config*************')
-    print(jsonStr)
-    print('************************************')
-    file_utils.createFile(configPath, jsonStr)
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    拷贝资源
-    '''
-    if subChannel is None:
-        return 0
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    subChannelPath = os.path.join(channelPath, subChannel)
-    if 'icon' in config and os.path.exists(config['icon']):
-        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
-        for mipmap in mipmapSupport:
-            mipmapPath = os.path.join(subChannelPath, 'icon', mipmap)
-            if not os.path.exists(mipmapPath):
-                os.makedirs(mipmapPath)
-            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'record_sdk_icon.png')
-            if not os.path.exists(iconPath):
-                file_utils.createFile(iconPath, '')
-            if mipmap == 'mipmap-xhdpi':
-                size = 96
-            elif mipmap == 'mipmap-xxhdpi':
-                size = 144
-            else:
-                size = 192
-            roundRectangleIcon(config['icon'], iconPath, size)
-            #file_utils.copyFile(config['icon'], iconPath)
-
-    if 'splash' in config and os.path.exists(config['splash']):
-        splashPath = os.path.join(subChannelPath, 'splash', 'drawable-hdpi', 'shanshen_sdk_launcher_bg.jpg')
-        file_utils.copyFile(config['splash'], splashPath)
-
-    if 'bgMusic' in config and os.path.exists(config['bgMusic']):
-        musicPath = os.path.join(subChannelPath, 'assets', 'bg_music.mp3')
-        file_utils.copyFile(config['bgMusic'], musicPath)
-
-    if 'copyList' in config:
-        for item in config['copyList']:
-            if item['toFile'] == '':
-                continue
-
-            if not os.path.exists(item['fromFile']):
-                continue
-
-            toFile = item['toFile']
-            if toFile[:3] == 'res':
-                toFile = 'image' + toFile[3:]
-                
-            resPath = getPackagePath(subChannelPath, toFile)
-            file_utils.copyFile(item['fromFile'], resPath)
-
-    if 'package' in config and os.path.exists(config['package']):
-        newGameApk = config['package']
-        gameApk = file_utils.getFullGameApk(game)
-        file_utils.copyFile(newGameApk, gameApk)
-
-    if 'languageList' in config:
-        for item in config['languageList']:
-            languagePath = os.path.join(subChannelPath, 'merge', item['apkLanguage'])
-            file_utils.copyFile(item['language'], languagePath)
-
-def roundRectangleIcon(iconPath, outPath, outSize):
-    markerPath = os.path.join(file_utils.getFullInternalPath(), 'marker', 'marker.png')
-    img = Image.open(iconPath).resize((192, 192)).convert("RGBA")
-    marker = Image.open(markerPath).resize((192, 192)).convert("RGBA")
-    img.paste(marker, (0, 0), marker)
-
-    rad = 30  # 设置半径 
-    circle = Image.new('L', (rad * 2, rad * 2), 0)
-    draw = ImageDraw.Draw(circle)
-    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
-    alpha = Image.new('L', img.size, 255)
-    w, h = img.size
-    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
-    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
-    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
-    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
-    img.putalpha(alpha)
-
-    img.resize((outSize, outSize)).save(outPath, 'png')
-
-def getPackagePath(basePath, packageName):
-    '''
-    包名对应的目录
-    '''
-    packageNameSplit = packageName.replace('\\', '/').split('/')
-    newPath = basePath
-    for item in packageNameSplit:
-        newPath = os.path.join(newPath, item)
-    return newPath
-
-def getMappingSdk(config):
-    return config['sdk']
-
-def getScriptMapping(sdk):
-    return sdk
-
-#packageWeb()

+ 0 - 213
package_web_shanshen.py

@@ -1,213 +0,0 @@
-import file_utils
-import package_utils_shanshen
-import os.path
-import sys
-import json
-import importlib
-
-def packageWeb():
-    if len(sys.argv) < 2:
-        print('argument is missing')
-        return 1
-
-    # 打包配置的路径
-    packageConfig = sys.argv[1]
-
-    jsonText = file_utils.readFile(packageConfig)
-    config = json.loads(jsonText)
-
-    print('*************config*****************')
-    print(jsonText)
-    print('************************************')
-
-    package(config, config['sdk'])
-
-def package(config, sdk):
-    print('use script 2nd')
-    jsonConfig = {}
-    game = config['app']
-    subChannel = None
-
-    if 'subChannel' in config:
-        subChannel = config['subChannel']
-        jsonConfig['subChannel'] = config['subChannel']
-
-    # 必须参数
-    jsonConfig['packageName'] = config['packageName']
-    jsonConfig['name'] = config['name']
-
-    # 可选参数
-    if 'outName' in config:
-        jsonConfig['outName'] = config['outName']
-
-    if 'outPath' in config:
-        jsonConfig['outPath'] = config['outPath']
-
-    if 'changeIcon' in config:
-        jsonConfig['changeIcon'] = toBoolean(config['changeIcon'])
-
-    if 'addLauncher' in config:
-        jsonConfig['addLauncher'] = toBoolean(config['addLauncher'])
-
-    if 'versionCode' in config:
-        jsonConfig['versionCode'] = config['versionCode']
-
-    if 'versionName' in config:
-        jsonConfig['versionName'] = config['versionName']
-
-    if 'targetSdkVersion' in config:
-        jsonConfig['targetSdkVersion'] = config['targetSdkVersion']
-        
-    if 'v2disable' in config:
-        jsonConfig['v2disable'] = toBoolean(config['v2disable'])
-
-    if 'aapt2disable' in config:
-        jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])
-
-    # sdk相关参数
-    if 'properties' in config:
-        jsonConfig['properties'] = config['properties']
-
-    # 获取sdk相关配置
-    getSdkConfig(sdk, jsonConfig, config)
-
-    # 生成配置文件
-    createOrUpdateConfigFile(game, sdk, jsonConfig)
-
-    # 拷贝资源
-    copyRes(game, sdk, subChannel, config)
-
-    # 打包
-    package_utils_shanshen.packConsole(game, sdk, subChannel)
-
-def toBoolean(booleanStr):
-    if type(booleanStr) == bool:
-        return booleanStr
-
-    if booleanStr == 'true':
-        return True
-    return False
-
-def getSdkConfig(sdk, jsonConfig, config):
-    scriptPath = os.path.join(file_utils.getCurrentPath(), 'sdk_script')
-    sdkScript = getScriptMapping(sdk)
-    targetScript = os.path.join(scriptPath, '%s.py' % sdkScript)
-    if not os.path.exists(targetScript):
-        print('%s no exists' % targetScript)
-        return 0
-
-    sys.path.append(scriptPath)
-    module = importlib.import_module(sdkScript)# 动态导入相应模块
-    module.getSdkConfig(jsonConfig, config)# 执行脚本功能
-    sys.path.remove(scriptPath)
-
-def createOrUpdateConfigFile(game, sdk, jsonConfig):
-    '''
-    更新配置文件
-    '''
-    if 'subChannel' not in jsonConfig:
-        return 0
-
-    print('createOrUpdateConfigFile ...')
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    #configPath = os.path.join(file_utils.getCurrentPath(), 'test', 'test.json')
-
-    if os.path.exists(configPath):
-        # 更新数据
-        jsonText = file_utils.readFile(configPath)
-        config = json.loads(jsonText)
-
-        count = 0
-        if type(config) == list:
-            for item in config:
-                if item['subChannel'] == jsonConfig['subChannel']:
-                    print('find same config ...')
-                    del config[count]
-                    break
-
-                count += 1
-
-            config.append(jsonConfig)
-
-            createConfigFile(config, configPath)
-        elif type(config) == dict:
-            if config['subChannel'] == jsonConfig['subChannel']:
-                print('find same config ...')
-                createConfigFile(jsonConfig, configPath)
-            else:
-                print('add a new config ...')
-                config = [config, jsonConfig]
-
-                createConfigFile(config, configPath)
-    else:
-        print('create a new config ...')
-        createConfigFile([jsonConfig], configPath)
-
-def createConfigFile(jsonConfig, configPath):
-    '''
-    创建配置文件
-    '''
-    jsonStr = json.dumps(jsonConfig, ensure_ascii=False)
-    print('*************out config*************')
-    print(jsonStr)
-    print('************************************')
-    file_utils.createFile(configPath, jsonStr)
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    拷贝资源
-    '''
-    if subChannel is None:
-        return 0
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    subChannelPath = os.path.join(channelPath, subChannel)
-    if 'icon' in config and os.path.exists(config['icon']):
-        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
-        for mipmap in mipmapSupport:
-            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'shanshen_sdk_icon.png')
-            file_utils.copyFile(config['icon'], iconPath)
-
-    if 'splash' in config and os.path.exists(config['splash']):
-        splashPath = os.path.join(subChannelPath, 'splash', 'drawable-hdpi', 'shanshen_sdk_launcher_bg.jpg')
-        file_utils.copyFile(config['splash'], splashPath)
-
-    if 'copyList' in config:
-        for item in config['copyList']:
-            if item['toFile'] == '':
-                continue
-
-            if not os.path.exists(item['fromFile']):
-                continue
-
-            toFile = item['toFile']
-            if toFile[:3] == 'res':
-                toFile = 'image' + toFile[3:]
-                
-            resPath = getPackagePath(subChannelPath, toFile)
-            file_utils.copyFile(item['fromFile'], resPath)
-
-    if 'package' in config and os.path.exists(config['package']):
-        newGameApk = config['package']
-        gameApk = file_utils.getFullGameApk(game)
-        file_utils.copyFile(newGameApk, gameApk)
-
-def getPackagePath(basePath, packageName):
-    '''
-    包名对应的目录
-    '''
-    packageNameSplit = packageName.replace('\\', '/').split('/')
-    newPath = basePath
-    for item in packageNameSplit:
-        newPath = os.path.join(newPath, item)
-    return newPath
-
-def getMappingSdk(config):
-    return config['sdk']
-
-def getScriptMapping(sdk):
-    return sdk
-
-#packageWeb()

+ 0 - 205
package_web_yfsdk.py

@@ -1,205 +0,0 @@
-import file_utils
-import package_utils_yfsdk
-import os.path
-import sys
-import json
-import importlib
-
-def packageWeb():
-    if len(sys.argv) < 2:
-        print('argument is missing')
-        return 1
-
-    # 打包配置的路径
-    packageConfig = sys.argv[1]
-
-    jsonText = file_utils.readFile(packageConfig)
-    config = json.loads(jsonText)
-
-    print('*************config*****************')
-    print(jsonText)
-    print('************************************')
-
-    package(config, config['sdk'])
-
-def package(config, sdk):
-    print('use script yfsdk')
-    jsonConfig = {}
-    game = config['app']
-    subChannel = None
-
-    if 'subChannel' in config:
-        subChannel = config['subChannel']
-        jsonConfig['subChannel'] = config['subChannel']
-
-    # 必须参数
-    jsonConfig['packageName'] = config['packageName']
-    jsonConfig['name'] = config['name']
-
-    # 可选参数
-    if 'outName' in config:
-        jsonConfig['outName'] = config['outName']
-
-    if 'outPath' in config:
-        jsonConfig['outPath'] = config['outPath']
-
-    if 'changeIcon' in config:
-        jsonConfig['changeIcon'] = toBoolean(config['changeIcon'])
-
-    if 'addLauncher' in config:
-        jsonConfig['addLauncher'] = toBoolean(config['addLauncher'])
-
-    if 'versionCode' in config:
-        jsonConfig['versionCode'] = config['versionCode']
-
-    if 'versionName' in config:
-        jsonConfig['versionName'] = config['versionName']
-
-    if 'targetSdkVersion' in config:
-        jsonConfig['targetSdkVersion'] = config['targetSdkVersion']
-
-    if 'v2disable' in config:
-        jsonConfig['v2disable'] = toBoolean(config['v2disable'])
-
-    if 'aapt2disable' in config:
-        jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])
-
-        # sdk相关参数
-    if 'properties' in config:
-        jsonConfig['properties'] = config['properties']
-
-    # 生成配置文件
-    createOrUpdateConfigFile(game, sdk, jsonConfig)
-
-    # 拷贝资源
-    copyRes(game, sdk, subChannel, config)
-
-    # 打包
-    package_utils_yfsdk.packConsole(game, sdk, subChannel)
-
-def toBoolean(booleanStr):
-    if type(booleanStr) == bool:
-        return booleanStr
-
-    if booleanStr == 'true':
-        return True
-    return False
-
-
-def createOrUpdateConfigFile(game, sdk, jsonConfig):
-    '''
-    更新配置文件
-    '''
-    if 'subChannel' not in jsonConfig:
-        return 0
-
-    print('createOrUpdateConfigFile ...')
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    configPath = os.path.join(channelPath, 'config.json')
-    # configPath = os.path.join(file_utils.getCurrentPath(), 'test', 'test.json')
-
-    if os.path.exists(configPath):
-        # 更新数据
-        jsonText = file_utils.readFile(configPath)
-        config = json.loads(jsonText)
-
-        count = 0
-        if type(config) == list:
-            for item in config:
-                if item['subChannel'] == jsonConfig['subChannel']:
-                    print('find same config ...')
-                    del config[count]
-                    break
-
-                count += 1
-
-            config.append(jsonConfig)
-
-            createConfigFile(config, configPath)
-        elif type(config) == dict:
-            if config['subChannel'] == jsonConfig['subChannel']:
-                print('find same config ...')
-                createConfigFile(jsonConfig, configPath)
-            else:
-                print('add a new config ...')
-                config = [config, jsonConfig]
-
-                createConfigFile(config, configPath)
-    else:
-        print('create a new config ...')
-        createConfigFile([jsonConfig], configPath)
-
-
-def createConfigFile(jsonConfig, configPath):
-    '''
-    创建配置文件
-    '''
-    jsonStr = json.dumps(jsonConfig, ensure_ascii=False)
-    print('*************out config*************')
-    print(jsonStr)
-    print('************************************')
-    file_utils.createFile(configPath, jsonStr)
-
-
-def copyRes(game, sdk, subChannel, config):
-    '''
-    拷贝资源
-    '''
-    if subChannel is None:
-        return 0
-
-    channelPath = file_utils.getChannelPath(game, sdk)
-    subChannelPath = os.path.join(channelPath, subChannel)
-    if 'icon' in config and os.path.exists(config['icon']):
-        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
-        for mipmap in mipmapSupport:
-            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'common_sdk_icon.png')
-            print('yfsdk copyRes from--> ' + config['icon'])
-            print('yfsdk copyRes to--> ' + iconPath)
-            file_utils.copyFile(config['icon'], iconPath)
-
-    '''if 'switchIcon' in config and os.path.exists(config['switchIcon']):
-        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
-        for mipmap in mipmapSupport:
-            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'common_sdk_icon2.png')
-            file_utils.copyFile(config['switchIcon'], iconPath)'''
-
-    if 'splash' in config and os.path.exists(config['splash']):
-        splashPath = os.path.join(subChannelPath, 'splash', 'drawable-hdpi', 'common_sdk_launcher_bg.jpg')
-        file_utils.copyFile(config['splash'], splashPath)
-
-    if 'copyList' in config:
-        for item in config['copyList']:
-            if item['toFile'] == '':
-                continue
-
-            if not os.path.exists(item['fromFile']):
-                continue
-
-            toFile = item['toFile']
-            if toFile[:3] == 'res':
-                toFile = 'image' + toFile[3:]
-
-            resPath = getPackagePath(subChannelPath, toFile)
-            file_utils.copyFile(item['fromFile'], resPath)
-
-    if 'package' in config and os.path.exists(config['package']):
-        newGameApk = config['package']
-        gameApk = file_utils.getFullGameApk(game)
-        file_utils.copyFile(newGameApk, gameApk)
-
-
-def getPackagePath(basePath, packageName):
-    '''
-    包名对应的目录
-    '''
-    packageNameSplit = packageName.replace('\\', '/').split('/')
-    newPath = basePath
-    for item in packageNameSplit:
-        newPath = os.path.join(newPath, item)
-    return newPath
-
-
-
-#packageWeb()

+ 0 - 3
package_yfsdk.py

@@ -1,3 +0,0 @@
-import package_utils_yfsdk
-
-package_utils_yfsdk.packConsoleInput()

+ 10 - 8
sdk/jm/libs/config.json

@@ -1,10 +1,12 @@
 {
 {
-	"default":[
-		"android-support-v4.jar",
-		"commons-httpclient-3.1.jar",
-		"org.apache.http.legacy.jar",
-		"walle.jar",
-		"walle-reader-1.1.6.jar",
-		"jm_sdk_20200430.jar"
-	]
+  "default": [
+    "android-support-v4.jar",
+    "commons-httpclient-3.1.jar",
+    "org.apache.http.legacy.jar",
+    "walle.jar",
+    "walle-reader-1.1.6.jar",
+    "qs_sdk_20210906.jar",
+    "glide-3.7.0.jar",
+    "ali_authsdk_2.12.1.jar"
+  ]
 }
 }

+ 49 - 52
sdk/jm/manifest.xml

@@ -1,58 +1,55 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
-	<permissions>
-		<uses-permission android:name="android.permission.INTERNET" />
-		<uses-permission android:name="android.permission.READ_PHONE_STATE" />
-		<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-		<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-		<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-		<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-    <uses-permission android:name="android.permission.BLUETOOTH"/>
-	</permissions>
+    <permissions>
+        <uses-permission android:name="android.permission.INTERNET"/>
+        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
+        <uses-permission android:name="android.permission.BLUETOOTH"/>
+        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
+    </permissions>
 
 
     <application>
     <application>
-		<uses-library android:name="org.apache.http.legacy" android:required="false"/>
-        <activity
-            android:name="com.jmhy.sdk.activity.JmLoginActivity"
-            android:screenOrientation="behind"
-			android:launchMode="singleTop"
-			android:configChanges="orientation|keyboardHidden|screenSize"
-            android:theme="@style/jm_Transparent" />
-        <activity
-            android:name="com.jmhy.sdk.activity.JmAutoLoginActivity"
-            android:screenOrientation="behind"
-			android:launchMode="singleTop"
-			android:configChanges="orientation|keyboardHidden|screenSize"
-            android:theme="@style/jm_Transparent" />
-        <activity
-            android:name="com.jmhy.sdk.activity.JmUserinfoActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:screenOrientation="behind"
-			android:launchMode="singleTop"
-            android:theme="@style/jm_Transparent" />
-        <activity
-            android:name="com.jmhy.sdk.activity.JmpayActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:screenOrientation="behind"
-			android:launchMode="singleTop"
-            android:theme="@style/jm_Transparent" />
-        <activity
-            android:name="com.jmhy.sdk.activity.JmCommunityActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:screenOrientation="portrait"
-			android:launchMode="singleTop"
-            android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" />
-		<activity
-            android:name="com.jmhy.sdk.activity.PermissionActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:screenOrientation="behind"
-            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
-		<activity
-            android:name="com.jmhy.sdk.activity.ForceActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:screenOrientation="behind"
-            android:launchMode="singleTop"
-            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
+        <activity android:name="com.jmhy.sdk.activity.JmLoginActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@style/jm_Transparent"/>
+        <activity android:name="com.jmhy.sdk.activity.JmAutoLoginActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@style/jm_Transparent"/>
+        <activity android:name="com.jmhy.sdk.activity.JmUserinfoActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@style/jm_Transparent"/>
+        <activity android:name="com.jmhy.sdk.activity.JmRealNameActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@style/jm_Transparent"/>
+        <activity android:name="com.jmhy.sdk.activity.JmpayActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@style/jm_Transparent"/>
+        <activity android:name="com.jmhy.sdk.activity.JmCommunityActivity" android:launchMode="singleTop" android:screenOrientation="portrait"
+                  android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"/>
+        <activity android:name="com.jmhy.sdk.activity.PermissionActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
+        <activity android:name="com.jmhy.sdk.activity.ForceActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
 
 
-        <service android:name="com.jmhy.sdk.push.PushService" />
+        <service android:name="com.jmhy.sdk.push.PushService"/>
+
+        <!-- 协议⻚⾯webview -->
+        <activity android:name="com.mobile.auth.gatewayauth.activity.AuthWebVeiwActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:exported="false" android:launchMode="singleTop" android:screenOrientation="behind"/>
+
+        <!-- 联通电信授权⻚ -->
+        <!-- 使⽤弹 窗模式必须添加theme!!! -->
+        <activity android:name="com.mobile.auth.gatewayauth.LoginAuthActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:exported="false" android:launchMode="singleTop" android:theme="@style/authsdk_activity_dialog"/>
+
+        <!-- 移动授权⻚ -->
+        <activity android:name="com.cmic.sso.sdk.activity.LoginAuthActivity" android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:exported="false" android:launchMode="singleTop"/>
+
+        <activity android:name="com.jmhy.sdk.auth.PrivacyActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+                  android:screenOrientation="behind">
+            <intent-filter>
+                <action android:name="com.jmhy.sdk.privacyweb"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
     </application>
     </application>
 </manifest>
 </manifest>

BIN
sdk/jm/res/drawable-hdpi/jm_auto_logo.png


BIN
sdk/jm/res/drawable-hdpi/jm_float.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_3.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_4.png


+ 0 - 0
sdk/jm/res/drawable-hdpi/jm_float_gift_red.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_move.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_move_3.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_move_new.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_move_red.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_new.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_on.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_on_3.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_on_4.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_on_new.png


BIN
sdk/jm/res/drawable-hdpi/jm_float_on_red.png


+ 0 - 0
sdk/jm/res/drawable-hdpi/jm_float_red.png


+ 0 - 0
sdk/jm/res/drawable-hdpi/jm_float_service_red.png


+ 0 - 0
sdk/jm/res/drawable-hdpi/jm_float_user_red.png


+ 0 - 0
sdk/jm/res/drawable-hdpi/jm_interval_red.png


BIN
sdk/jm/res/drawable-hdpi/jm_logo.png


BIN
sdk/jm/res/drawable-hdpi/jm_logo_3.png


BIN
sdk/jm/res/drawable-hdpi/jm_logo_4.png


BIN
sdk/jm/res/drawable-hdpi/jm_logo_new.png


BIN
sdk/jm/res/drawable-hdpi/jmloading_red.gif


+ 4 - 8
sdk/jm/res/drawable/jm_agree_button_4.xml

@@ -1,9 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>   
-<selector xmlns:android="http://schemas.android.com/apk/res/android">   
-    <item   
-    android:state_checked="false"   
-    android:drawable="@drawable/jm_agree_4" />
-    <item   
-    android:state_checked="true"   
-    android:drawable="@drawable/jm_agree_on_4" />
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_checked="false" android:drawable="@drawable/jm_agree_4"/>
+    <item android:state_checked="true" android:drawable="@drawable/jm_agree_on_4"/>
 </selector> 
 </selector> 

+ 4 - 8
sdk/jm/res/drawable/jm_agree_button_6.xml

@@ -1,9 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>   
-<selector xmlns:android="http://schemas.android.com/apk/res/android">   
-    <item   
-    android:state_checked="false"   
-    android:drawable="@drawable/jm_unckeck6" />
-    <item   
-    android:state_checked="true"   
-    android:drawable="@drawable/jm_check6" />
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_checked="false" android:drawable="@drawable/jm_unckeck6"/>
+    <item android:state_checked="true" android:drawable="@drawable/jm_check6"/>
 </selector> 
 </selector> 

+ 5 - 4
sdk/jm/res/drawable/jm_auto_login_bg_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_auto_login_bg_4"/>
-    <corners android:radius="17dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_auto_login_bg_4"/>
+    <corners android:radius="17dp"/>
 </shape>
 </shape>

+ 27 - 33
sdk/jm/res/drawable/jm_backlogin_btn.xml

@@ -1,33 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-<item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item android:state_focused="true">  <!-- 焦点 -->
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-             <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item > <!-- 无焦点 -->
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-            <gradient android:startColor="#50000000" android:endColor="#50000000" android:angle="270.0" />
-        </shape>
-    </item>
-</selector>
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">  <!-- 焦点 -->
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item> <!-- 无焦点 -->
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#50000000" android:endColor="#50000000" android:angle="270.0"/>
+        </shape>
+    </item>
+</selector>

+ 21 - 21
sdk/jm/res/drawable/jm_blues_codebtn_style.xml

@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
-  <item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
-            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item android:state_focused="true">  <!-- 焦点 -->
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
-             <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item > <!-- 无焦点 -->
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
-            <gradient android:startColor="#2abfff" android:endColor="#2abfff" android:angle="270.0" />
-        </shape>
-    </item>
-</selector>
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">  <!-- 焦点 -->
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item> <!-- 无焦点 -->
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp"/>
+            <gradient android:startColor="#2abfff" android:endColor="#2abfff" android:angle="270.0"/>
+        </shape>
+    </item>
+</selector>

+ 21 - 21
sdk/jm/res/drawable/jm_blues_codebtn_style_new.xml

@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
-  <item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" />
-            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item android:state_focused="true">  <!-- 焦点 -->
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" />
-             <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item > <!-- 无焦点 -->
-        <shape android:shape="rectangle">
-            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" />
-            <gradient android:startColor="#2abfff" android:endColor="#2abfff" android:angle="270.0" />
-        </shape>
-    </item>
-</selector>
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">  <!-- 焦点 -->
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item> <!-- 无焦点 -->
+        <shape android:shape="rectangle">
+            <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp"/>
+            <gradient android:startColor="#2abfff" android:endColor="#2abfff" android:angle="270.0"/>
+        </shape>
+    </item>
+</selector>

+ 5 - 4
sdk/jm/res/drawable/jm_button_cancel_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_dialog_line"/>
-    <corners android:radius="17dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_dialog_line"/>
+    <corners android:radius="17dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_getcode_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmfont_white"/>
-    <corners android:radius="3dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmfont_white"/>
+    <corners android:radius="3dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_getcode_6.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmbtn6_red"/>
-    <corners android:radius="3dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmbtn6_red"/>
+    <corners android:radius="3dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_login_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_orange"/>
-    <corners android:radius="7dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_orange"/>
+    <corners android:radius="7dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_nextstep_6.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmbtn6_red"/>
-    <corners android:radius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmbtn6_red"/>
+    <corners android:radius="5dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_register_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_dialog_line"/>
-    <corners android:radius="7dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_dialog_line"/>
+    <corners android:radius="7dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_button_setpass_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_orange"/>
-    <corners android:radius="17dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_orange"/>
+    <corners android:radius="17dp"/>
 </shape>
 </shape>

+ 27 - 33
sdk/jm/res/drawable/jm_cut_btn.xml

@@ -1,33 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-<item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item android:state_focused="true">  <!-- 焦点 -->
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-             <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0" />
-        </shape>
-    </item>
-    <item > <!-- 无焦点 -->
-        <shape android:shape="rectangle">
-            <stroke
-                android:width="1dp"
-                android:color="#2abfff" />
-            
-            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip" />
-            <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270.0" />
-        </shape>
-    </item>
-</selector>
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">  <!-- 焦点 -->
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#d6d6d6" android:endColor="#d6d6d6" android:angle="270.0"/>
+        </shape>
+    </item>
+    <item> <!-- 无焦点 -->
+        <shape android:shape="rectangle">
+            <stroke android:width="1dp" android:color="#2abfff"/>
+
+            <corners android:topLeftRadius="25.0dip" android:topRightRadius="25.0dip" android:bottomLeftRadius="25.0dip" android:bottomRightRadius="25.0dip"/>
+            <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270.0"/>
+        </shape>
+    </item>
+</selector>

+ 5 - 4
sdk/jm/res/drawable/jm_dialog_ios_bg.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmfont_white"/>
-    <corners android:radius="10dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmfont_white"/>
+    <corners android:radius="10dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_exit_dialog_bg.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_exit_dialog_bg"/>
-    <corners android:radius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_exit_dialog_bg"/>
+    <corners android:radius="5dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_green_codebtn_style.xml

@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_green"/>
-</shape>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_green"/>
+</shape>

+ 5 - 4
sdk/jm/res/drawable/jm_green_light_codebtn_style.xml

@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_green_light"/>
-</shape>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_green_light"/>
+</shape>

+ 7 - 4
sdk/jm/res/drawable/jm_input_bg.xml

@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <stroke android:color="@color/jmfont_blues" android:width="1dp"/>
-    <corners android:radius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <stroke
+            android:color="@color/jmfont_blues"
+            android:width="1dp"/>
+    <corners android:radius="5dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_input_layout_bg_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_input_layout_bg_4"/>
-    <corners android:radius="7dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_input_layout_bg_4"/>
+    <corners android:radius="7dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_login_bg_4.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_login_bg_4"/>
-    <corners android:radius="17dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_login_bg_4"/>
+    <corners android:radius="17dp"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_login_bg_6.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_login_bg_6"/>
-    <corners android:radius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_login_bg_6"/>
+    <corners android:radius="5dp"/>
 </shape>
 </shape>

+ 7 - 4
sdk/jm/res/drawable/jm_message_tip.xml

@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
-    <solid android:color="@color/jmfont_red"/>
-    <size android:width="@dimen/jm_float_tip_size" android:height="@dimen/jm_float_tip_size"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="oval">
+    <solid android:color="@color/jmfont_red"/>
+    <size
+            android:width="@dimen/jm_float_tip_size"
+            android:height="@dimen/jm_float_tip_size"/>
 </shape>
 </shape>

+ 5 - 4
sdk/jm/res/drawable/jm_orange_codebtn_style.xml

@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jm_orange"/>
-</shape>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jm_orange"/>
+</shape>

+ 8 - 5
sdk/jm/res/drawable/jm_phone_input_6.xml

@@ -1,6 +1,9 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmfont_white"/>
-    <stroke android:color="@color/jm_input_bg_6" android:width="1dp"/>
-    <corners android:radius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmfont_white"/>
+    <stroke
+            android:color="@color/jm_input_bg_6"
+            android:width="1dp"/>
+    <corners android:radius="5dp"/>
 </shape>
 </shape>

+ 6 - 5
sdk/jm/res/drawable/jm_red_codebtn_style.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmbtn6_red"/>
-    <corners android:radius="3dp" />
-</shape>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmbtn6_red"/>
+    <corners android:radius="3dp"/>
+</shape>

+ 6 - 5
sdk/jm/res/drawable/jm_red_light_codebtn_style.xml

@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmbtn6_red_light"/>
-    <corners android:radius="3dp" />
-</shape>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmbtn6_red_light"/>
+    <corners android:radius="3dp"/>
+</shape>

+ 7 - 4
sdk/jm/res/drawable/jm_select_left_checked.xml

@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmfont_blues"/>
-    <corners android:topLeftRadius="5dp" android:bottomLeftRadius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmfont_blues"/>
+    <corners
+            android:topLeftRadius="5dp"
+            android:bottomLeftRadius="5dp"/>
 </shape>
 </shape>

+ 9 - 4
sdk/jm/res/drawable/jm_select_left_normal.xml

@@ -1,5 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <stroke android:color="@color/jmfont_blues" android:width="1dp"/>
-    <corners android:bottomLeftRadius="5dp" android:topLeftRadius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <stroke
+            android:color="@color/jmfont_blues"
+            android:width="1dp"/>
+    <corners
+            android:bottomLeftRadius="5dp"
+            android:topLeftRadius="5dp"/>
 </shape>
 </shape>

+ 7 - 4
sdk/jm/res/drawable/jm_select_right_checked.xml

@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/jmfont_blues"/>
-    <corners android:topRightRadius="5dp" android:bottomRightRadius="5dp"/>
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <solid android:color="@color/jmfont_blues"/>
+    <corners
+            android:topRightRadius="5dp"
+            android:bottomRightRadius="5dp"/>
 </shape>
 </shape>

Some files were not shown because too many files changed in this diff