This commit is contained in:
yutou 2021-06-11 09:47:43 +08:00
parent 3430daf931
commit e93b6f1b1e
33 changed files with 780 additions and 452 deletions

View File

@ -41,6 +41,9 @@
]
}
},
"sdkPath":"D:\\AndroidStudio_Data\\ADSDK_v5",
"csjPackageName":"com.iaalz.tzjyg"
"sdkPath":"D:\\Android_src\\kuku-android-sdk",
"csjPackageName":"com.iaalz.tzjyg",
"packageApkTool":"libs/apktool_2.4.1.jar",
"unPackageApkTool":"libs/apktool_2.4.1.jar",
"encryption":true
}

BIN
libs/SparseBitSet-1.2.jar Normal file

Binary file not shown.

BIN
libs/activation-1.1.1.jar Normal file

Binary file not shown.

BIN
libs/commons-codec-1.13.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
libs/dom4j-2.1.3.jar Normal file

Binary file not shown.

BIN
libs/jaxb-api-2.3.1.jar Normal file

Binary file not shown.

BIN
libs/jaxb-core-2.3.0.1.jar Normal file

Binary file not shown.

BIN
libs/jaxb-impl-2.3.2.jar Normal file

Binary file not shown.

BIN
libs/junit-4.12.jar Normal file

Binary file not shown.

BIN
libs/log4j-1.2.17.jar Normal file

Binary file not shown.

BIN
libs/poi-4.1.2.jar Normal file

Binary file not shown.

BIN
libs/poi-excelant-4.1.2.jar Normal file

Binary file not shown.

BIN
libs/poi-ooxml-4.1.2.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
libs/xmlbeans-3.1.0.jar Normal file

Binary file not shown.

View File

@ -46,7 +46,7 @@ public class SDKTools {
tools.classPath.add(new File(dataFolder).getAbsolutePath() + "\\androidv4.jar");
tools.saveJavaPath(sdkDatapath);
tools.javaToClass(sdkDatapath);
System.out.println("清理文件:" + sdkDatapath);
System.out.println("清理文件:" + sdkDatapath);
tools.deleteJava(sdkDatapath);
tools.toJarforJar();
WorldTools.start(packName, GameSDKManageName, sdkfunction);
@ -75,23 +75,23 @@ public class SDKTools {
Tools.deleteFiles(sdkPath.getAbsolutePath());
}
File zipFile = new File(new File(dataFolder).getAbsolutePath() + "/sdk.zip");
System.out.println("解压sdk源码:"+zipFile.getAbsolutePath());
System.out.println("解压sdk源码:"+zipFile.getAbsolutePath());
ZipFile zip = new ZipFile(zipFile);
for (Enumeration<?> entries = zip.entries(); entries.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + "/" + zipEntryName).replace("\\", "/");
// 判断路径是否存在,不存在则创建文件路径
// 判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(outPath).isDirectory()) {
continue;
}
// 输出文件路径信息
// 输出文件路径信息
System.out.println(outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
@ -103,7 +103,7 @@ public class SDKTools {
out.close();
}
zip.close();
System.out.println("******************解压完毕********************");
System.out.println("******************解压完毕********************");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
@ -117,11 +117,11 @@ public class SDKTools {
Tools.deleteFiles(sdkPath.getAbsolutePath());
}
File zipFile = new File(new File(dataFolder).getAbsolutePath() + "/sdk.zip");
System.out.println("解压sdk源码:"+zipFile.getAbsolutePath());
System.out.println("解压sdk源码:"+zipFile.getAbsolutePath());
net.lingala.zip4j.core.ZipFile zip=new net.lingala.zip4j.core.ZipFile(zipFile);
zip.setFileNameCharset("GBK");
zip.extractAll(new File("").getAbsolutePath());
System.out.println("******************解压完毕********************");
System.out.println("******************解压完毕********************");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
@ -131,14 +131,14 @@ public class SDKTools {
public void resdk() {
File sdkPath = new File(new File("").getAbsolutePath() + "/smsdk/");
if (!sdkPath.exists()) {
System.out.println("SDK目录不存在 " + sdkPath.getAbsolutePath());
System.out.println("SDK目录不存在 " + sdkPath.getAbsolutePath());
return;
}
a = Tools.getRandomString(3);
b = Tools.getRandomString(4);
c = Tools.getRandomString(4);
packName = a + "." + b + "." + c;
System.out.println("SDK包名" + packName);
System.out.println("SDK包名" + packName);
rename(sdkPath);
}
@ -211,7 +211,7 @@ public class SDKTools {
private void reGameSDKManage() {
File java = new File(sdkDatapath + "/GameSDKManage.java");
if (!java.exists()) {
System.out.println("GameSDKManage.java不存在");
System.out.println("GameSDKManage.java不存在");
return;
}
GameSDKManageName = Tools.getRandomString(Tools.getRandomInt(4, 8));
@ -290,7 +290,7 @@ public class SDKTools {
File ft = new File(f.getAbsolutePath().replace(".java", ".class"));
if (ft.exists()) {
f.delete();
// System.out.println("删除java"+f.getAbsolutePath()+" "+t);
// System.out.println("删除java"+f.getAbsolutePath()+" "+t);
}
}
}
@ -318,18 +318,18 @@ public class SDKTools {
List<ZipEntry> zips = new ArrayList<>();
Map<String, File> fileNames = new HashMap<>();
if (sdkzip == null)
sdkzip = new File("计费sdk" + version + ".zip");
sdkzip = new File("计费sdk" + version + ".zip");
if (sdkzip.exists())
sdkzip.delete();
ZipOutputStream output = new ZipOutputStream(new FileOutputStream(sdkzip));
output.setLevel(Deflater.DEFLATED);
File sdk = new File("sdk.jar");
File word = new File("文档.txt");
File word = new File("文档.txt");
File rx = new File("data/rx.lt");
File v4 = new File("data/androidv4.jar");
File manifest = new File("data/manifest清单.txt");
File permission = new File("data/权限列表.txt");
File manifest = new File("data/manifest清单.txt");
File permission = new File("data/权限列表.txt");
files.add(sdk);
files.add(word);
@ -359,7 +359,7 @@ public class SDKTools {
output.closeEntry();
output.close();
sdk.delete();
sdk.delete();
word.delete();
} catch (Exception e) {
// TODO: handle exception
@ -396,7 +396,7 @@ public class SDKTools {
private void jar(net.lingala.zip4j.core.ZipFile zipFile, File file,ZipParameters par) throws Exception {
toJar();
for (File f : file.listFiles()) {
System.out.println("压缩文件:"+f.getAbsolutePath());
System.out.println("压缩文件:"+f.getAbsolutePath());
if(f.isDirectory()) {
par.setCompressionMethod(Zip4jConstants.COMP_STORE);
File t=new File(f.getName());

View File

@ -61,89 +61,6 @@ public class AppMain extends JFrame {
// TODO Auto-generated method stub
if (args.length == 0) {
new AppMain();
} else {
String packageName = null;
String version = null;
String apkPath = null;
String csjPath = null;
String model = "csj";
String jarPath = null;
String jarType = null;
String config = null;
int index = -1;
for (String arg : args) {
if (arg.startsWith("-package")) {
packageName = arg.replace("-package=", "");
}
if (arg.startsWith("-version")) {
version = arg.replace("-version=", "");
}
if (arg.startsWith("-apk")) {
apkPath = arg.replace("-apk=", "");
}
if (arg.startsWith("-csj")) {
csjPath = arg.replace("-csj=", "");
}
if (arg.startsWith("-csc")) {
cscPath = arg.replace("-csc=", "");
}
if (arg.startsWith("-model")) {
model = arg.replace("-model=", "");
}
if (arg.startsWith("-jar")) {
jarPath = arg.replace("-jar=", "");
}
if (arg.startsWith("-type")) {
jarType = arg.replace("-type=", "");
}
if (arg.startsWith("-index")) {
index = Integer.parseInt(arg.replace("-index=", "").trim());
}
if (arg.startsWith("-save")) {
savePath = arg.replace("-save=", "");
}
if (arg.startsWith("-config")) {
config = arg.replace("-config=", "");
}
if (arg.trim().equals("-h")) {
outHelp();
return;
}
}
if (model.equals("csj")) {
if (packageName != null && version != null && apkPath != null && csjPath != null) {
new CsjTools(apkPath, csjPath, packageName, version, config, new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
if (cscPath != null) {
File file = new File(path);
file.renameTo(new File(cscPath));
}
}
});
} else {
outHelp();
}
} else if (model.equals("jar")) {
System.out.println(jarPath);
System.out.println(version);
System.out.println(jarType);
System.out.println(index);
System.out.println(savePath);
if (jarPath != null)
new AutoRandomAdSDK(new File(jarPath), version, jarType, index, new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
new File(path).renameTo(new File(savePath));
}
});
} else if (model.equals("sdk")) {
new AutoPackageSDK(path -> new File(path).renameTo(new File(savePath)), version, packageName);
}
}
}
@ -249,8 +166,8 @@ public class AppMain extends JFrame {
return;
}
json.put("switch", configList.getSelectedIndex() + 1 + "");
path = json.getString("out");
name = json.getJSONArray("array").getString(Integer.parseInt(json.getString("switch")) - 1) + ".jar";
path = json.optString("out","");
name = json.getJSONArray("array").getString(Integer.parseInt(json.optString("switch","1")) - 1) + ".jar";
file = new File(path + name);
if (file.exists())
file.delete();
@ -301,11 +218,11 @@ public class AppMain extends JFrame {
@Override
public void smaliPath(String path) {
// TODO Auto-generated method stub
File input = new File(json.getString("out")
+ json.getJSONArray("array").getString(Integer.parseInt(json.getString("switch")) - 1) + ".jar");
Tools.toAJar(json.getString("dx"), input.getAbsolutePath(), input.getAbsolutePath().replace(input.getName(), "dexTmp.jar"));
File outFile = new EncryptJar().encrypt(new File(input.getAbsolutePath().replace(input.getName(), "dexTmp.jar")), json.getString("out")
+ json.getJSONArray("array").getString(Integer.parseInt(json.getString("switch")) - 1) + "_encrypt.jar", Integer.parseInt(path)
File input = new File(json.optString("out","")
+ json.getJSONArray("array").getString(Integer.parseInt(json.optString("switch","1")) - 1) + ".jar");
Tools.toAJar(json.optString("dx","dx.jar"), input.getAbsolutePath(), input.getAbsolutePath().replace(input.getName(), "dexTmp.jar"));
File outFile = new EncryptJar().encrypt(new File(input.getAbsolutePath().replace(input.getName(), "dexTmp.jar")), json.optString("out","")
+ json.getJSONArray("array").getString(Integer.parseInt(json.optString("switch","1")) - 1) + "_encrypt.jar", Integer.parseInt(path)
, Integer.parseInt(version));
log.setText("data路径为:" + outFile.getAbsolutePath());
}
@ -403,8 +320,8 @@ public class AppMain extends JFrame {
@Override
public void smaliPath(String path) {
// TODO Auto-generated method stub
Tools.toAJar(json.getString("dx"), file.getAbsolutePath(), file.getAbsolutePath().replace(file.getName(), "dexTmp.jar"));
File fileOut = new EncryptJar().encrypt(new File(file.getAbsolutePath().replace(file.getName(), "dexTmp.jar")), file.getAbsolutePath() + "_encrypt.jar", Integer.valueOf(path)
Tools.toAJar(json.optString("dx","dx.jar"), file.getAbsolutePath(), file.getAbsolutePath().replace(file.getName(), "dexTmp.jar"));
File fileOut = new EncryptJar().encrypt(new File(file.getAbsolutePath().replace(file.getName(), "dexTmp.jar")), file.getAbsolutePath() + "_encrypt.jar", Integer.parseInt(path)
, Integer.parseInt(version));
System.out.println("data路径为:" + fileOut.getAbsolutePath());
if (log != null)
@ -497,7 +414,7 @@ public class AppMain extends JFrame {
JFileChooser chooser = new JFileChooser(new File(new File("").getAbsolutePath()));
chooser.showOpenDialog(null);
File java = chooser.getSelectedFile();
Tools.toAJar(json.getString("dx"), java.getAbsolutePath(),
Tools.toAJar(json.optString("dx","dx.jar"), java.getAbsolutePath(),
new File("").getAbsolutePath() + File.separator + java.getName() + "_jar.jar");
if (AppMain.isOpenWindows) {
try {
@ -649,7 +566,7 @@ public class AppMain extends JFrame {
}
public void autoPackageSdk() {
new AutoPackageSDK(path -> new TextToDialog("提示", String.format("打包完成%s", path)), version, packageName);
}
});
menu.add(autoSDK);
@ -690,6 +607,17 @@ public class AppMain extends JFrame {
});
mnBasetools.add(mntmBase);
/*JMenu config=new JMenu("设置");
JMenuItem systemConfig=new JMenuItem("主设置");
systemConfig.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
config.add(systemConfig);
menuBar.add(config);
*/
setVisible(true);
}
}

View File

@ -9,6 +9,8 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.*;
import java.util.List;
@ -80,6 +82,25 @@ public class AutoOutAPKAddChannelUi {
textField.setText(data);
textField.setToolTipText(data);
textField.setSize(100,20);
textField.addKeyListener(new KeyListener() {
int oldKey=0;
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
if(oldKey==17&&e.getKeyCode()==86){
textField.setText(textField.getText().replace("=","{=}"));
}else{
oldKey=e.getKeyCode();
}
}
});
list.add(textField);
inputPanel.add(textField);
}

View File

@ -7,7 +7,7 @@
<properties/>
<border type="none"/>
<children>
<grid id="81cbe" layout-manager="GridLayoutManager" row-count="6" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="81cbe" layout-manager="GridLayoutManager" row-count="7" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints border-constraint="Center"/>
<properties/>
@ -63,7 +63,7 @@
</component>
<component id="bcc75" class="javax.swing.JLabel">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="渠道参数"/>
@ -72,7 +72,7 @@
<grid id="21c9" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="3" column="1" row-span="1" col-span="2" vsize-policy="3" hsize-policy="0" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<grid row="4" column="1" row-span="1" col-span="2" vsize-policy="3" hsize-policy="0" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@ -105,7 +105,7 @@
</grid>
<component id="8617" class="javax.swing.JButton" binding="start">
<constraints>
<grid row="5" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="6" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="提交"/>
@ -113,17 +113,18 @@
</component>
<component id="77e44" class="javax.swing.JLabel" binding="appPath">
<constraints>
<grid row="4" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<grid row="5" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
<minimum-size width="200" height="-1"/>
</grid>
</constraints>
<properties>
<autoscrolls value="true"/>
<text value="选择游戏母包"/>
</properties>
</component>
<component id="4b896" class="javax.swing.JButton" binding="selectAppPath" default-binding="true">
<constraints>
<grid row="4" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="5" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<maximum-size width="100" height="-1"/>
</grid>
</constraints>
@ -131,6 +132,20 @@
<text value="选择"/>
</properties>
</component>
<component id="310fd" class="javax.swing.JLabel">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="快速选择"/>
</properties>
</component>
<component id="b5535" class="javax.swing.JComboBox" binding="selectAppid">
<constraints>
<grid row="3" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
</children>
</grid>
</children>

View File

@ -2,16 +2,16 @@ package com.qy.ui;
import com.qy.Interfaces.DialogInterface;
import com.qy.Interfaces.SmaliApkToolsPath;
import com.qy.utils.ApkSignTools;
import com.qy.utils.AutoOutAPKTools;
import com.qy.utils.StringUtils;
import com.qy.utils.Tools;
import com.qy.utils.*;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
@ -30,10 +30,12 @@ public class AutoOutAPKUi {
private JButton start;
private JButton selectAppPath;
private JLabel appPath;
private JComboBox<Object> selectAppid;
private LinkedHashMap<String, String> map = new LinkedHashMap<>();
private LinkedHashMap<String, Object> channel = new LinkedHashMap<>();
private Vector<String> vector = new Vector<String>();
private JSONObject changeImage=null;
public AutoOutAPKUi() {
@ -43,7 +45,7 @@ public class AutoOutAPKUi {
// TODO: handle exception
e.printStackTrace();
}
JFrame frame = new JFrame("马甲包出包工具1.0");
JFrame frame = new JFrame("马甲包出包工具2.0");
frame.setContentPane(panel1);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
@ -102,49 +104,52 @@ public class AutoOutAPKUi {
}
}
AutoOutAPKTools tools = new AutoOutAPKTools(gid, cmap);
JSONObject json=new JSONObject();
JSONObject pa=new JSONObject();
JSONObject ji=new JSONObject();
pa.put("key","${packagename}");
pa.put("value",pid);
ji.put("key","${JPUSH_KEY}");
ji.put("value",jid);
json.put("${packagename}",pa);
json.put("JPUSH_APPKEY",ji);
JSONObject json = new JSONObject();
JSONObject pa = new JSONObject();
JSONObject ji = new JSONObject();
pa.put("key", "${packagename}");
pa.put("value", pid);
ji.put("key", "${JPUSH_KEY}");
ji.put("value", jid);
json.put("${packagename}", pa);
json.put("JPUSH_APPKEY", ji);
tools.setAppPath(path);
tools.setManifestMap(json);
if(changeImage!=null){
tools.setChangeFile(changeImage);
}
tools.start(new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
LinkedHashMap<String,String> keyMap=ApkSignUi.loadKeys();
LinkedHashMap<String, String> keyMap = ApkSignUi.loadKeys();
Vector<String> adbList = new Vector<String>(keyMap.keySet());
JComboBox<String> keysList=new JComboBox<String>(adbList);
JComboBox<String> keysList = new JComboBox<String>(adbList);
keysList.setBounds(157, 50, 200, 27);
new TextToDialog("选择签名", keysList, new DialogInterface() {
@Override
public void onSuccess() {
String key=adbList.get(keysList.getSelectedIndex());
String tmp=keyMap.get(key);
if(!StringUtils.isEmpty(tmp)){
JSONObject json=new JSONObject(tmp);
ApkSignTools signTools=new ApkSignTools();
String key = adbList.get(keysList.getSelectedIndex());
String tmp = keyMap.get(key);
if (!StringUtils.isEmpty(tmp)) {
JSONObject json = new JSONObject(tmp);
ApkSignTools signTools = new ApkSignTools();
signTools.setSignFile(new File(json.getString("file")));
signTools.setApkFile(new File(path));
signTools.setKeyStorePassword(json.getString("alias_password"));
signTools.setName(json.getString("alias"));
signTools.setSignKey(json.getString("password"));
if(signTools.sign()){
if (signTools.sign()) {
try {
String apkName="./apk_out/game_"+System.currentTimeMillis()+".apk";
Tools.copyFile(signTools.getApkFile().getAbsolutePath()+"_sign.apk",apkName,true);
String apkName = "./apk_out/game_" + System.currentTimeMillis() + ".apk";
Tools.copyFile(signTools.getApkFile().getAbsolutePath() + "_sign.apk", apkName, true);
Desktop.getDesktop().open(new File(apkName).getParentFile());
System.out.println("签名完成");
} catch (IOException ioException) {
ioException.printStackTrace();
}
tools.clear();
}else {
new TextToDialog("警告","签名失败");
//tools.clear();
} else {
new TextToDialog("警告", "签名失败");
}
}
}
@ -164,6 +169,75 @@ public class AutoOutAPKUi {
appPath.setText(path.getAbsolutePath());
}
});
selectAppid.addItem("");
for (String appid : ExcelTools.getAllAppId()) {
selectAppid.addItem(appid);
}
selectAppid.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (e.getItem().toString().equals("")) {
return;
}
JSONObject json = ExcelTools.queryParamByAppId(Integer.parseInt(e.getItem().toString()));
if (json != null) {
channel.clear();
vector.clear();
list1.updateUI();
setData(json);
}
}
}
});
}
private void addChannel(JSONObject json) {
JSONObject config = Tools.loadConfig(new File("gameConfig.json"));
for (String key : config.keySet()) {
JSONArray array = config.getJSONArray(key);
Map<String, String> map = null;
for (Object o : array) {
if (!json.isNull(o.toString())) {
if (map == null)
map = new HashMap<>();
map.put(o.toString(), json.getString((o.toString())));
}
}
if (map != null) {
channel.put(key,map);
vector.add(key);
list1.setListData(vector);
list1.updateUI();
}
}
}
private void setData(JSONObject json) {
System.out.println(json);
gameId.setText(json.getInt("appId") + "");
packageName.setText(json.getString("packageName"));
jiguang.setText(json.getString("jiguang"));
addChannel(json);
if(json.optString("isChageImage","").equals("")){
changeImage=new JSONObject();
changeImage.put("srcPath",json.getString("srcimagePath"));
changeImage.put("oldPath",json.getString("oldImagePath"));
changeImage.put("filePath",json.getString("filePath"));
}else{
changeImage=null;
}
/* AutoOutAPKAddChannelUi.newInstance(new DialogInterface() {
@Override
public void onOut(Object data) {
super.onOut(data);
Map<?, ?> map = (Map<?, ?>) data;
for (Object o : map.keySet()) {
System.out.println(o.toString() + " > " + map.get(o));
}
}
});*/
}
private void createUIComponents() {

View File

@ -1,14 +1,13 @@
package com.qy.utils;
import org.apache.commons.codec.binary.Base64;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

View File

@ -18,6 +18,7 @@ public class AutoOutAPKTools {
private JSONObject manifestMap;
private String appPath;
private SmaliApkToolsPath inter;
private JSONObject copyJson;
public AutoOutAPKTools(String gameId, Map<String, String> channel) {
this.gameId = gameId;
@ -49,10 +50,20 @@ public class AutoOutAPKTools {
@Override
public void smaliPath(String path) {
inter.smaliPath(appPath + File.separator + new File(oldPath).getName() + gameId);
if (copyJson != null) {
File copyPath = new File(copyJson.getString("oldPath"));
for (File file : Objects.requireNonNull(copyPath.listFiles())) {
Tools.copyFile(file.getAbsolutePath(), appPath + File.separator + copyJson.getString("filePath"), true);
}
}
}
});
}
public void setChangeFile(JSONObject json) {
copyJson = json;
}
public void clear() {
Tools.deleteFiles(appPath);
}
@ -63,7 +74,7 @@ public class AutoOutAPKTools {
try {
List<String> keys = new ArrayList<>(manifestMap.keySet());
BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(manifest), StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new FileReader(manifest));
while ((tmp = reader.readLine()) != null) {
for (String key : keys) {
if (tmp.contains(key)) {
@ -91,6 +102,12 @@ public class AutoOutAPKTools {
}
Tools.saveConfig(new File(appPath + File.separator + "assets" + File.separator + "kusdkconf.ini"),
builder.toString());
if (copyJson != null) {
File path = new File(copyJson.getString("srcPath"));
for (File file : Objects.requireNonNull(path.listFiles())) {
Tools.copyFile(file.getAbsolutePath(), appPath + File.separator + copyJson.getString("filePath"), true);
}
}
}
private void outLog(String log) {

View File

@ -1,311 +1,66 @@
package com.qy.utils;
import com.qy.Interfaces.SmaliApkToolsPath;
import org.json.JSONArray;
import org.json.JSONObject;
import sun.applet.Main;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;
public class AutoPackageSDK {
private AutoRandomAdSDK randomAdSDK;
private String version;
private String packageName;
private SmaliApkToolsPath inter;
File gdtsdk, uniplaysdk, qysdk,baiduSdk;
private AutoPackageSDK() {
/*
1在SDK目录调用.\gradlew assembleKusdk 生成SDK
2在EmptyDemo项目同步gradle
3生成Demo.apk
public void init() {
}
private void encryptSDK() {
AutoPackageSDKMust.start(Tools.getRandomString(16), new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
if (path != null) {
Tools.copyFile(path, new File("input" + File.separator + "qySDK").getAbsolutePath(), true);
}
init();
}
});
4复制apk到临时目录并反编译
5复制反编译目录到sdk目录 到这一步已经完成SDK的处理
生成母包的方案
1反编译CP包
2拷贝sdk目录的assetssmali到CP包
3根据CP包已有的lib库拷贝对应的sdk lib
4合并sdk和cp的res输出到cp目录
5重新打包cp包
*/
public AutoPackageSDK() {
}
private void init() {
System.out.println("准备打包");
File gdtPath = new File("input" + File.separator + "gdtSDK" + File.separator);
File unplayPath = new File("input" + File.separator + "uniplaySDK" + File.separator);
File qysdkPath = new File("input" + File.separator + "qySDK" + File.separator);
File baiduPath = new File("input" + File.separator + "baiduSDK" + File.separator);
if (!gdtPath.exists() || Objects.requireNonNull(gdtPath.listFiles()).length == 0) {
inter.smaliPath("广点通SDK不存在请放置到input" + File.separator + "gdtSDK文件夹中");
return;
}
gdtsdk = Objects.requireNonNull(gdtPath.listFiles())[0];
if (!unplayPath.exists() || Objects.requireNonNull(unplayPath.listFiles()).length == 0) {
inter.smaliPath("聚量SDK不存在请放置到input" + File.separator + "gdtSDK文件夹中");
return;
}
uniplaysdk = Objects.requireNonNull(unplayPath.listFiles())[0];
if (!qysdkPath.exists() || Objects.requireNonNull(qysdkPath.listFiles()).length == 0) {
inter.smaliPath("趣赢SDK不存在请放置到input" + File.separator + "gdtSDK文件夹中");
return;
}
qysdk = Objects.requireNonNull(qysdkPath.listFiles())[0];
if (!baiduPath.exists() || Objects.requireNonNull(baiduPath.listFiles()).length == 0) {
inter.smaliPath("百青藤SDK不存在请放置到input" + File.separator + "baiduSDK文件夹中");
return;
}
baiduSdk= Objects.requireNonNull(baiduPath.listFiles())[0];
JSONArray array = new JSONArray();
JSONObject gdt = new JSONObject();
gdt.put("file", gdtsdk.getAbsolutePath());
gdt.put("version", version);
gdt.put("type", "1");
gdt.put("index", 0);
gdt.put("packageName", packageName + ".tgd");
array.put(gdt);
JSONObject unplay = new JSONObject();
unplay.put("file", uniplaysdk.getAbsolutePath());
unplay.put("version", version);
unplay.put("type", "5");
unplay.put("index", 1);
unplay.put("packageName", packageName + ".up");
array.put(unplay);
JSONObject baidu = new JSONObject();
baidu.put("file", baiduSdk.getAbsolutePath());
baidu.put("version", version);
baidu.put("type", "2");
baidu.put("packageName", packageName + ".bsb");
baidu.put("index", 5);
array.put(baidu);
JSONObject qy = new JSONObject();
qy.put("file", qysdk.getAbsolutePath());
qy.put("version", version);
qy.put("type", "0");
qy.put("packageName", packageName + ".ww");
qy.put("index", 3);
array.put(qy);
File sdk = new File("packageSDK");
Tools.deleteFiles(sdk.getAbsolutePath());
if (!sdk.exists()) {
sdk.mkdirs();
}
System.out.println("复制资源文件");
outAssetsQY(0, "0");
outAssetsQY(1, "4");
outRes();
System.out.println("开始打包");
new AutoRandomAdSDK(array, new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
System.out.println("打包完成:" + path);
delete(gdtPath, gdtsdk);
delete(unplayPath, uniplaysdk);
delete(qysdkPath, qysdk);
outAssetsADS(path);
copy();
File sdk = zip();
System.out.println("制作SDK完成:");
inter.smaliPath(sdk == null ? "sdk打包失败" : sdk.getAbsolutePath());
}
private void delete(File path, File sdk) {
for (File file : path.listFiles()) {
if (!file.getName().equals(sdk.getName())) {
file.delete();
}
}
}
});
}
public AutoPackageSDK(SmaliApkToolsPath inter, String version, String packageName) {
this.version = version;
this.packageName = packageName;
this.inter=inter;
encryptSDK();
}
private void outAssetsQY(int index, String type) {
JSONObject json = Tools.loadConfig(new File("config.cfg"));
json.put("switch", index + 1 + "");
String path = json.getString("out");
String name = json.getJSONArray("array").getString(Integer.parseInt(json.getString("switch")) - 1) + ".jar";
File file = new File(path + name);
if (file.exists())
file.delete();
JarToAJar.start(json);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
if (file.exists()) {
File input = new File(json.getString("out")
+ json.getJSONArray("array").getString(index) + ".jar");
Tools.toAJar(json.getString("dx"), input.getAbsolutePath(), input.getAbsolutePath().replace(input.getName(), "dexTmp.jar"));
File outFile = new EncryptJar().encrypt(new File(input.getAbsolutePath().replace(input.getName(), "dexTmp.jar")), json.getString("out")
+ json.getJSONArray("array").getString(index), Integer.parseInt(type)
, Integer.parseInt(version));
System.out.println(outFile.getAbsolutePath());
File assets = new File("packageSDK" + File.separator + "assets");
Tools.copyFile(outFile.getAbsolutePath(), assets.getAbsolutePath(), true);
outFile.delete();
input.delete();
timer.cancel();
}
}
}, 0, 100);
}
private void outAssetsADS(String path) {
JSONArray array = new JSONArray(path);
File assets = new File("packageSDK" + File.separator + "assets");
File libs = new File("packageSDK" + File.separator);
assets.mkdirs();
libs.mkdirs();
for (int i = 0; i < array.length(); i++) {
JSONObject item = array.getJSONObject(i);
System.out.println(">>" + item.toString());
if (item.getString("type").equals("0")) {
Tools.copyFileToName(item.getString("path"), libs.getAbsolutePath(), "classes.jar", true);
} else {
Tools.copyFile(item.getString("path"), assets.getAbsolutePath(), true);
}
File file = new File(item.getString("path"));
file.delete();
}
}
private void outRes() {
//new File("packageSDK" + File.separator + "jni").mkdirs();
File xmlFolder = new File("packageSDK" + File.separator + "res" + File.separator + "xml");
xmlFolder.mkdirs();
File manifest = new File("packageSDK" + File.separator + "AndroidManifest.xml");
File srcManifest = new File("input" + File.separator + "Documents" + File.separator + "AndroidManifest.xml");
Tools.copyFile("input" + File.separator + "Documents" + File.separator + "file_paths_5.xml",
xmlFolder.getAbsolutePath(), true);
Tools.copyFile("input" + File.separator + "Documents" + File.separator + "network_security_config.xml",
xmlFolder.getAbsolutePath(), true);
public void packageSdk() {
String sdkPath = Tools.loadConfig(new File("config.cfg")).getString("sdkPath");
try {
BufferedReader reader = new BufferedReader(new FileReader(srcManifest));
String tmp;
StringBuilder str = new StringBuilder();
while ((tmp = reader.readLine()) != null) {
str.append(tmp.replace("{packagename}", packageName)).append("\n");
}
reader.close();
byte[] uft8bom = {(byte) 0xef, (byte) 0xbb, (byte) 0xbf};
OutputStream os = new FileOutputStream(manifest);
OutputStreamWriter outputStream = new OutputStreamWriter(os, StandardCharsets.UTF_8);
outputStream.write(new String(str.toString().getBytes(), StandardCharsets.UTF_8));
Process process = Runtime.getRuntime().exec(new String[]{"cmd"});
OutputStream outputStream = process.getOutputStream();
outputStream.write(("cd '" + sdkPath + "'").getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.write(("gradlew assembleKusdk").getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private File zip(File file) throws Exception {
String cd = "cd " + new File("packageSDK").getAbsolutePath();
File sdk = new File("packageSDK" + File.separator + "sdk.aar");
File files = new File("packageSDK");
String aapt = new File("aapt.exe").exists() ? new File("aapt.exe").getAbsolutePath() : "aapt";
for (File listFile : file.listFiles()) {
if (listFile.isDirectory()) {
zip(listFile);
} else if (!listFile.getName().equals("sdk.aar")) {
String path = listFile.getAbsolutePath().replace(files.getAbsolutePath(), "");
String exec = aapt + " r " + sdk.getAbsolutePath() + " " + path.substring(1) + "\n";
Runtime.getRuntime().exec("cmd /c " + cd + " && " + exec);
Thread.sleep(100);
exec = aapt + " a " + sdk.getAbsolutePath() + " " + path.substring(1) + "\n";
Runtime.getRuntime().exec("cmd /c " + cd + " && " + exec);
Thread.sleep(100);
}
}
return sdk;
}
private File zip() {
File sdk = null;
try {
Tools.copyFile(new File("input" + File.separator + "Documents" + File.separator + "sdk.aar").getAbsolutePath(),
new File("packageSDK").getAbsolutePath(), true);
String cd = "cd " + new File("packageSDK").getAbsolutePath() + "\n\r";
Process process = Runtime.getRuntime().exec(new String[]{"cmd"});
OutputStream stream = process.getOutputStream();
stream.write(cd.getBytes());
stream.flush();
stream.close();
process.destroy();
sdk = zip(new File("packageSDK"));
File copy = new File("packageSDK" + File.separator + "copy");
if (copy.exists()) {
zip(copy);
}
stream.close();
process.destroy();
} catch (Exception e) {
e.printStackTrace();
}
return sdk;
}
private void copy() {
try {
File copyPath = new File("input" + File.separator + "Documents" + File.separator + "copy");
if (copyPath.exists()) {
Tools.copyFile(copyPath.getAbsolutePath(), new File("packageSDK").getAbsolutePath(), true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void printOut(InputStream inputStream) {
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String str = "", tmp;
while ((tmp = reader.readLine()) != null) {
str += tmp;
System.out.println(tmp);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) {
int[] nums = new int[]{-1, -1, -1, 1, -1, -1};
for (int j = 1; j < nums.length; j++) {
int index = j;
int tmp = 0;
int tmp2 = 0;
for (int i = 0; i < index; i++) {
tmp += nums[i];
}
for (int i = index + 1; i < nums.length; i++) {
tmp2 += nums[i];
}
System.out.println(tmp);
System.out.println(tmp2);
if (tmp == tmp2) {
System.out.println("return:" + index);
return;
}
}
System.out.println("return:" + -1);
new AutoPackageSDK().packageSdk();
}
}

View File

@ -0,0 +1,96 @@
package com.qy.utils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ExcelTools {
private ExcelTools() {
}
private static Workbook getWorkbook(){
try {
return new XSSFWorkbook(new File("产品参数.xlsx"));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static void close(Workbook workbook){
try {
workbook.close();
} catch (Exception ignored) {
}
}
public static JSONObject queryParamByAppId(int appId) {
Workbook workbook=getWorkbook();
if (workbook == null) {
return null;
}
JSONObject json = new JSONObject();
Sheet sheet = workbook.getSheetAt(0);
Row param = null;
for (Row row : sheet) {
if (row.getCell(0).getCellType() == CellType.NUMERIC && row.getCell(0).getNumericCellValue() == appId) {
param = row;
break;
}
}
if (param == null) {
close(workbook);
return null;
}
json.put("appId", param.getCell(0).getNumericCellValue());
json.put("packageName", param.getCell(1).getStringCellValue());
json.put("jiguang", param.getCell(2).getStringCellValue());
json.put("TOUTIAO_APP_ID", getValue(param.getCell(3)));
for (Cell cell : sheet.getRow(0)) {
String title = getValue(cell);
if (!StringUtils.isEmpty(title) && title.contains("|")) {
String value = getValue(param.getCell(cell.getColumnIndex()));
if (value != null)
json.put(title.split("\\|")[1],value);
}
}
close(workbook);
return json;
}
public static List<String> getAllAppId(){
List<String> list=new ArrayList<>();
Workbook workbook=getWorkbook();
if (workbook == null) {
return list;
}
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
Cell cell=row.getCell(0);
String value=getValue(cell);
if(value!=null&&!value.equals("appid")){
list.add(value);
}
}
close(workbook);
return list;
}
private static String getValue(Cell cell) {
switch (cell.getCellType()) {
case NUMERIC:
return ((int) cell.getNumericCellValue()) + "";
case STRING:
return cell.getStringCellValue();
default:
return null;
}
}
public static void main(String[] args) {
}
}

View File

@ -0,0 +1,182 @@
package com.qy.utils;
import com.qy.Interfaces.SmaliApkToolsPath;
import com.qy.ui.ApkSignUi;
import org.json.JSONObject;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Vector;
public class HeiHeiTools {
private File apk;
private File pluginPath;
public HeiHeiTools() {
}
public void setSdkPlugin(File pluginPath) {
this.pluginPath = pluginPath;
}
public void setApk(File apk) {
this.apk = apk;
}
public void start() {
SmaliUtils utils = new SmaliUtils();
utils.unPack(apk.getAbsolutePath(), new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
copyLibs(new File(path));
}
});
}
private SmaliApkToolsPath packaInter;
private void copyLibs(File smaliPath) {
if (!new File(pluginPath.getAbsolutePath() + File.separator + "libs").exists()) {
copyAssets(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "assets"));
}
unpackLibs(new File(pluginPath.getAbsolutePath() + File.separator + "libs"), new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
File libs = new File(path);
for (File file : libs.listFiles()) {
if (file.isDirectory() && !"original".equals(file.getName())&& !"unknown".equals(file.getName())) {
Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "smali");
}
if(file.isDirectory()&& "assets".equals(file.getName())){
Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "assets");
}
}
packaInter = new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
XMLTools.mergeManifestXML(new File(smaliPath.getAbsolutePath() + File.separator + "AndroidManifest.xml"),
new File(pluginPath.getAbsolutePath() + File.separator + "AndroidManifest.xml"),
new File(smaliPath.getAbsolutePath() + File.separator + "AndroidManifest.xml"));
SmaliUtils utils = new SmaliUtils();
utils.bale(smaliPath.getAbsolutePath(), smaliPath.getAbsolutePath()+File.separator+"game.apk", new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
LinkedHashMap<String,String> keyMap= ApkSignUi.loadKeys();
Vector<String> adbList = new Vector<String>(keyMap.keySet());
String key=adbList.get(1);
String tmp=keyMap.get(key);
System.out.println("选择签名:"+key);
JSONObject json=new JSONObject(tmp);
ApkSignTools tools=new ApkSignTools();
tools.setSignFile(new File(json.getString("file")));
tools.setApkFile(new File(path));
tools.setKeyStorePassword(json.getString("alias_password"));
tools.setName(json.getString("alias"));
tools.setSignKey(json.getString("password"));
System.out.println("开始签名");
tools.sign();
System.out.println("打包完成:" + path);
}
});
}
};
copyAssets(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "assets"));
}
});
}
private void copyAssets(File smaliPath, File assets) {
Tools.copy_dir(assets.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "assets");
copyJniLibs(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "JniLibs"));
}
private void copyJniLibs(File smaliPath, File jniLibs) {
File libs = new File(smaliPath.getAbsolutePath() + File.separator + "lib");
if(libs.exists()) {
for (File file : libs.listFiles()) {
Tools.copy_dir(jniLibs.getAbsolutePath() + File.separator + file.getName(), file.getAbsolutePath());
}
}
copyRes(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "res"));
}
private void copyRes(File smaliPath, File res) {
Tools.copy_dir(res.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "res");
copyCode(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "code"));
}
private void copyCode(File smaliPath, File code) {
File sboran = null;
for (File file : smaliPath.listFiles()) {
if (file.getName().startsWith("smali")) {
if (new File(file.getAbsolutePath() + File.separator
+ "com" + File.separator
+ "sboran" + File.separator
+ "game" + File.separator
+ "sdk").exists()) {
sboran = new File(file.getAbsolutePath() + File.separator
+ "com" + File.separator
+ "sboran" + File.separator
+ "game" + File.separator
+ "sdk");
break;
}
}
}
if (sboran != null) {
Tools.copyFile(code.listFiles()[0].getAbsolutePath() + File.separator + "SboRanApplication.smali"
, sboran.getAbsolutePath(), true);
Tools.copy_dir(code.getAbsolutePath(), sboran.getAbsolutePath() + File.separator + "platform");
Tools.deleteFile(sboran.getAbsolutePath() + File.separator + "platform" + File.separator + code.listFiles()[0].getName() + File.separator + "SboRanApplication.smali");
}
packaInter.smaliPath("ok");
}
private static void unpackLibs(File libs, SmaliApkToolsPath smaliApkToolsPath) {
String dx = Tools.loadConfig(new File("config.cfg")).getString("dx");
if (new File("tmp" + File.separator + "dex").exists()) {
Tools.deleteFiles(new File("tmp" + File.separator + "dex").getAbsolutePath());
}
if (new File("tmp" + File.separator + "dx_smali").exists()) {
Tools.deleteFiles(new File("tmp" + File.separator + "dx_smali").getAbsolutePath());
}
new File("tmp" + File.separator + "dxs").mkdirs();
System.out.println(libs.getAbsolutePath());
for (File file : libs.listFiles()) {
Tools.toAJar(dx, file.getAbsolutePath(), "tmp" + File.separator + "dxs" + File.separator + file.getName());
}
libs = new File("tmp" + File.separator + "dxs");
unpackLibsDx(libs.listFiles(), 0);
smaliApkToolsPath.smaliPath(new File("tmp" + File.separator + "dx_smali").getAbsolutePath());
}
public static void unpackLibsDx(File[] files, int index) {
if (index < files.length) {
new SmaliUtils().unPack(files[index].getAbsolutePath(), new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
Tools.copy_dir(path, "tmp" + File.separator + "dx_smali");
unpackLibsDx(files, index + 1);
}
});
}
}
public static void main(String[] args) {
/* HeiHeiTools tools = new HeiHeiTools();
tools.setApk(new File("D:\\ieda\\android_sdk_tools\\天命传说嘿嘿游戏专服_嘿嘿游戏_8.1.4_202106070951.apk"));
tools.setSdkPlugin(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\zssdk"));
tools.start();*/
unpackLibs(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\69you\\libs"), new SmaliApkToolsPath() {
@Override
public void smaliPath(String path) {
System.out.println("over = "+path);
}
});
}
}

View File

@ -3,7 +3,6 @@ package com.qy.utils;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.ByteBuffer;
import java.security.Permission;
import java.util.ArrayList;
import java.util.HashMap;
@ -14,7 +13,7 @@ import java.util.Set;
import com.qy.Interfaces.SmaliApkToolsPath;
import com.qy.ui.TextToDialog;
import com.sun.javaws.exceptions.ExitException;
import org.json.JSONObject;
public class SmaliUtils {
//private String str = "";
@ -23,8 +22,8 @@ public class SmaliUtils {
// private String mainPath = "D:\\反编译\\APK\\rx.jar.out\\smali";
private Map<String, String> clazzList;
private List<File> files = new ArrayList<>();
private static ClassLoader apktool_234;
private static ClassLoader apktool_241;
private ClassLoader package_apktool;
private ClassLoader un_apktool;
public static void main(String[] args) {
@ -34,11 +33,21 @@ public class SmaliUtils {
public SmaliUtils() {
clazzList = new HashMap<>();
try {
if(apktool_234==null){
apktool_234=new URLClassLoader(new URL[]{new URL("file:libs/apktool_2.3.4.jar")});
JSONObject json =Tools.loadConfig(new File("config.cfg"));
if(package_apktool ==null){
String path="libs/apktool_2.4.1.jar";
if(json!=null){
path=json.optString("packageApkTool","libs/apktool_2.4.1.jar");
}
System.out.println(path);
package_apktool =new URLClassLoader(new URL[]{new URL("file:"+path)});
}
if(apktool_241==null){
apktool_241=new URLClassLoader(new URL[]{new URL("file:libs/apktool_2.4.1.jar")});
if(un_apktool ==null){
String path="libs/apktool_2.4.1.jar";
if(json!=null){
path=json.optString("unPackageApkTool","libs/apktool_2.4.1.jar");
}
un_apktool =new URLClassLoader(new URL[]{new URL("file:"+path)});
}
}catch (Exception e){
e.printStackTrace();
@ -222,6 +231,10 @@ public class SmaliUtils {
Tools.deleteFiles(path.getAbsolutePath());
}
String[] args = new String[]{"d", "-f", jarPath};
JSONObject json=Tools.loadConfig(new File("config.cfg"));
if(json!=null){
isEncryption=json.optBoolean("encryption",false);
}
if (isEncryption) {
args = new String[]{"d", "-f", jarPath, "--only-main-classes"};
}
@ -231,7 +244,7 @@ public class SmaliUtils {
}
System.out.println("\n");
//Main.main(args);
apktool_241.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args});
un_apktool.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args});
File jarFile = new File(jarPath);
String name;
if (jarFile.getName().contains(".jar")) {
@ -260,7 +273,7 @@ public class SmaliUtils {
public void bale(String smaliPath, String path, SmaliApkToolsPath inter) {
String[] args = new String[]{"-r","b", "-f", smaliPath, "-o", path};
for (String string : args) {
System.out.print(string + " ");
System.err.print(string + " ");
}
try {
run = true;
@ -291,7 +304,7 @@ public class SmaliUtils {
System.setSecurityManager(new NoExitSecurityManager());
//Main.main(args);
apktool_241.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args});
package_apktool.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args});
if (inter != null) {
inter.smaliPath(path);
}

View File

@ -128,7 +128,11 @@ public class Tools {
}
public static void copy_dir(String src,String desc){
try {
//System.out.println("拷贝文件:"+src+" -> "+desc);
File dirSrc=new File(src);
if(!dirSrc.exists()){
return;
}
for (File file : dirSrc.listFiles()) {
if(file.isDirectory()){
new File(desc+File.separator+file.getName()).mkdirs();
@ -413,4 +417,9 @@ public class Tools {
}
System.out.println("[域名]" + url + " = [body]" + body.toString() + " -> [接收] " + str);
}
public static void deleteFile(String s) {
System.out.println("删除文件:"+s);
new File(s).delete();
}
}

View File

@ -0,0 +1,216 @@
package com.qy.utils;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class XMLTools {
private XMLTools() {
}
public static void mergeManifestXML(File src,File src2,File outFile){
try {
SAXReader reader = new SAXReader();
Document manifestDocument = reader.read(src);
Document manifestDocument2 = reader.read(src2);
Element manifestElement = manifestDocument.getRootElement();
Element manifestElement2 = manifestDocument2.getRootElement();
for (Element element : manifestElement2.elements("uses-permission")) {
if(manifestElement.asXML().contains((CharSequence) element.attribute("name").getData())){
continue;
}
manifestElement.add((Element) element.clone());
}
Element application=manifestElement.element("application");
Element application2=manifestElement2.element("application");
for (Element element : application2.elements()) {
if(application.asXML().contains((CharSequence) element.attribute("name").getData())){
continue;
}
application.add((Element) element.clone());
}
manifestElement.remove(application);
manifestElement.add((Element) application.clone());
manifestDocument.remove(manifestElement);
manifestDocument.add((Element) manifestElement.clone());
writeFile4Pretty(outFile,manifestDocument);
System.out.println("AndroidManifest处理完成");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void writeFile4Pretty(File file, Document document) throws IOException {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(document.getXMLEncoding());
XMLWriter writer = new XMLWriter(new FileWriter(file), format);
writer.write(document);
writer.flush();
writer.close();
}
/**
* 合并不同xml文件该方法不能用于合并public.xml
* @param file1 文件1
* @param file2 被合并的文件2
* @param outFile 输出文件
*/
public static void mergeResXML(File file1, File file2, File outFile) {
try {
List<String> list = new ArrayList<>();
List<String> list1 = readXML(file1);
List<String> list2 = readXML(file2);
list.add("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
list.add("<resources>");
list.addAll(list1);
for (String element : list2) {
if (!list.contains(element)) {
list.add(element);
}
}
list.add("</resources>");
FileWriter writer = new FileWriter(outFile);
for (String s : list) {
writer.append(s).append("\n");
}
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 合并public.xml
*
* @param file1 被合并文件以该文件id为主
* @param file2 合并素材
* @param outFile 输出文件
*/
public static void mergePublicXML(File file1, File file2, File outFile) {
try {
//file1中的参数在遍历file2时用来判断是否重复
List<String> list = new ArrayList<>();
//最后输出的xml文件不直接asXML是因为asXML不格式化文件不好看
List<String> main = new ArrayList<>();
SAXReader reader = new SAXReader();
Document document = reader.read(file1);
Document document2 = reader.read(file2);
Element element = document.getRootElement();
Element element2 = document2.getRootElement();
//遍历file1并记录元素
for (Element el : element.elements()) {
list.add(el.attributeValue("type") + "|" + el.attributeValue("name"));
}
//合并file2去重
for (Element el : element2.elements()) {
String tmp = el.attributeValue("type") + "|" + el.attributeValue("name");
if (!list.contains(tmp)) {
element.add((Element) el.clone());
}
}
//分门别类保存不同type下的元素到map
Map<String,List<Element>> map=new HashMap<>();
for (Element el : element.elements()) {
List<Element> elements;
if(map.containsKey(el.attributeValue("type"))){
elements=map.get(el.attributeValue("type"));
}else{
elements=new ArrayList<>();
}
if(!elements.contains(el)){
elements.add(el);
map.put(el.attributeValue("type"),elements);
}
}
main.add("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
main.add("<resources>");
int index=0x7f00;//不同type的值
int nowIndex=Integer.parseInt( Integer.toHexString(index)+"0000",16);//单个元素的值0x7f000000
String nowKey="";
//重新设置id
for (String key : map.keySet()) {
if(!key.equals(nowKey)){
nowKey=key;
index++;
nowIndex=Integer.parseInt( Integer.toHexString(index)+"0000",16);
}
for (Element el : map.get(key)) {
main.add(el.addAttribute("id","0x"+Integer.toHexString(nowIndex++)).asXML());
}
}
main.add("</resources>");
FileWriter writer = new FileWriter(outFile);
for (String s : main) {
writer.append(s).append("\n");
}
//writer.append(element.asXML());
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<String> readXML(File file) {
List<String> list = new ArrayList<>();
try {
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element element = document.getRootElement();
for (Element el : element.elements()) {
list.add(el.asXML());
}
return list;
} catch (Exception e) {
e.printStackTrace();
System.out.println(file.exists());
}
return list;
}
public static void out() {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input\\xml\\tmp.xml"));
Element element = document.getRootElement();
int i = 0x7f0b0026;
for (Element el : element.elements()) {
i++;
String value = "0x" + Integer.toHexString(i);
el = el.addAttribute("id", value);
System.out.println(el.asXML());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
boolean isPublic=true;
if(isPublic) {
mergePublicXML(new File("D:\\ieda\\android_sdk_tools\\EmptyDemo\\res\\values\\public.xml")
, new File("D:\\ieda\\android_sdk_tools\\app-game_op2-release\\res\\values\\public.xml")
, new File("D:\\ieda\\android_sdk_tools\\app-game_op2-release\\res\\values\\public.xml"));
}else {
String fileName = "styles.xml";
mergeResXML(new File("D:\\ieda\\android_sdk_tools\\qztx_agent_115847_baoliang_11027_1003.0.0_20210128_48301\\res\\values\\" + fileName),
new File("D:\\ieda\\android_sdk_tools\\EmptyDemo\\res\\values\\" + fileName),
new File("D:\\ieda\\android_sdk_tools\\qztx_agent_115847_baoliang_11027_1003.0.0_20210128_48301\\res\\values\\" + fileName));
}
/*mergeManifestXML(new File("D:\\ieda\\android_sdk_tools\\三生诀\\AndroidManifest.xml"),
new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\binghu\\AndroidManifest.xml"),
new File("D:\\ieda\\android_sdk_tools\\三生诀\\Manifest.xml"));*/
}
}